Skip to content

Commit 5d18a52

Browse files
authored
fix: overrides entity visibility within drawers (#9546)
When using the `admin.hidden: true` property on a collection, it rightfully removes all navigation and routing for that particular collection. However, this also affects the expected behavior of hidden entities when they are rendered within a drawer, such as the document drawer or list drawer. For example, when creating a new _admin.hidden_ document through the relationship or join field, the drawer should still render the view, despite the underlying route for that view being disabled. This change was a result of the introduction of on-demand server components in #8364, where we now make a server roundtrip to render the view in its entirety, which include the logic that redirects these hidden entities. Now, we pass a new `overrideEntityVisibility` argument through the server function that, when true, skips this step. This way documents can continue to respect `admin.hidden` while also having the ability to override on a case-by-case basis throughout the UI.
1 parent defa13e commit 5d18a52

File tree

21 files changed

+176
-24
lines changed

21 files changed

+176
-24
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const renderDocumentHandler = async (args: {
1919
drawerSlug?: string
2020
initialData?: Data
2121
initialState?: FormState
22+
overrideEntityVisibility?: boolean
2223
redirectAfterDelete: boolean
2324
redirectAfterDuplicate: boolean
2425
req: PayloadRequest
@@ -29,6 +30,7 @@ export const renderDocumentHandler = async (args: {
2930
docID,
3031
drawerSlug,
3132
initialData,
33+
overrideEntityVisibility,
3234
redirectAfterDelete,
3335
redirectAfterDuplicate,
3436
req,
@@ -148,6 +150,7 @@ export const renderDocumentHandler = async (args: {
148150
translations: undefined, // TODO
149151
visibleEntities,
150152
},
153+
overrideEntityVisibility,
151154
params: {
152155
segments: ['collections', collectionSlug, docID],
153156
},

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,14 @@ export const renderDocument = async ({
3333
importMap,
3434
initialData,
3535
initPageResult,
36+
overrideEntityVisibility,
3637
params,
3738
redirectAfterDelete,
3839
redirectAfterDuplicate,
3940
searchParams,
40-
}: AdminViewProps): Promise<{
41+
}: {
42+
overrideEntityVisibility?: boolean
43+
} & AdminViewProps): Promise<{
4144
data: Data
4245
Document: React.ReactNode
4346
}> => {
@@ -168,7 +171,10 @@ export const renderDocument = async ({
168171
}
169172

170173
if (collectionConfig) {
171-
if (!visibleEntities?.collections?.find((visibleSlug) => visibleSlug === collectionSlug)) {
174+
if (
175+
!visibleEntities?.collections?.find((visibleSlug) => visibleSlug === collectionSlug) &&
176+
!overrideEntityVisibility
177+
) {
172178
throw new Error('not-found')
173179
}
174180

packages/next/src/views/List/handleServerFunction.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const renderListHandler = async (args: {
2020
documentDrawerSlug: string
2121
drawerSlug?: string
2222
enableRowSelections: boolean
23+
overrideEntityVisibility?: boolean
2324
query: ListQuery
2425
redirectAfterDelete: boolean
2526
redirectAfterDuplicate: boolean
@@ -32,6 +33,7 @@ export const renderListHandler = async (args: {
3233
disableBulkEdit,
3334
drawerSlug,
3435
enableRowSelections,
36+
overrideEntityVisibility,
3537
query,
3638
redirectAfterDelete,
3739
redirectAfterDuplicate,
@@ -149,6 +151,7 @@ export const renderListHandler = async (args: {
149151
translations: undefined, // TODO
150152
visibleEntities,
151153
},
154+
overrideEntityVisibility,
152155
params: {
153156
segments: ['collections', collectionSlug],
154157
},

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type ListViewArgs = {
2323
disableBulkDelete?: boolean
2424
disableBulkEdit?: boolean
2525
enableRowSelections: boolean
26+
overrideEntityVisibility?: boolean
2627
query: ListQuery
2728
} & AdminViewProps
2829

@@ -39,6 +40,7 @@ export const renderListView = async (
3940
drawerSlug,
4041
enableRowSelections,
4142
initPageResult,
43+
overrideEntityVisibility,
4244
params,
4345
query: queryFromArgs,
4446
searchParams,
@@ -111,7 +113,7 @@ export const renderListView = async (
111113
} = config
112114

113115
if (collectionConfig) {
114-
if (!visibleEntities.collections.includes(collectionSlug)) {
116+
if (!visibleEntities.collections.includes(collectionSlug) && !overrideEntityVisibility) {
115117
throw new Error('not-found')
116118
}
117119

packages/payload/src/admin/views/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { Locale, MetaConfig, PayloadComponent, ServerProps } from '../../co
88
import type { SanitizedGlobalConfig } from '../../globals/config/types.js'
99
import type { PayloadRequest } from '../../types/index.js'
1010
import type { LanguageOptions } from '../LanguageOptions.js'
11-
import type { Data, DocumentSlots, PayloadServerAction } from '../types.js'
11+
import type { Data, DocumentSlots } from '../types.js'
1212

1313
export type AdminViewConfig = {
1414
Component: AdminViewComponent

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,13 @@ export const AddNewRelation: React.FC<Props> = ({
3434
const { permissions } = useAuth()
3535
const [show, setShow] = useState(false)
3636
const [selectedCollection, setSelectedCollection] = useState<string>()
37+
3738
const relatedToMany = relatedCollections.length > 1
39+
3840
const [collectionConfig, setCollectionConfig] = useState<ClientCollectionConfig>(() =>
3941
!relatedToMany ? relatedCollections[0] : undefined,
4042
)
43+
4144
const [popupOpen, setPopupOpen] = useState(false)
4245
const { i18n, t } = useTranslation()
4346
const [showTooltip, setShowTooltip] = useState(false)

packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
2525
onDelete: onDeleteFromProps,
2626
onDuplicate: onDuplicateFromProps,
2727
onSave: onSaveFromProps,
28+
overrideEntityVisibility = true,
2829
redirectAfterDelete,
2930
redirectAfterDuplicate,
3031
}) => {
@@ -64,6 +65,7 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
6465
docID,
6566
drawerSlug,
6667
initialData,
68+
overrideEntityVisibility,
6769
redirectAfterDelete: redirectAfterDelete !== undefined ? redirectAfterDelete : false,
6870
redirectAfterDuplicate:
6971
redirectAfterDuplicate !== undefined ? redirectAfterDuplicate : false,
@@ -92,6 +94,7 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
9294
redirectAfterDuplicate,
9395
renderDocument,
9496
closeModal,
97+
overrideEntityVisibility,
9598
t,
9699
],
97100
)

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,11 @@ export const DocumentDrawer: React.FC<DocumentDrawerProps> = (props) => {
6464
)
6565
}
6666

67-
export const useDocumentDrawer: UseDocumentDrawer = ({ id, collectionSlug }) => {
67+
export const useDocumentDrawer: UseDocumentDrawer = ({
68+
id,
69+
collectionSlug,
70+
overrideEntityVisibility,
71+
}) => {
6872
const editDepth = useEditDepth()
6973
const uuid = useId()
7074
const { closeModal, modalState, openModal, toggleModal } = useModal()
@@ -101,9 +105,10 @@ export const useDocumentDrawer: UseDocumentDrawer = ({ id, collectionSlug }) =>
101105
drawerSlug={drawerSlug}
102106
id={id}
103107
key={drawerSlug}
108+
overrideEntityVisibility={overrideEntityVisibility}
104109
/>
105110
)
106-
}, [id, drawerSlug, collectionSlug])
111+
}, [id, drawerSlug, collectionSlug, overrideEntityVisibility])
107112

108113
const MemoizedDrawerToggler = useMemo(() => {
109114
return (props) => (

packages/ui/src/elements/DocumentDrawer/types.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export type DocumentDrawerProps = {
1313
readonly id?: null | number | string
1414
readonly initialData?: Data
1515
readonly initialState?: FormState
16+
readonly overrideEntityVisibility?: boolean
1617
readonly redirectAfterDelete?: boolean
1718
readonly redirectAfterDuplicate?: boolean
1819
} & Pick<DocumentDrawerContextProps, 'onDelete' | 'onDuplicate' | 'onSave'> &
@@ -28,7 +29,11 @@ export type DocumentTogglerProps = {
2829
readonly onClick?: () => void
2930
} & Readonly<HTMLAttributes<HTMLButtonElement>>
3031

31-
export type UseDocumentDrawer = (args: { collectionSlug: string; id?: number | string }) => [
32+
export type UseDocumentDrawer = (args: {
33+
collectionSlug: string
34+
id?: number | string
35+
overrideEntityVisibility?: boolean
36+
}) => [
3237
React.FC<Omit<DocumentDrawerProps, 'collectionSlug' | 'id'>>, // drawer
3338
React.FC<Omit<DocumentTogglerProps, 'collectionSlug' | 'id'>>, // toggler
3439
{

packages/ui/src/elements/ListDrawer/DrawerContent.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const ListDrawerContent: React.FC<ListDrawerProps> = ({
2222
filterOptions,
2323
onBulkSelect,
2424
onSelect,
25+
overrideEntityVisibility = true,
2526
selectedCollection: selectedCollectionFromProps,
2627
}) => {
2728
const { closeModal, isModalOpen } = useModal()
@@ -86,6 +87,7 @@ export const ListDrawerContent: React.FC<ListDrawerProps> = ({
8687
disableBulkEdit: true,
8788
drawerSlug,
8889
enableRowSelections,
90+
overrideEntityVisibility,
8991
query: newQuery,
9092
},
9193
})) as { List: React.ReactNode }
@@ -100,7 +102,15 @@ export const ListDrawerContent: React.FC<ListDrawerProps> = ({
100102
}
101103
}
102104
},
103-
[serverFunction, closeModal, drawerSlug, isOpen, enableRowSelections, filterOptions],
105+
[
106+
serverFunction,
107+
closeModal,
108+
drawerSlug,
109+
isOpen,
110+
enableRowSelections,
111+
filterOptions,
112+
overrideEntityVisibility,
113+
],
104114
)
105115

106116
useEffect(() => {

0 commit comments

Comments
 (0)