Skip to content

Commit 48e5ee6

Browse files
authored
fix(ui): safely extract text from React nodes (#12419)
1 parent 0c3ff88 commit 48e5ee6

File tree

2 files changed

+2
-33
lines changed

2 files changed

+2
-33
lines changed

packages/ui/src/elements/WhereBuilder/reduceFields.tsx

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import type { ClientField } from 'payload'
44

55
import { getTranslation } from '@payloadcms/translations'
66
import { fieldAffectsData, fieldIsHiddenOrDisabled, fieldIsID, tabHasName } from 'payload/shared'
7-
import { renderToStaticMarkup } from 'react-dom/server'
87

98
import type { ReducedField } from './types.js'
109

@@ -195,15 +194,11 @@ export const reduceFields = ({
195194
})
196195
: localizedLabel
197196

198-
// React elements in filter options are not searchable in React Select
199-
// Extract plain text to make them filterable in dropdowns
200-
const textFromLabel = extractTextFromReactNode(formattedLabel)
201-
202197
const fieldPath = pathPrefix ? createNestedClientFieldPath(pathPrefix, field) : field.name
203198

204199
const formattedField: ReducedField = {
205200
label: formattedLabel,
206-
plainTextLabel: textFromLabel,
201+
plainTextLabel: `${labelPrefix ? labelPrefix + ' > ' : ''}${localizedLabel}`,
207202
value: fieldPath,
208203
...fieldTypes[field.type],
209204
field,
@@ -216,29 +211,3 @@ export const reduceFields = ({
216211
return reduced
217212
}, [])
218213
}
219-
220-
/**
221-
* Extracts plain text content from a React node by removing HTML tags.
222-
* Used to make React elements searchable in filter dropdowns.
223-
*/
224-
const extractTextFromReactNode = (reactNode: React.ReactNode): string => {
225-
if (!reactNode) {
226-
return ''
227-
}
228-
if (typeof reactNode === 'string') {
229-
return reactNode
230-
}
231-
232-
const html = renderToStaticMarkup(reactNode)
233-
234-
// Handle different environments (server vs browser)
235-
if (typeof document !== 'undefined') {
236-
// Browser environment - use actual DOM
237-
const div = document.createElement('div')
238-
div.innerHTML = html
239-
return div.textContent || ''
240-
} else {
241-
// Server environment - use regex to strip HTML tags
242-
return html.replace(/<[^>]*>/g, '')
243-
}
244-
}

tsconfig.base.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
}
3232
],
3333
"paths": {
34-
"@payload-config": ["./test/_community/config.ts"],
34+
"@payload-config": ["./test/access-control/config.ts"],
3535
"@payloadcms/admin-bar": ["./packages/admin-bar/src"],
3636
"@payloadcms/live-preview": ["./packages/live-preview/src"],
3737
"@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"],

0 commit comments

Comments
 (0)