Skip to content

Commit 2df8f94

Browse files
authored
fix(plugin-search): issues with overriding the search collection slug consistently across hooks (#8847)
Fixes #8842
1 parent e72e81c commit 2df8f94

File tree

7 files changed

+60
-32
lines changed

7 files changed

+60
-32
lines changed

packages/plugin-search/src/Search/hooks/deleteFromSearch.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import type { CollectionAfterDeleteHook } from 'payload'
1+
import type { DeleteFromSearch } from '../../types.js'
22

3-
export const deleteFromSearch: CollectionAfterDeleteHook = async ({
3+
export const deleteFromSearch: DeleteFromSearch = async ({
44
doc,
5+
pluginConfig,
56
req: { payload },
67
req,
78
}) => {
9+
const searchSlug = pluginConfig?.searchOverrides?.slug || 'search'
810
try {
911
const searchDocQuery = await payload.find({
10-
collection: 'search',
12+
collection: searchSlug,
1113
depth: 0,
1214
req,
1315
where: {
@@ -20,14 +22,14 @@ export const deleteFromSearch: CollectionAfterDeleteHook = async ({
2022
if (searchDocQuery?.docs?.[0]) {
2123
await payload.delete({
2224
id: searchDocQuery?.docs?.[0]?.id,
23-
collection: 'search',
25+
collection: searchSlug,
2426
req,
2527
})
2628
}
2729
} catch (err: unknown) {
2830
payload.logger.error({
2931
err,
30-
msg: `Error deleting search doc.`,
32+
msg: `Error deleting ${searchSlug} doc.`,
3133
})
3234
}
3335

packages/plugin-search/src/Search/hooks/syncWithSearch.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
1212

1313
const { id, _status: status, title } = doc || {}
1414

15-
const { beforeSync, defaultPriorities, deleteDrafts, syncDrafts } = pluginConfig
15+
const { beforeSync, defaultPriorities, deleteDrafts, searchOverrides, syncDrafts } = pluginConfig
16+
17+
const searchSlug = searchOverrides?.slug || 'search'
1618

1719
let dataToSave: DocToSync = {
1820
doc: {
@@ -50,7 +52,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
5052
} catch (err: unknown) {
5153
payload.logger.error(err)
5254
payload.logger.error(
53-
`Error gathering default priority for search documents related to ${collection}`,
55+
`Error gathering default priority for ${searchSlug} documents related to ${collection}`,
5456
)
5557
}
5658
} else {
@@ -64,7 +66,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
6466
if (operation === 'create') {
6567
if (doSync) {
6668
await payload.create({
67-
collection: 'search',
69+
collection: searchSlug,
6870
data: {
6971
...dataToSave,
7072
priority: defaultPriority,
@@ -78,7 +80,7 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
7880
try {
7981
// find the correct doc to sync with
8082
const searchDocQuery = await payload.find({
81-
collection: 'search',
83+
collection: searchSlug,
8284
depth: 0,
8385
req,
8486
where: {
@@ -104,12 +106,12 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
104106
try {
105107
const duplicativeDocIDs = duplicativeDocs.map(({ id }) => id)
106108
await payload.delete({
107-
collection: 'search',
109+
collection: searchSlug,
108110
req,
109111
where: { id: { in: duplicativeDocIDs } },
110112
})
111113
} catch (err: unknown) {
112-
payload.logger.error(`Error deleting duplicative search documents.`)
114+
payload.logger.error(`Error deleting duplicative ${searchSlug} documents.`)
113115
}
114116
}
115117

@@ -121,51 +123,51 @@ export const syncWithSearch: SyncWithSearch = async (args) => {
121123
try {
122124
await payload.update({
123125
id: searchDocID,
124-
collection: 'search',
126+
collection: searchSlug,
125127
data: {
126128
...dataToSave,
127129
priority: foundDoc.priority || defaultPriority,
128130
},
129131
req,
130132
})
131133
} catch (err: unknown) {
132-
payload.logger.error(`Error updating search document.`)
134+
payload.logger.error(`Error updating ${searchSlug} document.`)
133135
}
134136
}
135137
if (deleteDrafts && status === 'draft') {
136138
// do not include draft docs in search results, so delete the record
137139
try {
138140
await payload.delete({
139141
id: searchDocID,
140-
collection: 'search',
142+
collection: searchSlug,
141143
req,
142144
})
143145
} catch (err: unknown) {
144-
payload.logger.error({ err, msg: `Error deleting search document.` })
146+
payload.logger.error({ err, msg: `Error deleting ${searchSlug} document.` })
145147
}
146148
}
147149
} else if (doSync) {
148150
try {
149151
await payload.create({
150-
collection: 'search',
152+
collection: searchSlug,
151153
data: {
152154
...dataToSave,
153155
priority: defaultPriority,
154156
},
155157
req,
156158
})
157159
} catch (err: unknown) {
158-
payload.logger.error({ err, msg: `Error creating search document.` })
160+
payload.logger.error({ err, msg: `Error creating ${searchSlug} document.` })
159161
}
160162
}
161163
} catch (err: unknown) {
162-
payload.logger.error({ err, msg: `Error finding search document.` })
164+
payload.logger.error({ err, msg: `Error finding ${searchSlug} document.` })
163165
}
164166
}
165167
} catch (err: unknown) {
166168
payload.logger.error({
167169
err,
168-
msg: `Error syncing search document related to ${collection} with id: '${id}'.`,
170+
msg: `Error syncing ${searchSlug} document related to ${collection} with id: '${id}'.`,
169171
})
170172
}
171173

packages/plugin-search/src/Search/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ export const generateSearchCollection = (pluginConfig: SearchPluginConfig): Coll
3636
type: 'ui',
3737
admin: {
3838
components: {
39-
Field: '@payloadcms/plugin-search/client#LinkToDoc',
39+
Field: {
40+
path: '@payloadcms/plugin-search/client#LinkToDoc',
41+
},
4042
},
4143
position: 'sidebar',
4244
},

packages/plugin-search/src/Search/ui/index.client.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { useConfig } from '@payloadcms/ui'
3+
import { useConfig, useField } from '@payloadcms/ui'
44
import { formatAdminURL } from '@payloadcms/ui/shared'
55
import React from 'react'
66
// TODO: fix this import to work in dev mode within the monorepo in a way that is backwards compatible with 1.x
@@ -16,13 +16,19 @@ export const LinkToDocClient: React.FC = () => {
1616
serverURL,
1717
} = config
1818

19+
const { value } = useField<{ relationTo?: string; value?: string }>({ path: 'doc' })
20+
1921
const href = `${serverURL}${formatAdminURL({
2022
adminRoute,
21-
path: '/collections/${relationTo}/${docId}',
23+
path: `/collections/${value.relationTo || ''}/${value.value || ''}`,
2224
})}`
2325

26+
if (!value.relationTo || !value.value) {
27+
return null
28+
}
29+
2430
return (
25-
<div>
31+
<div style={{ marginBottom: 'var(--spacing-field, 1rem)' }}>
2632
<div>
2733
<span
2834
className="label"
@@ -41,7 +47,9 @@ export const LinkToDocClient: React.FC = () => {
4147
textOverflow: 'ellipsis',
4248
}}
4349
>
44-
<a href={href}>{href}</a>
50+
<a href={href} target="_blank">
51+
{href}
52+
</a>
4553
</div>
4654
</div>
4755
)

packages/plugin-search/src/Search/ui/index.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,5 @@ import React from 'react'
55
import { LinkToDocClient } from './index.client.js'
66

77
export const LinkToDoc: React.FC<UIField> = () => {
8-
return (
9-
<div>
10-
<LinkToDocClient />
11-
</div>
12-
)
8+
return <LinkToDocClient />
139
}

packages/plugin-search/src/index.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import type { Config } from 'payload'
1+
import type { CollectionAfterChangeHook, CollectionAfterDeleteHook, Config } from 'payload'
22

33
import type { SearchPluginConfig } from './types.js'
44

55
import { deleteFromSearch } from './Search/hooks/deleteFromSearch.js'
66
import { syncWithSearch } from './Search/hooks/syncWithSearch.js'
77
import { generateSearchCollection } from './Search/index.js'
88

9+
type CollectionAfterChangeHookArgs = Parameters<CollectionAfterChangeHook>[0]
10+
type CollectionAfterDeleteHookArgs = Parameters<CollectionAfterDeleteHook>[0]
11+
912
export const searchPlugin =
1013
(incomingPluginConfig: SearchPluginConfig) =>
1114
(config: Config): Config => {
@@ -33,15 +36,23 @@ export const searchPlugin =
3336
...collection.hooks,
3437
afterChange: [
3538
...(existingHooks?.afterChange || []),
36-
async (args: any) => {
39+
async (args: CollectionAfterChangeHookArgs) => {
3740
await syncWithSearch({
3841
...args,
3942
collection: collection.slug,
4043
pluginConfig,
4144
})
4245
},
4346
],
44-
afterDelete: [...(existingHooks?.afterDelete || []), deleteFromSearch],
47+
afterDelete: [
48+
...(existingHooks?.afterDelete || []),
49+
async (args: CollectionAfterDeleteHookArgs) => {
50+
await deleteFromSearch({
51+
...args,
52+
pluginConfig,
53+
})
54+
},
55+
],
4556
},
4657
}
4758
}

packages/plugin-search/src/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
CollectionAfterChangeHook,
3+
CollectionAfterDeleteHook,
34
CollectionConfig,
45
Field,
56
Payload,
@@ -45,3 +46,9 @@ export type SyncWithSearch = (
4546
pluginConfig: SearchPluginConfig
4647
} & Omit<Parameters<CollectionAfterChangeHook>[0], 'collection'>,
4748
) => ReturnType<CollectionAfterChangeHook>
49+
50+
export type DeleteFromSearch = (
51+
Args: {
52+
pluginConfig: SearchPluginConfig
53+
} & Omit<Parameters<CollectionAfterDeleteHook>[0], 'collection'>,
54+
) => ReturnType<CollectionAfterDeleteHook>

0 commit comments

Comments
 (0)