import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/processing.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/user_search/user_serach.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/pages/widgets/local_text.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; import 'model/processing_model.dart'; import 'package_editor.dart'; class ProcesingEditor extends StatefulWidget { final Processing processing; const ProcesingEditor({this.processing}); @override _ProcesingEditorState createState() => _ProcesingEditorState(); } class _ProcesingEditorState extends State { Processing processing = Processing(); bool _isLoading = false; bool _isNew; User user; User shipper; List packages = []; @override void initState() { super.initState(); _isNew = widget.processing == null; if (!_isNew) { processing = widget.processing; user = User( fcsID: processing.userID, name: processing.userName, phoneNumber: processing.userPhoneNumber); shipper = User( fcsID: processing.fcsID, name: processing.shipperName, phoneNumber: processing.shipperPhoneNumber); packages = processing.packages; } } @override Widget build(BuildContext context) { var fcsIDBox = Row( children: [ Expanded( child: DisplayText( text: user != null ? user.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), IconButton( icon: Icon(Icons.search, color: primaryColor), onPressed: () => searchUser(context, callbackUserSelect: (u) { setState(() { this.user = u; }); })), ], ); final phoneNumberBox = DisplayText( text: user != null ? user.phoneNumber : "", labelTextKey: "processing.phone", maxLines: 2, iconData: Icons.phone, ); final namebox = DisplayText( text: user != null ? user.name : "", labelTextKey: "processing.consignee.name", maxLines: 2, iconData: Icons.person, ); final consigneeBox = Container( child: Column( children: [ fcsIDBox, phoneNumberBox, namebox, ], ), ); var shipperIDBox = Row( children: [ Expanded( child: DisplayText( text: shipper != null ? shipper.fcsID : "", labelTextKey: "processing.fcs.id", icon: FcsIDIcon(), )), IconButton( icon: Icon(Icons.search, color: primaryColor), onPressed: () => searchUser(context, callbackUserSelect: (u) { setState(() { this.shipper = u; }); })), ], ); final shipperPhoneNumberBox = DisplayText( text: shipper != null ? shipper.phoneNumber : "", labelTextKey: "processing.phone", maxLines: 2, iconData: Icons.phone, ); final shipperNamebox = DisplayText( text: shipper != null ? shipper.name : "", labelTextKey: "processing.shipper.name", maxLines: 2, iconData: Icons.person, ); final shipperBox = Container( child: Column( children: [ shipperIDBox, shipperPhoneNumberBox, shipperNamebox, ], ), ); final packageTitleBox = Container( child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Text("Packages (${packages.length})"), IconButton( icon: Icon( Icons.add_circle, color: primaryColor, ), onPressed: () async { Package _package = await Navigator.push( context, CupertinoPageRoute(builder: (context) => PackageEditor()), ); _addPackage(_package); // _savePackage(_package); }), ], ), ); final createButton = fcsButton( context, getLocalString(context, 'processing.edit.complete.btn'), callack: _save, ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( centerTitle: true, leading: new IconButton( icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30), onPressed: () { showConfirmDialog(context, "back.button_confirm", () { Navigator.of(context).pop(); }); }, ), shadowColor: Colors.transparent, backgroundColor: Colors.white, title: LocalText( context, _isNew ? "processing.create" : "processing.update", fontSize: 20, color: primaryColor, ), ), body: Padding( padding: const EdgeInsets.only(left: 12.0, right: 12), child: ListView( children: [ SizedBox( height: 10, ), Row( children: [ Flexible(child: consigneeBox), Flexible(child: shipperBox) ], ), Divider(), packageTitleBox, Column( crossAxisAlignment: CrossAxisAlignment.start, children: _getPackages(context, packages), ), SizedBox( height: 20, ), createButton, SizedBox( height: 10, ), ], ), ), )); } List _getPackages(BuildContext context, List packages) { return packages.map((p) { return Container( decoration: BoxDecoration( border: Border( bottom: BorderSide(color: Colors.grey[300]), ), ), child: InkWell( onTap: () async { Package _package = await Navigator.of(context).push( CupertinoPageRoute( builder: (context) => PackageEditor(package: p))); // setState(() { // _savePackage(_package); // }); _savePackage(_package); }, child: Row( children: [ Expanded( child: new Padding( padding: const EdgeInsets.symmetric(vertical: 5.0), child: new Row( children: [ new Padding( padding: new EdgeInsets.symmetric( horizontal: 30.0 - 15.0 / 2), child: Stack( alignment: AlignmentDirectional.bottomEnd, children: [ Icon( Octicons.package, color: primaryColor, size: 30, ), ], ), ), new Expanded( child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( p.trackingID, style: new TextStyle(fontSize: 15.0), ), ], ), ), IconButton( icon: Icon(Icons.remove, color: primaryColor), onPressed: () => _removePackage(p), ) ], ), ), ), ], ), ), ); }).toList(); } _addPackage(Package package) { if (package == null) return; this.packages.add(package); setState(() {}); } _savePackage(Package package) { if (package == null) return; setState(() {}); } _removePackage(Package package) { if (package == null) return; this.packages.removeWhere((p) => p.trackingID == package.trackingID); setState(() {}); } _save() async { setState(() { _isLoading = true; }); ProcessingModel processingModel = Provider.of(context, listen: false); try { if (_isNew) { await processingModel.createProcessing(processing); } else { processing.id = widget.processing.id; await processingModel.updateProcessing(processing); } Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } }