Files
fcs/lib/pages/staff/staff_editor.dart

283 lines
8.4 KiB
Dart
Raw Normal View History

2020-10-07 02:33:06 +06:30
import 'package:fcs/domain/entities/user.dart';
2020-10-11 02:17:23 +06:30
import 'package:fcs/domain/vo/privilege.dart';
2020-10-07 02:33:06 +06:30
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/localization/app_translations.dart';
import 'package:fcs/pages/main/model/language_model.dart';
import 'package:fcs/pages/main/util.dart';
2020-10-11 02:17:23 +06:30
import 'package:fcs/pages/staff/model/staff_model.dart';
2020-10-07 02:33:06 +06:30
import 'package:fcs/pages/widgets/display_text.dart';
2024-01-25 17:40:35 +06:30
import 'package:fcs/pages/widgets/local_app_bar.dart';
2020-10-07 02:33:06 +06:30
import 'package:fcs/pages/widgets/progress.dart';
2020-09-13 21:49:39 +06:30
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
typedef void FindCallBack();
class StaffEditor extends StatefulWidget {
2021-09-10 14:29:55 +06:30
final User? staff;
2020-09-13 21:49:39 +06:30
const StaffEditor({this.staff});
@override
_StaffEditorState createState() => _StaffEditorState();
}
class _StaffEditorState extends State<StaffEditor> {
TextEditingController _phoneInput = new TextEditingController();
bool _isLoading = false;
2021-09-10 14:29:55 +06:30
late User user;
User? selectedUser;
2020-09-13 21:49:39 +06:30
List<Privilege> privileges = [];
bool isNew = true;
@override
void initState() {
super.initState();
privileges = Provider.of<StaffModel>(context, listen: false).privileges;
isNew = widget.staff == null;
user = User();
if (!isNew) {
2024-01-25 17:40:35 +06:30
user = User(
name: widget.staff!.name, phoneNumber: widget.staff!.phoneNumber);
2021-09-10 14:29:55 +06:30
user.privileges = widget.staff!.privileges;
2020-09-13 21:49:39 +06:30
privileges.forEach((p) => user.privileges.contains(p.id)
? p.isChecked = true
: p.isChecked = false);
} else {
user.name = "";
user.phoneNumber = "";
privileges.forEach((p) => p.isChecked = false);
}
}
List<Widget> showprivilegeList(BuildContext context) {
return privileges.map((p) {
return new ListTile(
title: InkWell(
onTap: () {
setState(() {
2021-09-10 15:23:13 +06:30
p.isChecked = p.isChecked == null ? true : !p.isChecked!;
2020-09-13 21:49:39 +06:30
});
},
child: new Row(
children: <Widget>[
new Checkbox(
value: p.isChecked == null ? false : p.isChecked,
activeColor: primaryColor,
2024-01-25 17:40:35 +06:30
side: BorderSide(color: Colors.black38, width: 2),
2021-09-10 14:29:55 +06:30
onChanged: (bool? value) {
2024-01-25 17:40:35 +06:30
if (value != null)
setState(() {
p.isChecked = value;
});
2020-09-13 21:49:39 +06:30
}),
2020-10-11 02:17:23 +06:30
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: Icon(p.iconData, size: 50, color: Colors.black38),
),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Text(
2024-01-25 17:40:35 +06:30
p.name ?? "",
2020-10-11 02:17:23 +06:30
style: TextStyle(fontSize: 15.0, color: primaryColor),
),
2021-09-10 15:23:13 +06:30
Text(p.desc ?? "",
2020-10-11 02:17:23 +06:30
style: TextStyle(fontSize: 13, color: Colors.grey[600]))
],
),
2020-09-13 21:49:39 +06:30
),
],
),
));
}).toList();
}
Widget phoneSearchbox(BuildContext context, FindCallBack findCallBack) {
var languageModel = Provider.of<LanguageModel>(context);
return Container(
2020-09-15 07:13:41 +06:30
padding: EdgeInsets.only(
bottom: 25,
left: 8,
),
2020-09-13 21:49:39 +06:30
child: Stack(
2020-09-15 07:13:41 +06:30
alignment: const Alignment(1, 1.0),
2020-09-13 21:49:39 +06:30
children: <Widget>[
TextFormField(
controller: _phoneInput,
autofocus: false,
cursorColor: primaryColor,
keyboardType: TextInputType.phone,
style: textStyle,
decoration: new InputDecoration(
2020-09-15 07:13:41 +06:30
labelText:
2021-09-10 14:29:55 +06:30
AppTranslations.of(context)!.text('staff.phone.search'),
2020-09-13 21:49:39 +06:30
labelStyle: languageModel.isEng ? labelStyle : labelStyleMM,
2020-09-15 07:13:41 +06:30
// icon: Icon(
// Icons.search,
// color: primaryColor,
// ),
2020-09-13 21:49:39 +06:30
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: primaryColor, width: 1.0)),
),
),
2020-09-15 07:13:41 +06:30
new IconButton(
2020-09-13 21:49:39 +06:30
onPressed: () {
findCallBack();
},
2020-09-15 07:13:41 +06:30
icon: new Icon(Icons.search, size: 25, color: primaryColor))
2020-09-13 21:49:39 +06:30
],
));
}
@override
Widget build(BuildContext context) {
final namebox = DisplayText(
text: user.name,
2020-10-08 16:53:43 +06:30
labelTextKey: "customer.name",
2020-09-13 21:49:39 +06:30
iconData: Icons.person,
);
var phoneNumberBox = Row(
children: <Widget>[
Expanded(
child: DisplayText(
text: user.phoneNumber,
2020-10-08 16:53:43 +06:30
labelTextKey: "customer.phone",
2020-09-13 21:49:39 +06:30
iconData: Icons.phone,
)),
2020-09-15 07:13:41 +06:30
isNew
? Container()
: IconButton(
icon: Icon(Icons.open_in_new, color: primaryColor),
2021-09-10 15:23:13 +06:30
onPressed: () => call(context, user.phoneNumber!)),
2020-09-13 21:49:39 +06:30
],
);
final updateButton = fcsButton(
context,
getLocalString(context, 'staff.update'),
callack: _save,
);
final addButton = fcsButton(
context,
getLocalString(context, 'staff.add'),
callack: _add,
);
return LocalProgress(
inAsyncCall: _isLoading,
child: Scaffold(
2024-01-25 17:40:35 +06:30
appBar: LocalAppBar(
labelKey: "staff.form.title",
backgroundColor: Colors.white,
labelColor: primaryColor,
arrowColor: primaryColor),
2020-09-13 21:49:39 +06:30
body: Padding(
2020-09-15 07:13:41 +06:30
padding: const EdgeInsets.only(left: 12.0, right: 12),
child: ListView(
2020-09-13 21:49:39 +06:30
children: <Widget>[
isNew
? phoneSearchbox(context, () => _findUser(context))
: Container(),
phoneNumberBox,
namebox,
2020-09-18 04:04:21 +06:30
Padding(
padding: const EdgeInsets.only(top: 18.0),
2024-01-25 17:40:35 +06:30
child: Text("Privileges", style: TextStyle(fontSize: 15)),
2020-09-18 04:04:21 +06:30
),
2020-09-15 07:13:41 +06:30
Column(
children: showprivilegeList(context),
2020-09-13 21:49:39 +06:30
),
2020-10-11 02:17:23 +06:30
SizedBox(
height: 10,
),
2020-09-13 21:49:39 +06:30
Container(
child: isNew ? addButton : updateButton,
),
SizedBox(
height: 10,
)
],
),
),
));
}
_add() async {
if (isNew && selectedUser == null) {
showMsgDialog(context, "Error", "Invalid user!");
return;
}
setState(() {
_isLoading = true;
});
StaffModel staffModel = Provider.of<StaffModel>(context, listen: false);
try {
2024-01-25 17:40:35 +06:30
await staffModel.updatePrivileges(
this.selectedUser!.id!, privilegesIDs());
2020-09-13 21:49:39 +06:30
Navigator.pop(context);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
List<String> privilegesIDs() {
2021-09-10 15:23:13 +06:30
return this.privileges.where((p) => p.isChecked!).map((p) => p.id).toList();
2020-09-13 21:49:39 +06:30
}
_save() async {
setState(() {
_isLoading = true;
});
if (widget.staff == null) return;
StaffModel staffModel = Provider.of<StaffModel>(context, listen: false);
try {
2021-09-10 15:23:13 +06:30
await staffModel.updatePrivileges(widget.staff!.id!, privilegesIDs());
2020-09-13 21:49:39 +06:30
Navigator.pop(context);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
_findUser(BuildContext context) async {
StaffModel staffModel = Provider.of<StaffModel>(context, listen: false);
2020-09-15 07:13:41 +06:30
if (_phoneInput.text == "") return;
2020-09-13 21:49:39 +06:30
setState(() {
_isLoading = true;
});
try {
2021-09-10 16:48:20 +06:30
User? _user = await staffModel.findUser(_phoneInput.text);
2020-09-13 21:49:39 +06:30
if (_user == null) {
showMsgDialog(context, "Error", _phoneInput.text + " not found!");
return;
}
this.selectedUser = _user;
this.user = _user;
setState(() {
2024-01-23 16:28:08 +06:30
if (user.privileges.isNotEmpty) {
2020-09-13 21:49:39 +06:30
privileges.forEach((p) => user.privileges.contains(p.id)
? p.isChecked = true
: p.isChecked = false);
}
});
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
}