Skip to content

Commit 9ff703b

Browse files
authored
Implement field type media (#103249)
1 parent d5f3818 commit 9ff703b

File tree

11 files changed

+50
-2
lines changed

11 files changed

+50
-2
lines changed

packages/dataviews/CHANGELOG.automattic.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Next
44

5+
- Implement the `media` field type definition and allow type definitions to provide a new default: `enableSorting`.
56
- Add new `boolean` field type definition and edit control. Field type definitions are able to define a default render function that will be used if the field doesn't define one.
67
- Pin the actions column on the table view when the width is insufficient.
78
- Bring changes from @wordpress/dataviews 4.19.0 (no updates in this version).

packages/dataviews/src/components/dataviews/stories/fixtures.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,7 @@ export const fields: Field< SpaceObject >[] = [
633633
{
634634
label: 'Image',
635635
id: 'image',
636+
type: 'media',
636637
header: (
637638
<HStack spacing={ 1 } justify="start">
638639
<Icon icon={ image } />
@@ -644,7 +645,6 @@ export const fields: Field< SpaceObject >[] = [
644645
<img src={ item.image } alt="" style={ { width: '100%' } } />
645646
);
646647
},
647-
enableSorting: false,
648648
},
649649
{
650650
label: 'Title',

packages/dataviews/src/field-types/boolean.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,5 @@ export default {
5757

5858
return null;
5959
},
60+
enableSorting: true,
6061
};

packages/dataviews/src/field-types/datetime.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ export default {
3535
? renderFromElements( { item, field } )
3636
: field.getValue( { item } );
3737
},
38+
enableSorting: true,
3839
};

packages/dataviews/src/field-types/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { default as integer } from './integer';
1111
import { default as text } from './text';
1212
import { default as datetime } from './datetime';
1313
import { default as boolean } from './boolean';
14+
import { default as media } from './media';
1415
import { renderFromElements } from '../utils';
1516

1617
/**
@@ -36,6 +37,12 @@ export default function getFieldTypeDefinition< Item >( type?: FieldType ) {
3637
return boolean;
3738
}
3839

40+
if ( 'media' === type ) {
41+
return media;
42+
}
43+
44+
// This is a fallback for fields that don't provide a type.
45+
// It can be removed when the field.type is mandatory.
3946
return {
4047
sort: ( a: any, b: any, direction: SortDirection ) => {
4148
if ( typeof a === 'number' && typeof b === 'number' ) {
@@ -62,5 +69,6 @@ export default function getFieldTypeDefinition< Item >( type?: FieldType ) {
6269
? renderFromElements( { item, field } )
6370
: field.getValue( { item } );
6471
},
72+
enableSorting: true,
6573
};
6674
}

packages/dataviews/src/field-types/integer.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,5 @@ export default {
4141
? renderFromElements( { item, field } )
4242
: field.getValue( { item } );
4343
},
44+
enableSorting: true,
4445
};
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* Internal dependencies
3+
*/
4+
import type { SortDirection, ValidationContext } from '../types';
5+
6+
function sort( a: any, b: any, direction: SortDirection ) {
7+
return 0;
8+
}
9+
10+
function isValid( value: any, context?: ValidationContext ) {
11+
if ( context?.elements ) {
12+
const validValues = context?.elements.map( ( f ) => f.value );
13+
if ( ! validValues.includes( value ) ) {
14+
return false;
15+
}
16+
}
17+
18+
return true;
19+
}
20+
21+
export default {
22+
sort,
23+
isValid,
24+
Edit: () => null,
25+
render: () => null,
26+
enableSorting: false,
27+
};

packages/dataviews/src/field-types/text.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ export default {
3434
? renderFromElements( { item, field } )
3535
: field.getValue( { item } );
3636
},
37+
enableSorting: true,
3738
};

packages/dataviews/src/media.tsx

Whitespace-only changes.

packages/dataviews/src/normalize-fields.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ export function normalizeFields< Item >(
7777
isValid,
7878
Edit,
7979
enableHiding: field.enableHiding ?? true,
80-
enableSorting: field.enableSorting ?? true,
80+
enableSorting:
81+
field.enableSorting ??
82+
fieldTypeDefinition.enableSorting ??
83+
true,
8184
};
8285
} );
8386
}

packages/dataviews/src/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ export type FieldTypeDefinition< Item > = {
7676
* Callback used to render the field.
7777
*/
7878
render: ComponentType< DataViewRenderFieldProps< Item > >;
79+
80+
/**
81+
* Whether the field is sortable.
82+
*/
83+
enableSorting: boolean;
7984
};
8085

8186
/**

0 commit comments

Comments
 (0)