Skip to content

Commit

Permalink
add builder feature for select column type
Browse files Browse the repository at this point in the history
  • Loading branch information
doonfrs committed Dec 19, 2023
1 parent ef3804a commit fffbd4b
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 14 deletions.
24 changes: 23 additions & 1 deletion example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,24 @@ class _PlutoGridExamplePageState extends State<PlutoGridExamplePage> {
'Owner',
]),
),
PlutoColumn(
title: 'Role 2',
field: 'role2',
type: PlutoColumnType.select(
<String>[
'Programmer',
'Designer',
'Owner',
],
builder: (item) {
return Row(children: [
Icon(item == 'Programmer' ? Icons.code : Icons.design_services),
const SizedBox(width: 8),
Text(item),
]);
},
),
),
PlutoColumn(
title: 'Joined',
field: 'joined',
Expand Down Expand Up @@ -99,6 +117,7 @@ class _PlutoGridExamplePageState extends State<PlutoGridExamplePage> {
'name': PlutoCell(value: 'Mike'),
'age': PlutoCell(value: 20),
'role': PlutoCell(value: 'Programmer'),
'role2': PlutoCell(value: 'Programmer'),
'joined': PlutoCell(value: '2021-01-01'),
'working_time': PlutoCell(value: '09:00'),
'salary': PlutoCell(value: 300),
Expand All @@ -110,6 +129,7 @@ class _PlutoGridExamplePageState extends State<PlutoGridExamplePage> {
'name': PlutoCell(value: 'Jack'),
'age': PlutoCell(value: 25),
'role': PlutoCell(value: 'Designer'),
'role2': PlutoCell(value: 'Designer'),
'joined': PlutoCell(value: '2021-02-01'),
'working_time': PlutoCell(value: '10:00'),
'salary': PlutoCell(value: 400),
Expand All @@ -121,6 +141,7 @@ class _PlutoGridExamplePageState extends State<PlutoGridExamplePage> {
'name': PlutoCell(value: 'Suzi'),
'age': PlutoCell(value: 40),
'role': PlutoCell(value: 'Owner'),
'role2': PlutoCell(value: 'Owner'),
'joined': PlutoCell(value: '2021-03-01'),
'working_time': PlutoCell(value: '11:00'),
'salary': PlutoCell(value: 700),
Expand All @@ -134,7 +155,8 @@ class _PlutoGridExamplePageState extends State<PlutoGridExamplePage> {
PlutoColumnGroup(title: 'User information', fields: ['name', 'age']),
PlutoColumnGroup(title: 'Status', children: [
PlutoColumnGroup(title: 'A', fields: ['role'], expandedColumn: true),
PlutoColumnGroup(title: 'Etc.', fields: ['joined', 'working_time']),
PlutoColumnGroup(
title: 'Etc.', fields: ['joined', 'working_time', 'role2']),
]),
];

Expand Down
29 changes: 16 additions & 13 deletions lib/src/model/pluto_column_type.dart
Original file line number Diff line number Diff line change
Expand Up @@ -98,14 +98,15 @@ abstract class PlutoColumnType {
dynamic defaultValue = '',
bool enableColumnFilter = false,
IconData? popupIcon = Icons.arrow_drop_down,
Widget Function(dynamic item)? builder,
}) {
return PlutoColumnTypeSelect(
onItemSelected: onItemSelected ?? (event) {},
defaultValue: defaultValue,
items: items,
enableColumnFilter: enableColumnFilter,
popupIcon: popupIcon,
);
onItemSelected: onItemSelected ?? (event) {},
defaultValue: defaultValue,
items: items,
enableColumnFilter: enableColumnFilter,
popupIcon: popupIcon,
builder: builder);
}

/// Set as a date column.
Expand Down Expand Up @@ -361,19 +362,21 @@ class PlutoColumnTypeSelect

final List<dynamic> items;

final Widget Function(dynamic item)? builder;

final bool enableColumnFilter;
final Function(PlutoGridOnSelectedEvent event) onItemSelected;

@override
final IconData? popupIcon;

const PlutoColumnTypeSelect({
required this.onItemSelected,
this.defaultValue,
required this.items,
required this.enableColumnFilter,
this.popupIcon,
});
const PlutoColumnTypeSelect(
{required this.onItemSelected,
this.defaultValue,
required this.items,
required this.enableColumnFilter,
this.popupIcon,
this.builder});

@override
bool isValid(dynamic value) => items.contains(value) == true;
Expand Down
8 changes: 8 additions & 0 deletions lib/src/ui/cells/pluto_select_cell.dart
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,14 @@ class PlutoSelectCellState extends State<PlutoSelectCell>
enableFilterMenuItem: enableColumnFilter,
enableHideColumnMenuItem: false,
enableSetColumnsMenuItem: false,
renderer: widget.column.type.select.builder == null
? null
: (rendererContext) {
var item =
widget.column.type.select.items[rendererContext.rowIdx];

return widget.column.type.select.builder!(item);
},
)
];

Expand Down

0 comments on commit fffbd4b

Please sign in to comment.