Commit d31b1ca6 authored by Dio Maulana's avatar Dio Maulana

perbaharui dialog home

parent b1f93059
......@@ -146,6 +146,14 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else {
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(
error: false,
msg: Strings.succesGetData,
......@@ -184,6 +192,14 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else {
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(
error: false,
msg: Strings.succesGetData,
......
......@@ -2,6 +2,7 @@ import 'package:excelso_attendance/main.dart';
const String _latitude = 'laU';
const String _longitude = 'loU';
const String _listAbsent = 'listAbsent';
String? getLatitude() {
return prefs.getString(_latitude);
......@@ -20,3 +21,11 @@ Future<String> setLongitude(String value) async {
prefs.setString(_longitude, 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 'package:dropdown_button2/dropdown_button2.dart';
import 'package:excelso_attendance/api/api.dart';
import 'package:excelso_attendance/helper/arguments/route_args.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/pref.dart';
import 'package:excelso_attendance/helper/widget_responsive.dart';
import 'package:excelso_attendance/models/branch.dart';
import 'package:excelso_attendance/models/shift.dart';
......@@ -55,9 +57,13 @@ class BodyWidget extends StatefulWidget {
}
class _BodyWidgetState extends State<BodyWidget> {
final TextEditingController nikController = TextEditingController();
// final TextEditingController nikController = TextEditingController();
int selectedOutlet = 0;
String nikUser = "";
List<String> dataUserAbsent = getListAbsentUser();
@override
Widget build(BuildContext context) {
return Column(
......@@ -158,63 +164,135 @@ class _BodyWidgetState extends State<BodyWidget> {
padding: EdgeInsets.all(
AppPadding.p15,
),
child: InputTextField(
controller: nikController,
labelText: "NIK",
borderSideActive: true,
hintText: "NIK",
),
// child: AutoCompleteTextField(
// child: InputTextField(
// controller: nikController,
// itemSubmitted: (item) {
// nikController.text = item;
// },
// 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),
// ),
// ),
// labelText: "NIK",
// borderSideActive: true,
// hintText: "NIK",
// ),
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(
......@@ -225,29 +303,30 @@ class _BodyWidgetState extends State<BodyWidget> {
child: Row(
children: [
Expanded(
child: CustomButton(
text: "Masuk",
onTap: () {
if (nikController.text.isEmpty) {
EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu",
);
} else {
showModalBottomSheet(
backgroundColor: ColorManager.backgroundColor,
isScrollControlled: true,
context: context,
builder: (c) {
return WidgetSelectShift(
shiftList: widget.shiftList,
branchModel:
widget.nearestBranch[selectedOutlet],
nik: nikController.text,
);
});
}
},
)),
child: CustomButton(
text: "Masuk",
onTap: () {
if (nikUser.isEmpty) {
EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu",
);
} else {
showModalBottomSheet(
backgroundColor: ColorManager.backgroundColor,
isScrollControlled: true,
context: context,
builder: (c) {
return WidgetSelectShift(
shiftList: widget.shiftList,
branchModel:
widget.nearestBranch[selectedOutlet],
nik: nikUser,
);
});
}
},
),
),
SizedBox(
width: AppMargin.m20,
),
......@@ -255,7 +334,7 @@ class _BodyWidgetState extends State<BodyWidget> {
child: CustomButton(
text: "Keluar",
onTap: () async {
if (nikController.text.isEmpty) {
if (nikUser.isEmpty) {
EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu",
);
......@@ -266,7 +345,7 @@ class _BodyWidgetState extends State<BodyWidget> {
);
Api.getUserProfile(
widget.nearestBranch[selectedOutlet].id,
nikController.text,
nikUser,
).then((apiResponse) {
EasyLoading.dismiss();
if (apiResponse.error) {
......@@ -279,7 +358,7 @@ class _BodyWidgetState extends State<BodyWidget> {
isIn: false,
branchModel:
widget.nearestBranch[selectedOutlet],
nik: nikController.text,
nik: nikUser,
),
);
}
......@@ -353,70 +432,180 @@ class _SelectOutletState extends State<SelectOutlet> {
fontSize: 16,
),
),
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,
const SizedBox(
height: 10,
),
DropdownButtonFormField2(
decoration: InputDecoration(
// hintText: "NIK",
//Add isDense true and zero Padding.
//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.
isDense: true,
contentPadding: const EdgeInsets.symmetric(
// horizontal: 18,
vertical: 15,
),
width: double.infinity,
decoration: BoxDecoration(
border: Border.all(width: 0.2, color: Colors.grey),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(width: 0.4, color: ColorManager.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,
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),
),
//Add more decoration as you want here
//Add label If you want but add hint outside the decoration to be aligned in the button perfectly.
),
isExpanded: true,
// hint: Text(
// "${widget.nearestBranch[0].name} (${widget.nearestBranch[0].code})",
// style: const TextStyle(fontSize: 14),
// ),
hint: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Text(
widget.nearestBranch[0].code,
style: getRegularStyle(
color: Colors.black,
fontSize: 18,
fontFamily: FontConstants.poppins,
),
// Text(
// "Ubah",
// style: getRegularStyle(
// color: ColorManager.link,
// ),
// )
],
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
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:
url: "https://pub.dev"
source: hosted
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:
dependency: transitive
description:
......
......@@ -32,6 +32,7 @@ dependencies:
autocomplete_textfield: ^2.0.1
camera: ^0.10.5+2
cupertino_icons: ^1.0.2
dropdown_button2: ^2.1.3
flutter:
sdk: flutter
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