import 'package:fcs/domain/entities/cargo_type.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/widgets/dialog_input.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/my_data_table.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'cargo_type_editor.dart'; typedef OnAdd(CargoType cargoType); typedef OnRemove(CargoType cargoType); class CargoTable extends StatefulWidget { final List cargoTypes; final OnAdd onAdd; final OnRemove onRemove; const CargoTable({Key key, this.cargoTypes, this.onAdd, this.onRemove}) : super(key: key); @override _CargoTableState createState() => _CargoTableState(); } class _CargoTableState extends State { double totalWeight = 0; List _cargos = []; double remainingWeight = 0; List _list = []; List _types = []; @override Widget build(BuildContext context) { remainingWeight = widget.cargoTypes.length == 0 ? this.totalWeight : remainingWeight; this._cargos = widget.cargoTypes.length == 0 ? [] : this._cargos; return SingleChildScrollView( scrollDirection: Axis.horizontal, child: MyDataTable( headingRowHeight: 40, columnSpacing: 40, columns: [ MyDataColumn( label: LocalText( context, "cargo.type", color: Colors.grey, ), ), MyDataColumn( label: LocalText( context, "cargo.qty", color: Colors.grey, ), ), MyDataColumn( label: LocalText( context, "cargo.weight", color: Colors.grey, ), ), ], rows: getCargoRows(context), ), ); } List getCargoRows(BuildContext context) { if (widget.cargoTypes == null) { return []; } CargoType cargo; var rows = widget.cargoTypes.map((c) { return MyDataRow( onSelectChanged: (bool selected) async { // if (this.totalWeight <= 0) { // showMsgDialog(context, "Error", "Please insert total weight"); // return; // } // if (c.isCutomDuty) return; // CargoType cargo = await Navigator.push( // context, // CupertinoPageRoute( // builder: (context) => CargoTypeEditor( // cargo: c, // ))); // if (widget.onAdd != null) widget.onAdd(cargo); // if (cargo == null) return; // this._cargos.add(cargo); // if (this.remainingWeight <= 0) return; // this.remainingWeight -= cargo.weight; // this._cargos.forEach((c) { // _list.add(c.name); // }); // widget.cargoTypes.forEach((c) { // _types.add(c.name); // }); // if (this._cargos.length == widget.cargoTypes.length - 1) { // _types.forEach((t) { // if (!_list.contains(t)) { // widget.cargoTypes.forEach((c) { // if (c.name == t) { // c.weight = this.remainingWeight; // } // }); // } // }); // } }, cells: [ MyDataCell(Row( children: [ new Text( c.name == null ? "" : c.name, style: textStyle, ), new Text( c.qty == null ? "" : " x ${c.qty.toString()}", style: TextStyle(color: Colors.grey), ), ], )), MyDataCell( c.isCutomDuty ? InkWell( onTap: () async { String _t = await showDialog( context: context, builder: (_) => DialogInput( label: "cargo.qty", value: c.qty.toString())); if (_t == null) return; setState(() { c.qty = int.parse(_t); }); }, child: Center( child: Container( width: 40, padding: const EdgeInsets.all(7.0), decoration: BoxDecoration( border: Border.all(color: primaryColor), borderRadius: BorderRadius.all(Radius.circular(5.0)), ), child: new Text( c.qty == null ? "" : c.qty.toString(), style: textStyle, textAlign: TextAlign.center, ), ), ), ) : Center( child: new Text( "-", style: textStyle, ), ), ), MyDataCell( Row( mainAxisAlignment: MainAxisAlignment.center, children: [ GestureDetector( onTap: () async { if (this.totalWeight <= 0) { showMsgDialog( context, "Error", "Please insert total weight"); return; } String _t = await showDialog( context: context, builder: (_) => DialogInput( label: "cargo.weight", value: c.weight.toStringAsFixed(2))); if (_t == null) return; setState(() { c.weight = double.parse(_t); }); cargo = c; this._cargos.add(cargo); if (this.remainingWeight <= 0) return; this.remainingWeight -= cargo.weight; this._cargos.forEach((c) { _list.add(c.name); }); widget.cargoTypes.forEach((c) { _types.add(c.name); }); if (this._cargos.length == widget.cargoTypes.length - 1) { _types.forEach((t) { if (!_list.contains(t)) { widget.cargoTypes.forEach((c) { if (c.name == t) { c.weight = this.remainingWeight; setState(() { this._cargos = []; }); } }); } }); this.remainingWeight = this.totalWeight; } }, child: Container( padding: const EdgeInsets.all(7.0), decoration: BoxDecoration( border: Border.all(color: primaryColor), borderRadius: BorderRadius.all(Radius.circular(5.0)), ), child: Text( c.weight == null ? "0.00" : c.weight.toStringAsFixed(2), style: textStyle), ), ), widget.onRemove == null ? SizedBox( width: 50, ) : IconButton( icon: Icon( Icons.remove_circle, color: primaryColor, ), onPressed: () { if (widget.onRemove != null) widget.onRemove(c); }) ], ), ), ], ); }).toList(); var totalRow = MyDataRow( onSelectChanged: (bool selected) {}, cells: [ MyDataCell(Align( alignment: Alignment.centerRight, child: LocalText( context, "shipment.cargo.total", color: Colors.black87, fontWeight: FontWeight.bold, ), )), MyDataCell(Text("")), MyDataCell( Padding( padding: const EdgeInsets.only(right: 48.0), child: Align( alignment: Alignment.centerRight, child: InkWell( onTap: () async { String _t = await showDialog( context: context, builder: (_) => DialogInput( label: "shipment.cargo.total", value: totalWeight.toStringAsFixed(2))); if (_t == null) return; setState(() { totalWeight = double.parse(_t); remainingWeight = totalWeight; }); }, child: Container( padding: const EdgeInsets.all(7.0), decoration: BoxDecoration( border: Border.all(color: primaryColor), borderRadius: BorderRadius.all(Radius.circular(5.0)), ), child: Text(totalWeight.toStringAsFixed(2), style: TextStyle(fontWeight: FontWeight.bold)), ), )), ), ), ], ); rows.add(totalRow); return rows; } List _getCargoRows(BuildContext context) { if (widget.cargoTypes == null) { return []; } double total = 0; var rows = widget.cargoTypes.map((c) { total += c.weight; return MyDataRow( onSelectChanged: (bool selected) async { CargoType cargo = await Navigator.push( context, CupertinoPageRoute( builder: (context) => CargoTypeEditor( cargo: c, ))); if (widget.onAdd != null) widget.onAdd(cargo); }, cells: [ MyDataCell(new Text( c.name == null ? "" : c.name, style: textStyle, )), MyDataCell( Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text(c.weight == null ? "0" : c.weight.toStringAsFixed(2), style: textStyle), widget.onRemove == null ? SizedBox( width: 50, ) : IconButton( icon: Icon( Icons.remove_circle, color: primaryColor, ), onPressed: () { if (widget.onRemove != null) widget.onRemove(c); }) ], ), ), ], ); }).toList(); var totalRow = MyDataRow( onSelectChanged: (bool selected) {}, cells: [ MyDataCell(Align( alignment: Alignment.centerRight, child: LocalText( context, "shipment.cargo.total", color: Colors.black87, fontWeight: FontWeight.bold, ), )), MyDataCell( Padding( padding: const EdgeInsets.only(right: 48.0), child: Align( alignment: Alignment.centerRight, child: Text(total.toStringAsFixed(2), style: TextStyle(fontWeight: FontWeight.bold))), ), ), ], ); rows.add(totalRow); return rows; } }