@wordpress/dataviews 4.9.0 → 4.9.1-next.a9f418477.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +16 -39
  3. package/build/components/dataviews/index.js +2 -3
  4. package/build/components/dataviews/index.js.map +1 -1
  5. package/build/components/dataviews-context/index.js +1 -2
  6. package/build/components/dataviews-context/index.js.map +1 -1
  7. package/build/components/dataviews-item-actions/index.js +21 -20
  8. package/build/components/dataviews-item-actions/index.js.map +1 -1
  9. package/build/components/dataviews-selection-checkbox/index.js +3 -3
  10. package/build/components/dataviews-selection-checkbox/index.js.map +1 -1
  11. package/build/components/dataviews-view-config/index.js +191 -126
  12. package/build/components/dataviews-view-config/index.js.map +1 -1
  13. package/build/dataviews-layouts/grid/index.js +88 -64
  14. package/build/dataviews-layouts/grid/index.js.map +1 -1
  15. package/build/dataviews-layouts/index.js +0 -60
  16. package/build/dataviews-layouts/index.js.map +1 -1
  17. package/build/dataviews-layouts/list/index.js +30 -13
  18. package/build/dataviews-layouts/list/index.js.map +1 -1
  19. package/build/dataviews-layouts/table/column-header-menu.js +19 -24
  20. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -1
  21. package/build/dataviews-layouts/table/column-primary.js +55 -0
  22. package/build/dataviews-layouts/table/column-primary.js.map +1 -0
  23. package/build/dataviews-layouts/table/index.js +73 -83
  24. package/build/dataviews-layouts/table/index.js.map +1 -1
  25. package/build/dataviews-layouts/utils/get-clickable-item-props.js +15 -4
  26. package/build/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -1
  27. package/build/types.js.map +1 -1
  28. package/build-module/components/dataviews/index.js +2 -3
  29. package/build-module/components/dataviews/index.js.map +1 -1
  30. package/build-module/components/dataviews-context/index.js +1 -2
  31. package/build-module/components/dataviews-context/index.js.map +1 -1
  32. package/build-module/components/dataviews-item-actions/index.js +21 -20
  33. package/build-module/components/dataviews-item-actions/index.js.map +1 -1
  34. package/build-module/components/dataviews-selection-checkbox/index.js +3 -3
  35. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -1
  36. package/build-module/components/dataviews-view-config/index.js +195 -130
  37. package/build-module/components/dataviews-view-config/index.js.map +1 -1
  38. package/build-module/dataviews-layouts/grid/index.js +89 -65
  39. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  40. package/build-module/dataviews-layouts/index.js +0 -57
  41. package/build-module/dataviews-layouts/index.js.map +1 -1
  42. package/build-module/dataviews-layouts/list/index.js +30 -13
  43. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  44. package/build-module/dataviews-layouts/table/column-header-menu.js +19 -24
  45. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -1
  46. package/build-module/dataviews-layouts/table/column-primary.js +48 -0
  47. package/build-module/dataviews-layouts/table/column-primary.js.map +1 -0
  48. package/build-module/dataviews-layouts/table/index.js +76 -86
  49. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  50. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js +15 -4
  51. package/build-module/dataviews-layouts/utils/get-clickable-item-props.js.map +1 -1
  52. package/build-module/types.js.map +1 -1
  53. package/build-style/style-rtl.css +68 -65
  54. package/build-style/style.css +68 -65
  55. package/build-types/components/dataviews/index.d.ts.map +1 -1
  56. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  57. package/build-types/components/dataviews/stories/index.story.d.ts +0 -1
  58. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -1
  59. package/build-types/components/dataviews-context/index.d.ts +1 -1
  60. package/build-types/components/dataviews-context/index.d.ts.map +1 -1
  61. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -1
  62. package/build-types/components/dataviews-selection-checkbox/index.d.ts +2 -2
  63. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -1
  64. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -1
  65. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  66. package/build-types/dataviews-layouts/index.d.ts +0 -4
  67. package/build-types/dataviews-layouts/index.d.ts.map +1 -1
  68. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  69. package/build-types/dataviews-layouts/table/column-header-menu.d.ts +1 -0
  70. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -1
  71. package/build-types/dataviews-layouts/table/column-primary.d.ts +14 -0
  72. package/build-types/dataviews-layouts/table/column-primary.d.ts.map +1 -0
  73. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  74. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts +9 -4
  75. package/build-types/dataviews-layouts/utils/get-clickable-item-props.d.ts.map +1 -1
  76. package/build-types/lock-unlock.d.ts +1 -1
  77. package/build-types/lock-unlock.d.ts.map +1 -1
  78. package/build-types/types.d.ts +21 -40
  79. package/build-types/types.d.ts.map +1 -1
  80. package/build-wp/index.js +14820 -0
  81. package/build.js +40 -0
  82. package/package.json +28 -11
  83. package/src/components/dataviews/index.tsx +2 -3
  84. package/src/components/dataviews/stories/fixtures.tsx +0 -3
  85. package/src/components/dataviews/stories/index.story.tsx +14 -106
  86. package/src/components/dataviews/style.scss +33 -33
  87. package/src/components/dataviews-context/index.ts +2 -3
  88. package/src/components/dataviews-item-actions/index.tsx +30 -25
  89. package/src/components/dataviews-selection-checkbox/index.tsx +4 -4
  90. package/src/components/dataviews-view-config/index.tsx +291 -193
  91. package/src/components/dataviews-view-config/style.scss +9 -0
  92. package/src/dataviews-layouts/grid/index.tsx +116 -99
  93. package/src/dataviews-layouts/grid/style.scss +15 -24
  94. package/src/dataviews-layouts/index.ts +0 -88
  95. package/src/dataviews-layouts/list/index.tsx +48 -30
  96. package/src/dataviews-layouts/table/column-header-menu.tsx +94 -86
  97. package/src/dataviews-layouts/table/column-primary.tsx +58 -0
  98. package/src/dataviews-layouts/table/index.tsx +89 -134
  99. package/src/dataviews-layouts/table/style.scss +4 -0
  100. package/src/dataviews-layouts/utils/get-clickable-item-props.ts +22 -9
  101. package/src/types.ts +22 -47
  102. package/tsconfig.tsbuildinfo +1 -1
@@ -23,29 +23,27 @@ import {
23
23
  __experimentalText as Text,
24
24
  privateApis as componentsPrivateApis,
25
25
  BaseControl,
26
+ Icon,
26
27
  } from '@wordpress/components';
27
28
  import { __, _x, sprintf } from '@wordpress/i18n';
28
29
  import { memo, useContext, useMemo } from '@wordpress/element';
29
- import { chevronDown, chevronUp, cog, seen, unseen } from '@wordpress/icons';
30
+ import {
31
+ chevronDown,
32
+ chevronUp,
33
+ cog,
34
+ seen,
35
+ unseen,
36
+ lock,
37
+ } from '@wordpress/icons';
30
38
  import warning from '@wordpress/warning';
31
39
  import { useInstanceId } from '@wordpress/compose';
32
40
 
33
41
  /**
34
42
  * Internal dependencies
35
43
  */
36
- import {
37
- SORTING_DIRECTIONS,
38
- LAYOUT_TABLE,
39
- sortIcons,
40
- sortLabels,
41
- } from '../../constants';
42
- import {
43
- VIEW_LAYOUTS,
44
- getNotHidableFieldIds,
45
- getVisibleFieldIds,
46
- getHiddenFieldIds,
47
- } from '../../dataviews-layouts';
48
- import type { SupportedLayouts, View, Field } from '../../types';
44
+ import { SORTING_DIRECTIONS, sortIcons, sortLabels } from '../../constants';
45
+ import { VIEW_LAYOUTS } from '../../dataviews-layouts';
46
+ import type { NormalizedField, SupportedLayouts, View } from '../../types';
49
47
  import DataViewsContext from '../dataviews-context';
50
48
  import { unlock } from '../../lock-unlock';
51
49
 
@@ -93,8 +91,13 @@ function ViewTypeMenu( {
93
91
  case 'list':
94
92
  case 'grid':
95
93
  case 'table':
94
+ const viewWithoutLayout = { ...view };
95
+ if ( 'layout' in viewWithoutLayout ) {
96
+ delete viewWithoutLayout.layout;
97
+ }
98
+ // @ts-expect-error
96
99
  return onChangeView( {
97
- ...view,
100
+ ...viewWithoutLayout,
98
101
  type: e.target.value,
99
102
  ...defaultLayouts[ e.target.value ],
100
103
  } );
@@ -237,236 +240,331 @@ function ItemsPerPageControl() {
237
240
  );
238
241
  }
239
242
 
240
- interface FieldItemProps {
241
- id: any;
242
- label: string;
243
- index: number;
244
- isVisible: boolean;
245
- isHidable: boolean;
246
- }
247
-
248
243
  function FieldItem( {
249
- field: { id, label, index, isVisible, isHidable },
250
- fields,
251
- view,
252
- onChangeView,
244
+ field,
245
+ isVisible,
246
+ isFirst,
247
+ isLast,
248
+ canMove = true,
249
+ onToggleVisibility,
250
+ onMoveUp,
251
+ onMoveDown,
253
252
  }: {
254
- field: FieldItemProps;
255
- fields: Field< any >[];
256
- view: View;
257
- onChangeView: ( view: View ) => void;
253
+ field: NormalizedField< any >;
254
+ isVisible: boolean;
255
+ isFirst?: boolean;
256
+ isLast?: boolean;
257
+ canMove?: boolean;
258
+ onToggleVisibility?: () => void;
259
+ onMoveUp?: () => void;
260
+ onMoveDown?: () => void;
258
261
  } ) {
259
- const visibleFieldIds = getVisibleFieldIds( view, fields );
262
+ const focusVisibilityField = () => {
263
+ // Focus the visibility button to avoid focus loss.
264
+ // Our code is safe against the component being unmounted, so we don't need to worry about cleaning the timeout.
265
+ // eslint-disable-next-line @wordpress/react-no-unsafe-timeout
266
+ setTimeout( () => {
267
+ const element = document.querySelector(
268
+ `.dataviews-field-control__field-${ field.id } .dataviews-field-control__field-visibility-button`
269
+ );
270
+ if ( element instanceof HTMLElement ) {
271
+ element.focus();
272
+ }
273
+ }, 50 );
274
+ };
260
275
 
261
276
  return (
262
- <Item key={ id }>
277
+ <Item>
263
278
  <HStack
264
279
  expanded
265
- className={ `dataviews-field-control__field dataviews-field-control__field-${ id }` }
280
+ className={ `dataviews-field-control__field dataviews-field-control__field-${ field.id }` }
281
+ justify="flex-start"
266
282
  >
267
- <span>{ label }</span>
283
+ <span className="dataviews-field-control__icon">
284
+ { ! canMove && ! field.enableHiding && (
285
+ <Icon icon={ lock } />
286
+ ) }
287
+ </span>
288
+ <span className="dataviews-field-control__label">
289
+ { field.label }
290
+ </span>
268
291
  <HStack
269
292
  justify="flex-end"
270
293
  expanded={ false }
271
294
  className="dataviews-field-control__actions"
272
295
  >
273
- { view.type === LAYOUT_TABLE && isVisible && (
296
+ { isVisible && (
274
297
  <>
275
298
  <Button
276
- disabled={ index < 1 }
299
+ disabled={ isFirst || ! canMove }
277
300
  accessibleWhenDisabled
278
301
  size="compact"
279
- onClick={ () => {
280
- onChangeView( {
281
- ...view,
282
- fields: [
283
- ...( visibleFieldIds.slice(
284
- 0,
285
- index - 1
286
- ) ?? [] ),
287
- id,
288
- visibleFieldIds[ index - 1 ],
289
- ...visibleFieldIds.slice(
290
- index + 1
291
- ),
292
- ],
293
- } );
294
- } }
302
+ onClick={ onMoveUp }
295
303
  icon={ chevronUp }
296
- label={ sprintf(
297
- /* translators: %s: field label */
298
- __( 'Move %s up' ),
299
- label
300
- ) }
304
+ label={
305
+ isFirst || ! canMove
306
+ ? __( "This field can't be moved up" )
307
+ : sprintf(
308
+ /* translators: %s: field label */
309
+ __( 'Move %s up' ),
310
+ field.label
311
+ )
312
+ }
301
313
  />
302
314
  <Button
303
- disabled={ index >= visibleFieldIds.length - 1 }
315
+ disabled={ isLast || ! canMove }
304
316
  accessibleWhenDisabled
305
317
  size="compact"
306
- onClick={ () => {
307
- onChangeView( {
308
- ...view,
309
- fields: [
310
- ...( visibleFieldIds.slice(
311
- 0,
312
- index
313
- ) ?? [] ),
314
- visibleFieldIds[ index + 1 ],
315
- id,
316
- ...visibleFieldIds.slice(
317
- index + 2
318
- ),
319
- ],
320
- } );
321
- } }
318
+ onClick={ onMoveDown }
322
319
  icon={ chevronDown }
323
- label={ sprintf(
324
- /* translators: %s: field label */
325
- __( 'Move %s down' ),
326
- label
327
- ) }
328
- />{ ' ' }
320
+ label={
321
+ isLast || ! canMove
322
+ ? __( "This field can't be moved down" )
323
+ : sprintf(
324
+ /* translators: %s: field label */
325
+ __( 'Move %s down' ),
326
+ field.label
327
+ )
328
+ }
329
+ />
329
330
  </>
330
331
  ) }
331
- <Button
332
- className="dataviews-field-control__field-visibility-button"
333
- disabled={ ! isHidable }
334
- accessibleWhenDisabled
335
- size="compact"
336
- onClick={ () => {
337
- onChangeView( {
338
- ...view,
339
- fields: isVisible
340
- ? visibleFieldIds.filter(
341
- ( fieldId ) => fieldId !== id
332
+ { onToggleVisibility && (
333
+ <Button
334
+ className="dataviews-field-control__field-visibility-button"
335
+ disabled={ ! field.enableHiding }
336
+ accessibleWhenDisabled
337
+ size="compact"
338
+ onClick={ () => {
339
+ onToggleVisibility();
340
+ focusVisibilityField();
341
+ } }
342
+ icon={ isVisible ? unseen : seen }
343
+ label={
344
+ isVisible
345
+ ? sprintf(
346
+ /* translators: %s: field label */
347
+ _x( 'Hide %s', 'field' ),
348
+ field.label
342
349
  )
343
- : [ ...visibleFieldIds, id ],
344
- } );
345
- // Focus the visibility button to avoid focus loss.
346
- // Our code is safe against the component being unmounted, so we don't need to worry about cleaning the timeout.
347
- // eslint-disable-next-line @wordpress/react-no-unsafe-timeout
348
- setTimeout( () => {
349
- const element = document.querySelector(
350
- `.dataviews-field-control__field-${ id } .dataviews-field-control__field-visibility-button`
351
- );
352
- if ( element instanceof HTMLElement ) {
353
- element.focus();
354
- }
355
- }, 50 );
356
- } }
357
- icon={ isVisible ? unseen : seen }
358
- label={
359
- isVisible
360
- ? sprintf(
361
- /* translators: %s: field label */
362
- _x( 'Hide %s', 'field' ),
363
- label
364
- )
365
- : sprintf(
366
- /* translators: %s: field label */
367
- _x( 'Show %s', 'field' ),
368
- label
369
- )
370
- }
371
- />
350
+ : sprintf(
351
+ /* translators: %s: field label */
352
+ _x( 'Show %s', 'field' ),
353
+ field.label
354
+ )
355
+ }
356
+ />
357
+ ) }
372
358
  </HStack>
373
359
  </HStack>
374
360
  </Item>
375
361
  );
376
362
  }
377
363
 
378
- function FieldControl() {
379
- const { view, fields, onChangeView } = useContext( DataViewsContext );
364
+ function RegularFieldItem( {
365
+ index,
366
+ field,
367
+ view,
368
+ onChangeView,
369
+ }: {
370
+ index?: number;
371
+ field: NormalizedField< any >;
372
+ view: View;
373
+ onChangeView: ( view: View ) => void;
374
+ } ) {
375
+ const visibleFieldIds = view.fields ?? [];
376
+ const isVisible =
377
+ index !== undefined && visibleFieldIds.includes( field.id );
380
378
 
381
- const visibleFieldIds = useMemo(
382
- () => getVisibleFieldIds( view, fields ),
383
- [ view, fields ]
384
- );
385
- const hiddenFieldIds = useMemo(
386
- () => getHiddenFieldIds( view, fields ),
387
- [ view, fields ]
388
- );
389
- const notHidableFieldIds = useMemo(
390
- () => getNotHidableFieldIds( view ),
391
- [ view ]
379
+ return (
380
+ <FieldItem
381
+ field={ field }
382
+ isVisible={ isVisible }
383
+ isFirst={ index !== undefined && index < 1 }
384
+ isLast={
385
+ index !== undefined && index === visibleFieldIds.length - 1
386
+ }
387
+ onToggleVisibility={ () => {
388
+ onChangeView( {
389
+ ...view,
390
+ fields: isVisible
391
+ ? visibleFieldIds.filter(
392
+ ( fieldId ) => fieldId !== field.id
393
+ )
394
+ : [ ...visibleFieldIds, field.id ],
395
+ } );
396
+ } }
397
+ onMoveUp={
398
+ index !== undefined
399
+ ? () => {
400
+ onChangeView( {
401
+ ...view,
402
+ fields: [
403
+ ...( visibleFieldIds.slice(
404
+ 0,
405
+ index - 1
406
+ ) ?? [] ),
407
+ field.id,
408
+ visibleFieldIds[ index - 1 ],
409
+ ...visibleFieldIds.slice( index + 1 ),
410
+ ],
411
+ } );
412
+ }
413
+ : undefined
414
+ }
415
+ onMoveDown={
416
+ index !== undefined
417
+ ? () => {
418
+ onChangeView( {
419
+ ...view,
420
+ fields: [
421
+ ...( visibleFieldIds.slice( 0, index ) ??
422
+ [] ),
423
+ visibleFieldIds[ index + 1 ],
424
+ field.id,
425
+ ...visibleFieldIds.slice( index + 2 ),
426
+ ],
427
+ } );
428
+ }
429
+ : undefined
430
+ }
431
+ />
392
432
  );
433
+ }
393
434
 
394
- const visibleFields = fields
395
- .filter( ( { id } ) => visibleFieldIds.includes( id ) )
396
- .map( ( { id, label, enableHiding } ) => {
397
- return {
398
- id,
399
- label,
400
- index: visibleFieldIds.indexOf( id ),
401
- isVisible: true,
402
- isHidable: notHidableFieldIds.includes( id )
403
- ? false
404
- : enableHiding,
405
- };
406
- } );
407
- if ( view.type === LAYOUT_TABLE && view.layout?.combinedFields ) {
408
- view.layout.combinedFields.forEach( ( { id, label } ) => {
409
- visibleFields.push( {
410
- id,
411
- label,
412
- index: visibleFieldIds.indexOf( id ),
413
- isVisible: true,
414
- isHidable: notHidableFieldIds.includes( id ),
415
- } );
416
- } );
417
- }
418
- visibleFields.sort( ( a, b ) => a.index - b.index );
435
+ function isDefined< T >( item: T | undefined ): item is T {
436
+ return !! item;
437
+ }
419
438
 
420
- const hiddenFields = fields
421
- .filter( ( { id } ) => hiddenFieldIds.includes( id ) )
422
- .map( ( { id, label, enableHiding }, index ) => {
423
- return {
424
- id,
425
- label,
426
- index,
427
- isVisible: false,
428
- isHidable: enableHiding,
429
- };
430
- } );
439
+ function FieldControl() {
440
+ const { view, fields, onChangeView } = useContext( DataViewsContext );
441
+
442
+ const togglableFields = [
443
+ view?.titleField,
444
+ view?.mediaField,
445
+ view?.descriptionField,
446
+ ].filter( Boolean );
447
+ const visibleFieldIds = view.fields ?? [];
448
+ const hiddenFields = fields.filter(
449
+ ( f ) =>
450
+ ! visibleFieldIds.includes( f.id ) &&
451
+ ! togglableFields.includes( f.id )
452
+ );
453
+ const visibleFields = visibleFieldIds
454
+ .map( ( fieldId ) => fields.find( ( f ) => f.id === fieldId ) )
455
+ .filter( isDefined );
431
456
 
432
457
  if ( ! visibleFields?.length && ! hiddenFields?.length ) {
433
458
  return null;
434
459
  }
460
+ const titleField = fields.find( ( f ) => f.id === view.titleField );
461
+ const mediaField = fields.find( ( f ) => f.id === view.mediaField );
462
+ const descriptionField = fields.find(
463
+ ( f ) => f.id === view.descriptionField
464
+ );
465
+ const lockedFields = [
466
+ {
467
+ field: titleField,
468
+ isVisibleFlag: 'showTitle',
469
+ },
470
+ {
471
+ field: mediaField,
472
+ isVisibleFlag: 'showMedia',
473
+ },
474
+ {
475
+ field: descriptionField,
476
+ isVisibleFlag: 'showDescription',
477
+ },
478
+ ].filter( ( { field } ) => isDefined( field ) );
479
+ const visibleLockedFields = lockedFields.filter(
480
+ ( { field, isVisibleFlag } ) =>
481
+ // @ts-expect-error
482
+ isDefined( field ) && ( view[ isVisibleFlag ] ?? true )
483
+ ) as Array< { field: NormalizedField< any >; isVisibleFlag: string } >;
484
+ const hiddenLockedFields = lockedFields.filter(
485
+ ( { field, isVisibleFlag } ) =>
486
+ // @ts-expect-error
487
+ isDefined( field ) && ! ( view[ isVisibleFlag ] ?? true )
488
+ ) as Array< { field: NormalizedField< any >; isVisibleFlag: string } >;
435
489
 
436
490
  return (
437
- <VStack spacing={ 6 } className="dataviews-field-control">
438
- { !! visibleFields?.length && (
439
- <ItemGroup isBordered isSeparated>
440
- { visibleFields.map( ( field ) => (
441
- <FieldItem
442
- key={ field.id }
443
- field={ field }
444
- fields={ fields }
445
- view={ view }
446
- onChangeView={ onChangeView }
447
- />
448
- ) ) }
449
- </ItemGroup>
450
- ) }
451
- { !! hiddenFields?.length && (
452
- <>
453
- <VStack spacing={ 4 }>
454
- <BaseControl.VisualLabel style={ { margin: 0 } }>
455
- { __( 'Hidden' ) }
456
- </BaseControl.VisualLabel>
491
+ <VStack className="dataviews-field-control" spacing={ 6 }>
492
+ <VStack className="dataviews-view-config__properties" spacing={ 0 }>
493
+ { ( visibleLockedFields.length > 0 ||
494
+ !! visibleFields?.length ) && (
495
+ <ItemGroup isBordered isSeparated>
496
+ { visibleLockedFields.map(
497
+ ( { field, isVisibleFlag } ) => {
498
+ return (
499
+ <FieldItem
500
+ key={ field.id }
501
+ field={ field }
502
+ isVisible
503
+ onToggleVisibility={ () => {
504
+ onChangeView( {
505
+ ...view,
506
+ [ isVisibleFlag ]: false,
507
+ } );
508
+ } }
509
+ canMove={ false }
510
+ />
511
+ );
512
+ }
513
+ ) }
514
+
515
+ { visibleFields.map( ( field, index ) => (
516
+ <RegularFieldItem
517
+ key={ field.id }
518
+ field={ field }
519
+ view={ view }
520
+ onChangeView={ onChangeView }
521
+ index={ index }
522
+ />
523
+ ) ) }
524
+ </ItemGroup>
525
+ ) }
526
+ </VStack>
527
+
528
+ { ( !! hiddenFields?.length || !! hiddenLockedFields.length ) && (
529
+ <VStack spacing={ 4 }>
530
+ <BaseControl.VisualLabel style={ { margin: 0 } }>
531
+ { __( 'Hidden' ) }
532
+ </BaseControl.VisualLabel>
533
+ <VStack
534
+ className="dataviews-view-config__properties"
535
+ spacing={ 0 }
536
+ >
457
537
  <ItemGroup isBordered isSeparated>
538
+ { hiddenLockedFields.length > 0 &&
539
+ hiddenLockedFields.map(
540
+ ( { field, isVisibleFlag } ) => {
541
+ return (
542
+ <FieldItem
543
+ key={ field.id }
544
+ field={ field }
545
+ isVisible={ false }
546
+ onToggleVisibility={ () => {
547
+ onChangeView( {
548
+ ...view,
549
+ [ isVisibleFlag ]: true,
550
+ } );
551
+ } }
552
+ canMove={ false }
553
+ />
554
+ );
555
+ }
556
+ ) }
458
557
  { hiddenFields.map( ( field ) => (
459
- <FieldItem
558
+ <RegularFieldItem
460
559
  key={ field.id }
461
560
  field={ field }
462
- fields={ fields }
463
561
  view={ view }
464
562
  onChangeView={ onChangeView }
465
563
  />
466
564
  ) ) }
467
565
  </ItemGroup>
468
566
  </VStack>
469
- </>
567
+ </VStack>
470
568
  ) }
471
569
  </VStack>
472
570
  );
@@ -67,3 +67,12 @@
67
67
  top: unset;
68
68
  }
69
69
  }
70
+
71
+ .dataviews-field-control__icon {
72
+ display: flex;
73
+ width: $icon-size;
74
+ }
75
+
76
+ .dataviews-field-control__label {
77
+ flex-grow: 1;
78
+ }