Commit d31b1ca6 authored by Dio Maulana's avatar Dio Maulana

perbaharui dialog home

parent b1f93059
...@@ -146,6 +146,14 @@ class Api { ...@@ -146,6 +146,14 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer); return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else { } else {
if (jsonObject['status'] == "ok") { if (jsonObject['status'] == "ok") {
// simpan NIK user
List<String> listAbsentUser = getListAbsentUser();
int indexList =
listAbsentUser.indexWhere((element) => element == nik);
if (indexList == -1) {
listAbsentUser.add(nik);
setListAbsentUser(listAbsentUser);
}
return ApiResponse( return ApiResponse(
error: false, error: false,
msg: Strings.succesGetData, msg: Strings.succesGetData,
...@@ -184,6 +192,14 @@ class Api { ...@@ -184,6 +192,14 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer); return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else { } else {
if (jsonObject['status'] == "ok") { if (jsonObject['status'] == "ok") {
// simpan NIK user
List<String> listAbsentUser = getListAbsentUser();
int indexList =
listAbsentUser.indexWhere((element) => element == nik);
if (indexList == -1) {
listAbsentUser.add(nik);
setListAbsentUser(listAbsentUser);
}
return ApiResponse( return ApiResponse(
error: false, error: false,
msg: Strings.succesGetData, msg: Strings.succesGetData,
......
...@@ -2,6 +2,7 @@ import 'package:excelso_attendance/main.dart'; ...@@ -2,6 +2,7 @@ import 'package:excelso_attendance/main.dart';
const String _latitude = 'laU'; const String _latitude = 'laU';
const String _longitude = 'loU'; const String _longitude = 'loU';
const String _listAbsent = 'listAbsent';
String? getLatitude() { String? getLatitude() {
return prefs.getString(_latitude); return prefs.getString(_latitude);
...@@ -20,3 +21,11 @@ Future<String> setLongitude(String value) async { ...@@ -20,3 +21,11 @@ Future<String> setLongitude(String value) async {
prefs.setString(_longitude, value); prefs.setString(_longitude, value);
return value; return value;
} }
Future<void> setListAbsentUser(List<String> value) async {
prefs.setStringList(_listAbsent, value);
}
List<String> getListAbsentUser() {
return prefs.getStringList(_listAbsent) ?? [];
}
import 'dart:async'; import 'dart:async';
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:excelso_attendance/api/api.dart'; import 'package:excelso_attendance/api/api.dart';
import 'package:excelso_attendance/helper/arguments/route_args.dart'; import 'package:excelso_attendance/helper/arguments/route_args.dart';
import 'package:excelso_attendance/helper/component/button.dart'; import 'package:excelso_attendance/helper/component/button.dart';
import 'package:excelso_attendance/helper/component/text_field.dart'; // import 'package:excelso_attendance/helper/component/text_field.dart';
import 'package:excelso_attendance/helper/global_function/date_time.dart'; import 'package:excelso_attendance/helper/global_function/date_time.dart';
import 'package:excelso_attendance/helper/pref.dart';
import 'package:excelso_attendance/helper/widget_responsive.dart'; import 'package:excelso_attendance/helper/widget_responsive.dart';
import 'package:excelso_attendance/models/branch.dart'; import 'package:excelso_attendance/models/branch.dart';
import 'package:excelso_attendance/models/shift.dart'; import 'package:excelso_attendance/models/shift.dart';
...@@ -55,9 +57,13 @@ class BodyWidget extends StatefulWidget { ...@@ -55,9 +57,13 @@ class BodyWidget extends StatefulWidget {
} }
class _BodyWidgetState extends State<BodyWidget> { class _BodyWidgetState extends State<BodyWidget> {
final TextEditingController nikController = TextEditingController(); // final TextEditingController nikController = TextEditingController();
int selectedOutlet = 0; int selectedOutlet = 0;
String nikUser = "";
List<String> dataUserAbsent = getListAbsentUser();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
...@@ -158,63 +164,135 @@ class _BodyWidgetState extends State<BodyWidget> { ...@@ -158,63 +164,135 @@ class _BodyWidgetState extends State<BodyWidget> {
padding: EdgeInsets.all( padding: EdgeInsets.all(
AppPadding.p15, AppPadding.p15,
), ),
child: InputTextField( // child: InputTextField(
controller: nikController,
labelText: "NIK",
borderSideActive: true,
hintText: "NIK",
),
// child: AutoCompleteTextField(
// controller: nikController, // controller: nikController,
// itemSubmitted: (item) { // labelText: "NIK",
// nikController.text = item; // borderSideActive: true,
// }, // hintText: "NIK",
// clearOnSubmit: false,
// key: autoCompleteKey,
// suggestions: suggestion,
// itemBuilder: (c, item) {
// return Container(
// padding: EdgeInsets.all(AppPadding.p20),
// child: Row(
// children: [
// Text(
// item,
// style: getRegularStyle(
// color: Colors.grey,
// ),
// )
// ],
// ),
// );
// },
// itemSorter: (a, b) {
// return a.compareTo(b);
// },
// itemFilter: (item, query) {
// return item.toString().startsWith(query.toLowerCase());
// },
// decoration: InputDecoration(
// hintText: "NIK",
// hintStyle: getRegularStyle(
// color: Colors.grey,
// ),
// enabledBorder: OutlineInputBorder(
// borderSide:
// BorderSide(width: 0.4, color: ColorManager.grey),
// borderRadius: BorderRadius.circular(5),
// ),
// focusedBorder: OutlineInputBorder(
// borderSide:
// BorderSide(width: 0.4, color: ColorManager.grey),
// borderRadius: BorderRadius.circular(5),
// ),
// disabledBorder: OutlineInputBorder(
// borderSide:
// BorderSide(width: 0.4, color: ColorManager.grey),
// borderRadius: BorderRadius.circular(5),
// ),
// ),
// ), // ),
child: Autocomplete(
optionsBuilder: (TextEditingValue textEditingValue) {
if (textEditingValue.text.isEmpty) {
return const Iterable<String>.empty();
} else {
return dataUserAbsent.where(
(data) => data
.toLowerCase()
.contains(textEditingValue.text.toLowerCase()),
);
}
},
onSelected: ((selected) {
setState(() {
nikUser = selected;
});
}),
optionsViewBuilder: (c, onSelected, options) {
List<String> listNik = options.toList();
return Container(
margin: const EdgeInsets.only(
right: 70,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
color: ColorManager.backgroundColor,
border: Border.all(
width: 0.2,
color: Colors.grey,
),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
blurRadius: 2,
offset: const Offset(5, 5),
),
]),
child: ListView.builder(
padding: EdgeInsets.zero,
itemCount: listNik.length,
itemBuilder: ((context, index) {
return GestureDetector(
onTap: () {
onSelected(listNik[index]);
},
child: Container(
margin: const EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
padding: EdgeInsets.symmetric(
horizontal: AppPadding.p10,
vertical: AppPadding.p14,
),
decoration: BoxDecoration(
border: (index + 1 != listNik.length)
? Border(
bottom: BorderSide(
width: 0.5,
color: ColorManager.grey
.withOpacity(0.8),
),
)
: null,
),
child: Text(
listNik[index],
style: getRegularStyle(
color: Colors.black,
fontSize: 20,
fontFamily: FontConstants.poppins,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
);
}),
),
);
},
fieldViewBuilder:
(c, controller, focusNode, onEditingComplete) {
return TextField(
onChanged: (teks) {
setState(() {
nikUser = teks;
});
},
controller: controller,
focusNode: focusNode,
onEditingComplete: () {
setState(() {
if (focusNode.hasFocus) {
focusNode.unfocus();
}
});
},
decoration: InputDecoration(
hintText: "NIK",
hintStyle: getRegularStyle(
color: Colors.grey,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 0.4,
color: ColorManager.grey,
),
borderRadius: BorderRadius.circular(5),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 0.4, color: ColorManager.grey),
borderRadius: BorderRadius.circular(5),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 0.4, color: ColorManager.grey),
borderRadius: BorderRadius.circular(5),
),
),
);
},
),
), ),
), ),
Container( Container(
...@@ -225,29 +303,30 @@ class _BodyWidgetState extends State<BodyWidget> { ...@@ -225,29 +303,30 @@ class _BodyWidgetState extends State<BodyWidget> {
child: Row( child: Row(
children: [ children: [
Expanded( Expanded(
child: CustomButton( child: CustomButton(
text: "Masuk", text: "Masuk",
onTap: () { onTap: () {
if (nikController.text.isEmpty) { if (nikUser.isEmpty) {
EasyLoading.showToast( EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu", "Silakan isi NIK terlebih dahulu",
); );
} else { } else {
showModalBottomSheet( showModalBottomSheet(
backgroundColor: ColorManager.backgroundColor, backgroundColor: ColorManager.backgroundColor,
isScrollControlled: true, isScrollControlled: true,
context: context, context: context,
builder: (c) { builder: (c) {
return WidgetSelectShift( return WidgetSelectShift(
shiftList: widget.shiftList, shiftList: widget.shiftList,
branchModel: branchModel:
widget.nearestBranch[selectedOutlet], widget.nearestBranch[selectedOutlet],
nik: nikController.text, nik: nikUser,
); );
}); });
} }
}, },
)), ),
),
SizedBox( SizedBox(
width: AppMargin.m20, width: AppMargin.m20,
), ),
...@@ -255,7 +334,7 @@ class _BodyWidgetState extends State<BodyWidget> { ...@@ -255,7 +334,7 @@ class _BodyWidgetState extends State<BodyWidget> {
child: CustomButton( child: CustomButton(
text: "Keluar", text: "Keluar",
onTap: () async { onTap: () async {
if (nikController.text.isEmpty) { if (nikUser.isEmpty) {
EasyLoading.showToast( EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu", "Silakan isi NIK terlebih dahulu",
); );
...@@ -266,7 +345,7 @@ class _BodyWidgetState extends State<BodyWidget> { ...@@ -266,7 +345,7 @@ class _BodyWidgetState extends State<BodyWidget> {
); );
Api.getUserProfile( Api.getUserProfile(
widget.nearestBranch[selectedOutlet].id, widget.nearestBranch[selectedOutlet].id,
nikController.text, nikUser,
).then((apiResponse) { ).then((apiResponse) {
EasyLoading.dismiss(); EasyLoading.dismiss();
if (apiResponse.error) { if (apiResponse.error) {
...@@ -279,7 +358,7 @@ class _BodyWidgetState extends State<BodyWidget> { ...@@ -279,7 +358,7 @@ class _BodyWidgetState extends State<BodyWidget> {
isIn: false, isIn: false,
branchModel: branchModel:
widget.nearestBranch[selectedOutlet], widget.nearestBranch[selectedOutlet],
nik: nikController.text, nik: nikUser,
), ),
); );
} }
...@@ -353,70 +432,180 @@ class _SelectOutletState extends State<SelectOutlet> { ...@@ -353,70 +432,180 @@ class _SelectOutletState extends State<SelectOutlet> {
fontSize: 16, fontSize: 16,
), ),
), ),
GestureDetector( const SizedBox(
onTap: () { height: 10,
showModalBottomSheet( ),
backgroundColor: ColorManager.backgroundColor, DropdownButtonFormField2(
isScrollControlled: true, decoration: InputDecoration(
context: context, // hintText: "NIK",
builder: (c) { //Add isDense true and zero Padding.
return WidgetSelectOutlet( //Add Horizontal padding using buttonPadding and Vertical padding by increasing buttonHeight instead of add Padding here so that The whole TextField Button become clickable, and also the dropdown menu open under The whole TextField Button.
nearestBranch: widget.nearestBranch, isDense: true,
selectedOutlet: selectedBranchFromList, contentPadding: const EdgeInsets.symmetric(
onSelected: ((int val) { // horizontal: 18,
setState(() { vertical: 15,
selectedBranchFromList = val;
widget.onSelected!(val);
});
}),
);
});
},
child: Container(
margin: const EdgeInsets.only(
top: 10,
), ),
width: double.infinity, enabledBorder: OutlineInputBorder(
decoration: BoxDecoration( borderSide: BorderSide(width: 0.4, color: ColorManager.grey),
border: Border.all(width: 0.2, color: Colors.grey),
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
color: ColorManager.backgroundColor,
), ),
child: Container( focusedBorder: OutlineInputBorder(
padding: const EdgeInsets.symmetric( borderSide: BorderSide(width: 0.4, color: ColorManager.grey),
horizontal: 10, borderRadius: BorderRadius.circular(5),
vertical: 15, ),
), disabledBorder: OutlineInputBorder(
child: Row( borderSide: BorderSide(width: 0.4, color: ColorManager.grey),
mainAxisAlignment: MainAxisAlignment.spaceBetween, borderRadius: BorderRadius.circular(5),
children: [ ),
Expanded( //Add more decoration as you want here
child: Text( //Add label If you want but add hint outside the decoration to be aligned in the button perfectly.
"${widget.nearestBranch[selectedBranchFromList].name} (${widget.nearestBranch[selectedBranchFromList].code})", ),
style: getRegularStyle( isExpanded: true,
color: ColorManager.grey, // hint: Text(
fontSize: 16, // "${widget.nearestBranch[0].name} (${widget.nearestBranch[0].code})",
), // style: const TextStyle(fontSize: 14),
maxLines: 2, // ),
overflow: TextOverflow.ellipsis, hint: Row(
), mainAxisAlignment: MainAxisAlignment.spaceBetween,
), crossAxisAlignment: CrossAxisAlignment.center,
Icon( children: [
Icons.arrow_drop_down, Expanded(
color: ColorManager.grey, child: Text(
size: 30, widget.nearestBranch[0].code,
style: getRegularStyle(
color: Colors.black,
fontSize: 18,
fontFamily: FontConstants.poppins,
), ),
// Text( maxLines: 1,
// "Ubah", overflow: TextOverflow.ellipsis,
// style: getRegularStyle( ),
// color: ColorManager.link,
// ),
// )
],
), ),
const SizedBox(
width: 10,
),
Text(
"${widget.nearestBranch[0].distance} Km",
style: getRegularStyle(
color: Colors.black,
fontSize: 12,
fontFamily: FontConstants.poppins,
),
)
],
),
iconStyleData: const IconStyleData(
icon: Icon(
Icons.arrow_drop_down,
color: Colors.black45,
), ),
), ),
), items: widget.nearestBranch
.map((branch) => DropdownMenuItem<String>(
value: branch.id,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Text(
branch.code,
style: getRegularStyle(
color: Colors.black,
fontSize: 18,
fontFamily: FontConstants.poppins,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(
width: 10,
),
Text(
"${branch.distance} Km",
style: getRegularStyle(
color: Colors.black,
fontSize: 12,
fontFamily: FontConstants.poppins,
),
)
],
),
))
.toList(),
onChanged: (value) {
int selectedBranch = widget.nearestBranch
.indexWhere((element) => element.id == value);
setState(() {
widget.onSelected!(selectedBranch);
});
},
)
// GestureDetector(
// onTap: () {
// showModalBottomSheet(
// backgroundColor: ColorManager.backgroundColor,
// isScrollControlled: true,
// context: context,
// builder: (c) {
// return WidgetSelectOutlet(
// nearestBranch: widget.nearestBranch,
// selectedOutlet: selectedBranchFromList,
// onSelected: ((int val) {
// setState(() {
// selectedBranchFromList = val;
// widget.onSelected!(val);
// });
// }),
// );
// });
// },
// child: Container(
// margin: const EdgeInsets.only(
// top: 10,
// ),
// width: double.infinity,
// decoration: BoxDecoration(
// border: Border.all(width: 0.2, color: Colors.grey),
// borderRadius: BorderRadius.circular(5),
// color: ColorManager.backgroundColor,
// ),
// child: Container(
// padding: const EdgeInsets.symmetric(
// horizontal: 10,
// vertical: 15,
// ),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Expanded(
// child: Text(
// "${widget.nearestBranch[selectedBranchFromList].name} (${widget.nearestBranch[selectedBranchFromList].code})",
// style: getRegularStyle(
// color: ColorManager.grey,
// fontSize: 16,
// ),
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// ),
// ),
// Icon(
// Icons.arrow_drop_down,
// color: ColorManager.grey,
// size: 30,
// ),
// // Text(
// // "Ubah",
// // style: getRegularStyle(
// // color: ColorManager.link,
// // ),
// // )
// ],
// ),
// ),
// ),
// ),
], ],
), ),
), ),
......
...@@ -145,6 +145,14 @@ packages: ...@@ -145,6 +145,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.5" version: "1.0.5"
dropdown_button2:
dependency: "direct main"
description:
name: dropdown_button2
sha256: "374f2390161bf782b4896f0b1b24cbb2b5daaa1cfb11047c3307461dcdf44e07"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
......
...@@ -32,6 +32,7 @@ dependencies: ...@@ -32,6 +32,7 @@ dependencies:
autocomplete_textfield: ^2.0.1 autocomplete_textfield: ^2.0.1
camera: ^0.10.5+2 camera: ^0.10.5+2
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.2
dropdown_button2: ^2.1.3
flutter: flutter:
sdk: flutter sdk: flutter
flutter_easyloading: ^3.0.5 flutter_easyloading: ^3.0.5
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment