import 'package:adaptive_scrollbar/adaptive_scrollbar.dart'; import 'package:flutter/material.dart'; import 'dart:convert';
class DynamicDataTable extends StatefulWidget { final String json; final Function(Set<Map<String, dynamic>>) onSelectedRowsAction; final Function(Map<String, dynamic>) onEdit; final Function(Map<String, dynamic>) onDelete; final List<String> hiddenColumns; // Yeni parametre: gizlenmiş sütunlar
DynamicDataTable({ Key? key, required this.json, required this.onSelectedRowsAction, required this.onEdit, required this.onDelete, required this.hiddenColumns, // Yeni parametre }) : super(key: key);
@override _DynamicDataTableState createState() => _DynamicDataTableState(); }
class _DynamicDataTableState extends State<DynamicDataTable> { late List<Map<String, dynamic>> _allRows; late List<Map<String, dynamic>> _filteredRows; late List<String> _columns; Map<String, TextEditingController> _controllers = {}; Set<Map<String, dynamic>> _selectedRowsData = Set<Map<String, dynamic>>();
@override void initState() { super.initState(); final data = jsonDecode(widget.json); _allRows = List<Map<String, dynamic>>.from(data); _filteredRows = _allRows; if (_allRows.isNotEmpty) { _columns = _allRows.first.keys.toList(); _controllers = { for (var column in _columns) column: TextEditingController(), }; } }
void _filterRows() { setState(() { _filteredRows = _allRows.where((row) { return _columns.every((column) { final controller = _controllers[column]; if (controller != null && controller.text.isNotEmpty) { final textLower = controller.text.toLowerCase(); return row[column].toString().toLowerCase().contains(textLower); } return true; }); }).toList(); }); }
final _horizontalScrollController = ScrollController();
void _handleEditRow(Map<String, dynamic> row) { widget.onEdit(row); }
void _handleDeleteRow(Map<String, dynamic> row) { widget.onDelete(row); }
@override Widget build(BuildContext context) { return ListView( children: [ Card( child: Container( padding: EdgeInsets.only(top: 20, bottom: 20, right: 20), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton.icon( onPressed: () { widget.onSelectedRowsAction(_selectedRowsData); }, icon: Icon( Icons.verified, ), label: Text('Seçili Olanları Onayla'), ), ], ), ), ), AdaptiveScrollbar( controller: _horizontalScrollController, position: ScrollbarPosition.bottom, underColor: Colors.blueGrey.withOpacity(0.3), sliderDefaultColor: Colors.grey.withOpacity(0.7), sliderActiveColor: Colors.grey, child: SingleChildScrollView( controller: _horizontalScrollController, scrollDirection: Axis.horizontal, child: Card( child: DataTable( columnSpacing: 38.0, columns: [ ..._columns .map( (column) => widget.hiddenColumns.contains(column) ? DataColumn(label: SizedBox.shrink()) // Gizlenmiş sütunları görüntülememek için boş bir DataColumn ekliyoruz. : DataColumn( label: Column( children: [ Container( margin: EdgeInsets.only(top: 15), child: Text(column), ), Expanded( child: Container( width: 100, child: Padding( padding: const EdgeInsets.symmetric(vertical: 4.0), child: TextField( controller: _controllers[column], onChanged: (value) { _filterRows(); }, ), ), ), ), ], ), ), ) .toList(), // Yeni sütun ekleyin ve her satırın altına bir düzenleme simgesi ekleyin DataColumn( label: Text('Düzenle'), ), DataColumn( label: Text('Sil'), ), ], rows: _filteredRows.asMap().entries.map((entry) { int idx = entry.key; Map<String, dynamic> row = entry.value; return DataRow( selected: _selectedRowsData.contains(row), onSelectChanged: (isSelected) { setState(() { if (isSelected ?? false) { _selectedRowsData.add(row); } else { _selectedRowsData.remove(row); } }); }, cells: [ ..._columns.map((column) { return widget.hiddenColumns.contains(column) ? DataCell(SizedBox.shrink()) // Gizlenmiş sütunları görüntülememek için boş bir DataCell ekliyoruz. : DataCell(Text('${row[column]}')); }).toList(), // Her satırın altına bir düzenleme simgesi ekleyin DataCell( IconButton( icon: Icon(Icons.edit, color: Colors.blue), onPressed: () { // Düzenleme simgesine tıklandığında ilgili satırı işlemek için bu işlevi kullanın _handleEditRow(row); }, ), ), DataCell( IconButton( icon: Icon(Icons.delete_forever, color: Colors.red), onPressed: () { // Düzenleme simgesine tıklandığında ilgili satırı işlemek için bu işlevi kullanın _handleDeleteRow(row); }, ), ), ], ); }).toList(), ), ), ), ), ], ); } }
|