@@ -17,7 +17,13 @@ import {
17
17
type SanitizedFieldPermissions ,
18
18
type VersionField ,
19
19
} from 'payload'
20
- import { fieldIsID , fieldShouldBeLocalized , getUniqueListBy , tabHasName } from 'payload/shared'
20
+ import {
21
+ fieldIsID ,
22
+ fieldShouldBeLocalized ,
23
+ getFieldPermissions ,
24
+ getUniqueListBy ,
25
+ tabHasName ,
26
+ } from 'payload/shared'
21
27
22
28
import { diffComponents } from './fields/index.js'
23
29
import { getFieldPathsModified } from './utilities/getFieldPathsModified.js'
@@ -223,21 +229,16 @@ const buildVersionField = ({
223
229
BuildVersionFieldsArgs ,
224
230
'fields' | 'parentIndexPath' | 'versionFromSiblingData' | 'versionToSiblingData'
225
231
> ) : BaseVersionField | null => {
226
- const fieldName : null | string = 'name' in field ? field . name : null
227
-
228
- const hasPermission =
229
- fieldPermissions === true ||
230
- ! fieldName ||
231
- fieldPermissions ?. [ fieldName ] === true ||
232
- fieldPermissions ?. [ fieldName ] ?. read
233
-
234
- const subFieldPermissions =
235
- fieldPermissions === true ||
236
- ! fieldName ||
237
- fieldPermissions ?. [ fieldName ] === true ||
238
- fieldPermissions ?. [ fieldName ] ?. fields
232
+ const { permissions, read : hasReadPermission } = getFieldPermissions ( {
233
+ field,
234
+ operation : 'read' ,
235
+ parentName : parentPath ?. includes ( '.' )
236
+ ? parentPath . split ( '.' ) [ parentPath . split ( '.' ) . length - 1 ]
237
+ : parentPath ,
238
+ permissions : fieldPermissions ,
239
+ } )
239
240
240
- if ( ! hasPermission ) {
241
+ if ( ! hasReadPermission ) {
241
242
return null
242
243
}
243
244
@@ -292,13 +293,29 @@ const buildVersionField = ({
292
293
parentPath,
293
294
parentSchemaPath,
294
295
} )
296
+
297
+ let tabPermissions : typeof fieldPermissions = undefined
298
+
299
+ if ( typeof permissions === 'boolean' ) {
300
+ tabPermissions = permissions
301
+ } else if ( permissions && typeof permissions === 'object' ) {
302
+ if ( 'name' in tab ) {
303
+ tabPermissions =
304
+ typeof permissions . fields ?. [ tab . name ] === 'object'
305
+ ? permissions . fields ?. [ tab . name ] . fields
306
+ : permissions . fields ?. [ tab . name ]
307
+ } else {
308
+ tabPermissions = permissions . fields
309
+ }
310
+ }
311
+
295
312
const tabVersion = {
296
313
name : 'name' in tab ? tab . name : null ,
297
314
fields : buildVersionFields ( {
298
315
clientSchemaMap,
299
316
customDiffComponents,
300
317
entitySlug,
301
- fieldPermissions,
318
+ fieldPermissions : tabPermissions ,
302
319
fields : tab . fields ,
303
320
i18n,
304
321
modifiedOnly,
@@ -324,6 +341,13 @@ const buildVersionField = ({
324
341
}
325
342
} // At this point, we are dealing with a `row`, `collapsible`, etc
326
343
else if ( 'fields' in field ) {
344
+ let subfieldPermissions : typeof fieldPermissions = undefined
345
+
346
+ if ( typeof permissions === 'boolean' ) {
347
+ subfieldPermissions = permissions
348
+ } else if ( permissions && typeof permissions === 'object' ) {
349
+ subfieldPermissions = permissions . fields
350
+ }
327
351
if ( field . type === 'array' && ( valueTo || valueFrom ) ) {
328
352
const maxLength = Math . max (
329
353
Array . isArray ( valueTo ) ? valueTo . length : 0 ,
@@ -339,7 +363,7 @@ const buildVersionField = ({
339
363
clientSchemaMap,
340
364
customDiffComponents,
341
365
entitySlug,
342
- fieldPermissions,
366
+ fieldPermissions : subfieldPermissions ,
343
367
fields : field . fields ,
344
368
i18n,
345
369
modifiedOnly,
@@ -363,7 +387,7 @@ const buildVersionField = ({
363
387
clientSchemaMap,
364
388
customDiffComponents,
365
389
entitySlug,
366
- fieldPermissions,
390
+ fieldPermissions : subfieldPermissions ,
367
391
fields : field . fields ,
368
392
i18n,
369
393
modifiedOnly,
@@ -421,11 +445,24 @@ const buildVersionField = ({
421
445
}
422
446
}
423
447
448
+ let blockPermissions : typeof fieldPermissions = undefined
449
+
450
+ if ( permissions === true ) {
451
+ blockPermissions = true
452
+ } else {
453
+ const permissionsBlockSpecific = permissions ?. blocks ?. [ blockSlugToMatch ]
454
+ if ( permissionsBlockSpecific === true ) {
455
+ blockPermissions = true
456
+ } else {
457
+ blockPermissions = permissionsBlockSpecific ?. fields
458
+ }
459
+ }
460
+
424
461
baseVersionField . rows [ i ] = buildVersionFields ( {
425
462
clientSchemaMap,
426
463
customDiffComponents,
427
464
entitySlug,
428
- fieldPermissions,
465
+ fieldPermissions : blockPermissions ,
429
466
fields,
430
467
i18n,
431
468
modifiedOnly,
@@ -459,7 +496,7 @@ const buildVersionField = ({
459
496
*/
460
497
diffMethod : 'diffWordsWithSpace' ,
461
498
field : clientField ,
462
- fieldPermissions : subFieldPermissions ,
499
+ fieldPermissions : typeof permissions === 'object' ? permissions . fields : permissions ,
463
500
parentIsLocalized,
464
501
465
502
nestingLevel : nestingLevel ? nestingLevel : undefined ,
0 commit comments