import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:fcs/model/employee_model.dart'; import 'package:fcs/model/language_model.dart'; import 'package:fcs/model/main_model.dart'; import 'package:fcs/model/user_model.dart'; import 'package:fcs/theme/theme.dart'; import 'package:fcs/vo/role.dart'; import 'package:fcs/vo/user.dart'; import 'package:fcs/widget/local_text.dart'; import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/widget/progress.dart'; import 'util.dart'; typedef void FindCallBack(); class CustomerEditor extends StatefulWidget { final User customer; const CustomerEditor({this.customer}); @override _CustomerEditorState createState() => _CustomerEditorState(); } class _CustomerEditorState extends State { TextEditingController _name = new TextEditingController(); TextEditingController _phone = new TextEditingController(); TextEditingController _phoneInput = new TextEditingController(); TextEditingController _status = new TextEditingController(); final _formKey = GlobalKey(); bool _isLoading = false; String currentBizId; bool isSend = false; User user; User selectedUser; List privileges = []; @override void initState() { super.initState(); // privileges = Provider.of(context, listen: false).privileges; if (widget.customer != null) { _name.text = widget.customer.name; _phone.text = widget.customer.phone; _status.text = widget.customer.status; // privileges.forEach((p) => widget.employee.privilegeIds.contains(p.id) // ? p.isChecked = true // : p.isChecked = false); } } List showprivilegeList(BuildContext context, UserModel userModel) { return privileges.map((p) { return new ListTile( title: new Row( children: [ new Checkbox( value: p.isChecked == null ? false : p.isChecked, activeColor: primaryColor, onChanged: (bool value) { setState(() { p.isChecked = value; }); }), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( p.name, style: TextStyle( fontSize: 15.0, ), ), // Container( // width: MediaQuery.of(context).size.width * 0.5, // child: new Text( // userModel.getPrivileges[index].desc, // style: // TextStyle(fontSize: 12.0, color: Colors.grey[600]), // ), // ), ], ), ], )); }).toList(); } Widget phoneInputbox(BuildContext context, FindCallBack findCallBack) { var languageModel = Provider.of(context); return Container( padding: EdgeInsets.only(top: 10), child: Stack( alignment: const Alignment(1.2, 1.0), children: [ TextFormField( controller: _phoneInput, autofocus: false, cursorColor: primaryColor, keyboardType: TextInputType.phone, style: textStyle, decoration: new InputDecoration( labelText: AppTranslations.of(context).text('employee.phone'), labelStyle: languageModel.isEng ? labelStyle : labelStyleMM, icon: Icon( Icons.phone, color: primaryColor, ), enabledBorder: UnderlineInputBorder( borderSide: BorderSide(color: primaryColor, width: 1.0)), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: primaryColor, width: 1.0)), ), ), new FlatButton( onPressed: () { this.isSend = true; findCallBack(); }, child: new Icon( Icons.search, size: 25, )) ], )); } @override Widget build(BuildContext context) { var userModel = Provider.of(context); MainModel mainModel = Provider.of(context); final namebox = TextFormField( controller: _name, autofocus: false, readOnly: true, cursorColor: primaryColor, decoration: new InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( Icons.person, color: primaryColor, ), ), ); final displayPhoneNo = TextFormField( controller: _phone, autofocus: false, readOnly: true, cursorColor: primaryColor, decoration: new InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( Icons.phone, color: primaryColor, ), ), ); var phoneNumberBox = Row( children: [ Expanded(child: displayPhoneNo), Expanded( child: InkWell( onTap: () => call(context, _phone.text), child: Icon( Icons.open_in_new, color: Colors.grey, size: 15, ), ), ), ], ); final statusbox = TextFormField( controller: _status, autofocus: false, readOnly: true, cursorColor: primaryColor, decoration: new InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( Icons.av_timer, color: primaryColor, ), ), ); final updateButton = Container( padding: EdgeInsets.only(top: 40), child: Container( height: 45.0, decoration: BoxDecoration( color: primaryColor, shape: BoxShape.rectangle, ), child: ButtonTheme( minWidth: 900.0, height: 100.0, child: FlatButton( onPressed: () {}, child: LocalText( context, 'customer.update', color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ); final addButton = Container( padding: EdgeInsets.only(top: 40), child: Container( height: 45.0, decoration: BoxDecoration( color: primaryColor, shape: BoxShape.rectangle, ), child: ButtonTheme( minWidth: 900.0, height: 100.0, child: FlatButton( onPressed: () {}, child: LocalText( context, 'customer.add', color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( centerTitle: true, leading: new IconButton( icon: new Icon(Icons.close), onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, title: LocalText( context, "customer.form.title", fontSize: 20, color: Colors.white, ), // actions: [ // widget.customer == null || !mainModel.showHistoryBtn() // ? Container() // : IconButton( // icon: Icon(Icons.history), // onPressed: () { // Navigator.push( // context, // MaterialPageRoute( // builder: (context) => DocumentLogPage( // docID: widget.customer.docID)), // ); // }, // ), // ], ), body: ListView( shrinkWrap: true, padding: EdgeInsets.only(left: 24.0, right: 24.0), children: [ widget.customer == null ? phoneInputbox(context, () => _findUser(context)) : phoneNumberBox, widget.customer == null ? this.isSend ? namebox : Container() : namebox, statusbox, // widget.customer == null ? addButton : updateButton, SizedBox( height: 20, ) ], ), )); } _add(BuildContext context) async { if (selectedUser == null) return; setState(() { _isLoading = true; }); var employeeModel = Provider.of(context); try { await employeeModel.updatePrivileges( this.selectedUser.docID, privilegesIDs()); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } List privilegesIDs() { return this.privileges.where((p) => p.isChecked).map((p) => p.id).toList(); } _save() async { setState(() { _isLoading = true; }); if (widget.customer == null) return; var employeeModel = Provider.of(context); try { await employeeModel.updatePrivileges( widget.customer.docID, privilegesIDs()); Navigator.pop(context); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } _findUser(BuildContext context) async { var userModel = Provider.of(context); setState(() { _isLoading = true; }); try { selectedUser = await userModel.findUser(_phoneInput.text); setState(() { isSend = true; _name.text = selectedUser.name; if (selectedUser.privilegeIds != null) { privileges.forEach((p) => selectedUser.privilegeIds.contains(p.id) ? p.isChecked = true : p.isChecked = false); } }); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { setState(() { _isLoading = false; }); } } }