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/log_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 'document_log_page.dart'; import 'util.dart'; typedef void FindCallBack(); class EmployeeEditor extends StatefulWidget { final User employee; const EmployeeEditor({this.employee}); @override _EmployeeEditorState createState() => _EmployeeEditorState(); } class _EmployeeEditorState extends State { TextEditingController _name = new TextEditingController(); TextEditingController _phone = new TextEditingController(); TextEditingController _phoneInput = 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).getPrivileges; if (widget.employee != null) { _name.text = widget.employee.name; _phone.text = widget.employee.phone; privileges.forEach((p) => widget.employee.privilegeIds.contains(p.id) ? p.isChecked = true : p.isChecked = false); } else { privileges.forEach((p) => p.isChecked = false); } } Widget showprivilegeList(BuildContext context, UserModel userModel) { return Container( width: 300, height: 300, child: ListView.builder( itemCount: privileges.length, itemBuilder: (BuildContext context, int index) { return new ListTile( title: new Row( children: [ new Checkbox( value: privileges[index].isChecked == null ? false : privileges[index].isChecked, activeColor: primaryColor, onChanged: (bool value) { setState(() { privileges[index].isChecked = value; }); }), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ new Text( userModel.getPrivileges[index].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]), ), ), ], ), ], )); }), ); } 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)), ), validator: (value) { if (value.isEmpty) { return "Please enter phone number"; } return null; }, ), new FlatButton( onPressed: () { if (!_formKey.currentState.validate()) return; 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 saveButton = Container( padding: EdgeInsets.only( left: 24.0, right: 24.0, ), child: Container( height: 45.0, color: primaryColor, child: ButtonTheme( minWidth: 900.0, height: 100.0, child: FlatButton( onPressed: _save, child: LocalText( context, 'employee.save', color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ); final addButton = Container( padding: EdgeInsets.only( left: 24.0, right: 24.0, ), child: Container( height: 45.0, color: primaryColor, child: ButtonTheme( minWidth: 900.0, height: 100.0, child: FlatButton( onPressed: () { if (!_formKey.currentState.validate()) return; _add(context); }, child: LocalText( context, 'employee.add', color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), ), ), ); return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( backgroundColor: primaryColor, title: LocalText( context, "employee.item.title", fontSize: 20, color: Colors.white, ), actions: [ widget.employee == null || !mainModel.showHistoryBtn() ? Container() : IconButton( icon: Icon(Icons.history), onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DocumentLogPage( docID: widget.employee.docID)), ); }, ), ], ), body: Form( key: _formKey, child: Column( children: [ Expanded( child: ListView( shrinkWrap: true, padding: EdgeInsets.only(left: 24.0, right: 24.0), children: [ widget.employee == null ? phoneInputbox(context, () => _findUser(context)) : phoneNumberBox, widget.employee == null ? this.isSend ? namebox : Container() : namebox, showprivilegeList(context, userModel) ], ), ), widget.employee == null ? addButton : saveButton, 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.employee == null) return; var employeeModel = Provider.of(context); try { await employeeModel.updatePrivileges( widget.employee.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; }); } } }