Commit 462b1b21 authored by Dio Maulana's avatar Dio Maulana

final desiign

parent ba68464a
......@@ -30,6 +30,7 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else {
if (jsonObject['status'] == "ok") {
print(jsonObject);
List<BranchModel> branchList = [];
List<dynamic> branchs = jsonObject['data']['branch_list'];
......@@ -42,6 +43,10 @@ class Api {
}
ConstantString.outletDistance =
jsonObject['data']['max_distance'].toString();
ConstantString.logoUrlHome =
jsonObject['data']['logo_attendance_home'];
ConstantString.logoUrlCamera =
jsonObject['data']['logo_attendance_camera'];
return ApiResponse(
error: false,
msg: Strings.succesGetData,
......@@ -110,6 +115,7 @@ class Api {
Map<String, dynamic> data = {
"branch_id": branchId,
"nik": nik,
"brand_code": brandCode,
};
String bodies = jsonEncode(data);
dynamic jsonObject =
......@@ -118,6 +124,7 @@ class Api {
return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else {
if (jsonObject['status'] == "ok") {
print(jsonObject);
Map<String, dynamic> user = jsonObject['data']['user'];
return ApiResponse(
error: false,
......@@ -143,6 +150,7 @@ class Api {
try {
Map<String, dynamic> data = {
"branch_id": branchId,
"brand_code": brandCode,
"nik": nik,
"shift_id": shiftId,
"user_lat": position.latitude,
......@@ -196,6 +204,7 @@ class Api {
try {
Map<String, dynamic> data = {
"branch_id": branchId,
"brand_code": brandCode,
"nik": nik,
"user_lat": position.latitude,
"user_long": position.longitude,
......
......@@ -9,13 +9,19 @@ class AbsentCameraArguments {
final ShiftModel? shiftModel;
final ProfileModel profile;
final String nik;
final String shiftNameSelected;
final String shiftStartTime;
final String shiftEndTime;
AbsentCameraArguments({
required this.isIn,
required this.branchModel,
required this.nik,
required this.profile,
required this.shiftStartTime,
required this.shiftEndTime,
this.shiftModel,
required this.shiftNameSelected,
});
}
......@@ -34,11 +40,17 @@ class AbsentSuccessArguments {
final ProfileModel profil;
final String nik;
final bool isIn;
final String shiftStart;
final String shiftEnd;
final String shiftName;
AbsentSuccessArguments({
required this.absentSuccess,
required this.profil,
required this.nik,
required this.isIn,
required this.shiftStart,
required this.shiftEnd,
required this.shiftName,
});
}
......@@ -3,6 +3,7 @@ import 'package:excelso_attendance/main.dart';
const String _latitude = 'laU';
const String _longitude = 'loU';
const String _listAbsent = 'listAbsent';
const String _outletLogo = '_logo';
String? getLatitude() {
return prefs.getString(_latitude);
......@@ -29,3 +30,11 @@ Future<void> setListAbsentUser(List<String> value) async {
List<String> getListAbsentUser() {
return prefs.getStringList(_listAbsent) ?? [];
}
Future<void> setLogo(String value) async {
await prefs.setString(_outletLogo, value);
}
String getLogo() {
return prefs.getString(_outletLogo) ?? "";
}
......@@ -4,6 +4,9 @@ class ProfileModel {
String name;
bool attendanceIn;
bool attendanceOut;
String shiftSelectedName;
String shiftStart;
String shiftEnd;
ProfileModel({
required this.id,
......@@ -11,6 +14,9 @@ class ProfileModel {
required this.name,
required this.attendanceIn,
required this.attendanceOut,
required this.shiftSelectedName,
required this.shiftStart,
required this.shiftEnd,
});
factory ProfileModel.json(Map<String, dynamic> json) {
......@@ -20,6 +26,9 @@ class ProfileModel {
name: json['name'],
attendanceIn: json['today_attendance_in'],
attendanceOut: json['today_attendance_out'],
shiftSelectedName: json['shift_name'] ?? "",
shiftStart: json['shift_start'] ?? "",
shiftEnd: json['shift_end'] ?? "",
);
}
}
......@@ -13,6 +13,7 @@ import 'package:excelso_attendance/models/absent.dart';
import 'package:excelso_attendance/models/branch.dart';
import 'package:excelso_attendance/models/profile.dart';
import 'package:excelso_attendance/models/shift.dart';
import 'package:excelso_attendance/resource/constanta_string.dart';
import 'package:excelso_attendance/resource/routes.dart';
import 'package:excelso_attendance/resource/strings.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
......@@ -20,7 +21,6 @@ import 'dart:typed_data';
import 'package:camera/camera.dart';
import 'package:excelso_attendance/helper/component/button.dart';
import 'package:excelso_attendance/helper/global_function/date_time.dart';
import 'package:excelso_attendance/resource/assets.dart';
import 'package:excelso_attendance/resource/colors.dart';
import 'package:excelso_attendance/resource/font.dart';
......@@ -38,6 +38,9 @@ class AbsentCameraView extends StatefulWidget {
required this.nik,
required this.profile,
this.shiftModel,
required this.shiftNameSelected,
required this.shiftStartTime,
required this.shiftEndTime,
});
final bool isIn;
......@@ -45,6 +48,9 @@ class AbsentCameraView extends StatefulWidget {
final ShiftModel? shiftModel;
final ProfileModel profile;
final String nik;
final String shiftNameSelected;
final String shiftStartTime;
final String shiftEndTime;
@override
State<AbsentCameraView> createState() => _AbsentCameraViewState();
......@@ -422,9 +428,19 @@ class _AbsentCameraViewState extends State<AbsentCameraView> {
const SizedBox(
height: 15,
),
WidgetAbsentAndTime(
isIn: widget.isIn,
outletName: widget.branchModel.name,
// Expanded(
// child: WidgetAbsentAndTime(
// isIn: widget.isIn,
// outletName: widget.branchModel.name,
// profile: widget.profile,
// nik: widget.nik,
// ),
// ),
InfoUserAttendance(
widget: widget,
shift: widget.shiftNameSelected,
shiftStart: widget.shiftStartTime,
shiftEnd: widget.shiftEndTime,
),
const Spacer(),
(pictureIsTaken)
......@@ -475,11 +491,15 @@ class _AbsentCameraViewState extends State<AbsentCameraView> {
Routes.absentSuccess,
(route) => false,
arguments: AbsentSuccessArguments(
absentSuccess: absentSuccess,
profil: widget.profile,
nik: widget.nik,
isIn: true,
),
absentSuccess: absentSuccess,
profil: widget.profile,
nik: widget.nik,
isIn: true,
shiftName:
widget.shiftNameSelected,
shiftEnd: widget.shiftEndTime,
shiftStart:
widget.shiftStartTime),
);
});
} else {
......@@ -513,11 +533,15 @@ class _AbsentCameraViewState extends State<AbsentCameraView> {
Routes.absentSuccess,
(route) => false,
arguments: AbsentSuccessArguments(
absentSuccess: absentSuccess,
profil: widget.profile,
nik: widget.nik,
isIn: false,
),
absentSuccess: absentSuccess,
profil: widget.profile,
nik: widget.nik,
isIn: false,
shiftName:
widget.shiftNameSelected,
shiftEnd: widget.shiftEndTime,
shiftStart:
widget.shiftStartTime),
);
});
}
......@@ -1167,21 +1191,25 @@ class _AbsentCameraViewState extends State<AbsentCameraView> {
}
}
class WidgetAbsentAndTime extends StatefulWidget {
const WidgetAbsentAndTime({
Key? key,
required this.outletName,
required this.isIn,
}) : super(key: key);
class InfoUserAttendance extends StatefulWidget {
const InfoUserAttendance({
super.key,
required this.widget,
required this.shift,
required this.shiftStart,
required this.shiftEnd,
});
final String outletName;
final bool isIn;
final AbsentCameraView widget;
final String shift;
final String shiftStart;
final String shiftEnd;
@override
State<WidgetAbsentAndTime> createState() => _WidgetAbsentAndTimeState();
State<InfoUserAttendance> createState() => _InfoUserAttendanceState();
}
class _WidgetAbsentAndTimeState extends State<WidgetAbsentAndTime> {
class _InfoUserAttendanceState extends State<InfoUserAttendance> {
Timer? _timer;
@override
......@@ -1206,46 +1234,165 @@ class _WidgetAbsentAndTimeState extends State<WidgetAbsentAndTime> {
margin: EdgeInsets.symmetric(
horizontal: AppMargin.m20,
),
padding: EdgeInsets.symmetric(
horizontal: AppPadding.p15,
vertical: AppPadding.p12,
),
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
borderRadius: BorderRadius.circular(10),
color: Colors.white,
),
padding: EdgeInsets.symmetric(
horizontal: AppPadding.p20, vertical: AppPadding.p12),
width: double.infinity,
height: 138,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min,
children: [
Image(
image: AssetImage(
Assets.excelsoLogoGreen,
Container(
padding: const EdgeInsets.symmetric(
vertical: 5,
),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 0.8,
color: ColorManager.grey.withOpacity(0.2),
),
),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
(ConstantString.logoUrlCamera == "")
? const Image(
width: 111,
height: 43,
image: AssetImage(
"",
),
)
: Image(
width: 111,
height: 43,
image: NetworkImage(
ConstantString.logoUrlCamera,
),
),
const SizedBox(
width: 40,
),
Expanded(
child: Text(
widget.widget.branchModel.name,
style: getSemiBoldStyle(
color: Colors.black,
fontSize: FontSize.s16,
),
textAlign: TextAlign.end,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
)
],
),
),
Container(
padding: EdgeInsets.only(
top: AppPadding.p12,
bottom: AppPadding.p16,
),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: 0.8,
color: ColorManager.grey.withOpacity(0.2),
),
),
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
widget.widget.profile.name,
style: getSemiBoldStyle(
color: Colors.black,
fontSize: FontSize.s14,
fontFamily: FontConstants.k2d,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(
width: 30,
),
const Spacer(),
Expanded(
child: Text(
widget.widget.nik,
style: getSemiBoldStyle(
color: ColorManager.green2,
fontSize: FontSize.s14,
fontFamily: FontConstants.k2d,
),
textAlign: TextAlign.end,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
SizedBox(
height: AppMargin.m8,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
widget.shift,
style: getSemiBoldStyle(
color: Colors.black,
fontSize: FontSize.s14,
fontFamily: FontConstants.k2d,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
const SizedBox(
width: 20,
),
Expanded(
child: Text(
"${widget.shiftStart} - ${widget.shiftEnd}",
style: getRegularStyle(
color: Colors.black,
fontSize: FontSize.s12,
fontFamily: FontConstants.k2d,
),
textAlign: TextAlign.end,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
],
),
],
),
width: 111,
height: 42,
),
Expanded(
Container(
margin: EdgeInsets.only(
top: AppMargin.m10,
),
child: Text(
"${widget.outletName} - ${DateFormatCustom.getLocalTime(
timeZoneActive: true,
)}",
style: getSemiBoldStyle(
(widget.widget.isIn) ? "Absen Masuk" : "Absen Keluar",
style: getMediumStyle(
color: Colors.black,
fontSize: FontSize.s16,
fontFamily: FontConstants.poppins,
),
maxLines: 3,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
),
),
Text(
(widget.isIn) ? "Absen Masuk" : "Absen Keluar",
style: getSemiBoldStyle(
color: Colors.black,
fontSize: FontSize.s16,
fontFamily: FontConstants.poppins,
),
),
],
......@@ -1253,3 +1400,121 @@ class _WidgetAbsentAndTimeState extends State<WidgetAbsentAndTime> {
);
}
}
// class WidgetAbsentAndTime extends StatefulWidget {
// const WidgetAbsentAndTime({
// Key? key,
// required this.outletName,
// required this.isIn,
// required this.nik,
// required this.profile,
// }) : super(key: key);
// final String outletName;
// final bool isIn;
// final String nik;
// final ProfileModel profile;
// @override
// State<WidgetAbsentAndTime> createState() => _WidgetAbsentAndTimeState();
// }
// class _WidgetAbsentAndTimeState extends State<WidgetAbsentAndTime> {
// Timer? _timer;
// @override
// void initState() {
// super.initState();
// Timer.periodic(const Duration(seconds: 1), (timer) {
// _timer = timer;
// setState(() {});
// });
// }
// @override
// void dispose() {
// super.dispose();
// _timer?.cancel();
// }
// @override
// Widget build(BuildContext context) {
// return Container(
// margin: EdgeInsets.symmetric(
// horizontal: AppMargin.m20,
// ),
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(12),
// color: Colors.white,
// ),
// padding: EdgeInsets.symmetric(
// horizontal: AppPadding.p20,
// vertical: AppPadding.p12,
// ),
// width: double.infinity,
// height: 160,
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// mainAxisSize: MainAxisSize.min,
// children: [
// Image(
// image: AssetImage(
// Assets.excelsoLogoGreen,
// ),
// width: 100,
// height: 30,
// ),
// const SizedBox(
// height: 10,
// ),
// Text(
// "${widget.outletName} - ${DateFormatCustom.getLocalTime(
// timeZoneActive: true,
// )}",
// style: getSemiBoldStyle(
// color: Colors.black,
// fontSize: FontSize.s16,
// ),
// maxLines: 2,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// ),
// Text(
// "[${widget.nik}] ${widget.profile.name}",
// style: getSemiBoldStyle(
// color: Colors.black,
// fontSize: FontSize.s14,
// fontFamily: FontConstants.poppins,
// ),
// maxLines: 1,
// overflow: TextOverflow.ellipsis,
// textAlign: TextAlign.center,
// ),
// // Expanded(
// // child: Text(
// // widget.nik,
// // style: getSemiBoldStyle(
// // color: Colors.black,
// // fontSize: FontSize.s16,
// // fontFamily: FontConstants.poppins,
// // ),
// // maxLines: 2,
// // overflow: TextOverflow.ellipsis,
// // textAlign: TextAlign.center,
// // ),
// // ),
// Text(
// (widget.isIn) ? "Absen Masuk" : "Absen Keluar",
// style: getSemiBoldStyle(
// color: Colors.black,
// fontSize: FontSize.s14,
// fontFamily: FontConstants.poppins,
// ),
// ),
// ],
// ),
// );
// }
// }
......@@ -12,17 +12,24 @@ import 'package:excelso_attendance/resource/style.dart';
import 'package:flutter/material.dart';
class AbsentSuccessView extends StatelessWidget {
const AbsentSuccessView(
{super.key,
required this.absentSuccess,
required this.isIn,
required this.nik,
required this.profil});
const AbsentSuccessView({
super.key,
required this.absentSuccess,
required this.isIn,
required this.nik,
required this.profil,
required this.shiftStart,
required this.shiftEnd,
required this.shiftName,
});
final AbsentSuccessModel absentSuccess;
final ProfileModel profil;
final String nik;
final bool isIn;
final String shiftStart;
final String shiftEnd;
final String shiftName;
@override
Widget build(BuildContext context) {
......@@ -30,7 +37,14 @@ class AbsentSuccessView extends StatelessWidget {
backgroundColor: ColorManager.backgroundColor,
body: ScreenResponsive(
widget: BodyWidget(
isIn: isIn, profil: profil, nik: nik, absentSuccess: absentSuccess),
isIn: isIn,
profil: profil,
nik: nik,
absentSuccess: absentSuccess,
shiftEnd: shiftEnd,
shiftName: shiftName,
shiftStart: shiftStart,
),
widthScreen: MediaQuery.of(context).size.width,
),
);
......@@ -44,12 +58,18 @@ class BodyWidget extends StatelessWidget {
required this.profil,
required this.nik,
required this.absentSuccess,
required this.shiftStart,
required this.shiftEnd,
required this.shiftName,
});
final bool isIn;
final ProfileModel profil;
final String nik;
final AbsentSuccessModel absentSuccess;
final String shiftStart;
final String shiftEnd;
final String shiftName;
@override
Widget build(BuildContext context) {
......@@ -144,174 +164,193 @@ Sukses''',
),
),
Container(
margin: EdgeInsets.only(
top: AppMargin.m20,
left: AppMargin.m20,
right: AppMargin.m20,
),
padding: EdgeInsets.all(AppPadding.p20),
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(
width: 0.2,
color: ColorManager.grey.withOpacity(
0.3,
),
),
color: ColorManager.backgroundColor,
// boxShadow: [
// BoxShadow(
// color: Colors.grey.withOpacity(0.3),
// blurRadius: 1,
// offset: const Offset(0.1, 0.1),
// ),
// ],
),
child: Center(
child: Text(
absentSuccess.branchName,
style: getSemiBoldStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s16,
),
),
),
),
Container(
margin: EdgeInsets.only(
top: 38,
top: AppMargin.m8,
left: AppMargin.m20,
right: AppMargin.m20,
),
padding: EdgeInsets.all(AppPadding.p20),
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
border: Border.all(
width: 0.2,
color: ColorManager.grey.withOpacity(
0.3,
),
),
color: ColorManager.backgroundColor,
// boxShadow: [
// BoxShadow(
// color: Colors.grey.withOpacity(0.3),
// blurRadius: 1,
// offset: const Offset(0.1, 0.1),
// ),
// ],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
DateFormatCustom.getDateLocal(
fromApi: true,
apiDate: absentSuccess.date,
),
style: getRegularStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s14,
fontFamily: FontConstants.k2d,
),
),
Text(
"${absentSuccess.time} ${absentSuccess.timeZone}",
style: getRegularStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s14,
fontFamily: FontConstants.k2d,
),
)
],
),
),
SizedBox(
height: AppMargin.m8,
),
Container(
margin: EdgeInsets.symmetric(
horizontal: AppMargin.m20,
),
padding: EdgeInsets.symmetric(
horizontal: AppPadding.p12,
vertical: AppPadding.p20,
horizontal: 25,
),
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.circular(12),
border: Border.all(
width: 0.2,
color: Colors.grey,
),
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
blurRadius: 5,
offset: const Offset(0.8, 0.8),
color: ColorManager.grey.withOpacity(
0.3,
),
],
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Text(
// absentSuccess.branchCode,
// style: getSemiBoldStyle(
// color: ColorManager.fontBlack,
// fontSize: FontSize.s20,
// fontFamily: FontConstants.montserrat,
// ),
// ),
// SizedBox(
// height: AppMargin.m10,
// ),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Text(
profil.name,
style: getMediumStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s16,
fontFamily: FontConstants.montserrat,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.start,
),
),
Expanded(
child: Text(
nik,
style: getMediumStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s16,
fontFamily: FontConstants.montserrat,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.end,
),
)
],
),
Container(
margin: EdgeInsets.only(
top: AppMargin.m10,
),
padding: EdgeInsets.symmetric(
horizontal: AppPadding.p20,
vertical: AppPadding.p12,
padding: EdgeInsets.only(
bottom: AppPadding.p12,
),
width: double.infinity,
decoration: BoxDecoration(
color: const Color(0xffE7E7E7).withOpacity(0.5),
border: Border.all(
width: 0.2,
color: ColorManager.grey.withOpacity(0.8),
border: Border(
bottom: BorderSide(
width: 1,
color: ColorManager.grey.withOpacity(
0.3,
),
),
),
borderRadius: BorderRadius.circular(9),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
absentSuccess.branchName,
profil.name,
style: getSemiBoldStyle(
color: ColorManager.fontBlack,
color: Colors.black,
fontSize: FontSize.s16,
fontFamily: FontConstants.k2d,
),
textAlign: TextAlign.center,
maxLines: 2,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 4,
SizedBox(
height: AppMargin.m8,
),
Text(
"${absentSuccess.time} ${absentSuccess.timeZone}",
nik,
style: getMediumStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s20,
color: ColorManager.green2,
fontSize: FontSize.s16,
fontFamily: FontConstants.k2d,
),
textAlign: TextAlign.center,
maxLines: 2,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(
height: 4,
),
Text(
DateFormatCustom.getDateLocal(
fromApi: true,
apiDate: absentSuccess.date,
],
),
),
Container(
padding: EdgeInsets.only(
top: AppPadding.p12,
bottom: AppPadding.p20,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
shiftName,
style: getRegularStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s12,
fontFamily: FontConstants.k2d,
),
),
style: getRegularStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s16,
),
SizedBox(
width: AppMargin.m10,
),
Expanded(
child: Text(
"$shiftStart - $shiftEnd",
style: getRegularStyle(
color: ColorManager.fontBlack,
fontSize: FontSize.s12,
fontFamily: FontConstants.k2d,
),
textAlign: TextAlign.end,
),
textAlign: TextAlign.center,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
],
),
// child: Row(
// children: [
// const Spacer(),
// Text(
// DateFormatCustom.getDateLocal(
// fromApi: true,
// apiDate: absentSuccess.date,
// ),
// style: getRegularStyle(
// color: ColorManager.fontBlack,
// fontSize: 16,
// fontFamily: FontConstants.montserrat,
// ),
// )
// ],
// ),
),
// Container(
// margin: EdgeInsets.only(
// top: AppMargin.m16,
// left: AppMargin.m16,
// right: AppMargin.m16,
// ),
// child: CustomButton(
// text: "Kembali ke Beranda",
// onTap: () {
// Navigator.pushNamedAndRemoveUntil(
// context,
// Routes.onBoarding,
// (route) => false,
// );
// },
// ),
// )
)
],
),
),
......
......@@ -4,6 +4,7 @@ import 'dart:async';
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/modal_dialog.dart';
......@@ -60,11 +61,12 @@ class BodyWidget extends StatefulWidget {
}
class _BodyWidgetState extends State<BodyWidget> {
// final TextEditingController nikController = TextEditingController();
final TextEditingController nikController = TextEditingController();
int selectedOutlet = 0;
String nikUser =
(getListAbsentUser().isEmpty) ? "" : getListAbsentUser().last;
// String nikUser =
// (getListAbsentUser().isEmpty) ? "" : getListAbsentUser().last;
String nikUser = "";
TextEditingController? textEditingController;
List<String> dataUserAbsent = getListAbsentUser();
......@@ -89,13 +91,21 @@ class _BodyWidgetState extends State<BodyWidget> {
),
),
child: Center(
child: Image(
width: 36,
height: 36,
image: AssetImage(
Assets.excelsoLogo,
),
),
child: (ConstantString.logoUrlHome == "")
? const Image(
width: 36,
height: 36,
image: AssetImage(
"",
),
)
: Image(
width: 36,
height: 36,
image: NetworkImage(
ConstantString.logoUrlHome,
),
),
),
)
],
......@@ -178,159 +188,167 @@ class _BodyWidgetState extends State<BodyWidget> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.only(
bottom: AppMargin.m12,
),
child: Text(
"NIK",
style: getSemiBoldStyle(
color: Colors.black,
fontSize: 16,
),
),
),
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;
});
}),
initialValue: TextEditingValue(
text: (getListAbsentUser().isEmpty)
? ""
: getListAbsentUser().last),
optionsViewBuilder: (c, onSelected, options) {
List<String> listNik = options.toList();
// Container(
// margin: EdgeInsets.only(
// bottom: AppMargin.m12,
// ),
// child: Text(
// "NIK",
// style: getSemiBoldStyle(
// color: Colors.black,
// fontSize: 16,
// ),
// ),
// ),
InputTextField(
controller: nikController,
labelText: "NIK",
borderSideActive: true,
hintText: "NIK",
)
// 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;
// });
// }),
// // initialValue: TextEditingValue(
// // text: (getListAbsentUser().isEmpty)
// // ? ""
// // : getListAbsentUser().last,
// // ),
// 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) {
textEditingController = controller;
return TextField(
onChanged: (teks) {
setState(() {
nikUser = teks;
});
},
controller: textEditingController,
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),
),
suffixIcon:
(textEditingController!.text.isNotEmpty)
? IconButton(
onPressed: () {
setState(() {
textEditingController!.clear();
});
},
icon: const Icon(
Icons.dangerous,
color: Colors.grey,
),
)
: null,
),
);
},
),
// 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) {
// textEditingController = controller;
// return TextField(
// onChanged: (teks) {
// setState(() {
// nikUser = teks;
// });
// },
// controller: textEditingController,
// 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),
// ),
// suffixIcon:
// (textEditingController!.text.isNotEmpty)
// ? IconButton(
// onPressed: () {
// setState(() {
// textEditingController!.clear();
// nikUser = "";
// });
// },
// icon: const Icon(
// Icons.dangerous,
// color: Colors.grey,
// ),
// )
// : null,
// ),
// );
// },
// ),
],
),
),
......@@ -346,7 +364,7 @@ class _BodyWidgetState extends State<BodyWidget> {
child: CustomButton(
text: "Masuk",
onTap: () {
if (nikUser.isEmpty) {
if (nikController.text.isEmpty) {
EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu",
);
......@@ -360,7 +378,7 @@ class _BodyWidgetState extends State<BodyWidget> {
shiftList: widget.shiftList,
branchModel:
widget.nearestBranch[selectedOutlet],
nik: nikUser,
nik: nikController.text,
);
});
}
......@@ -374,7 +392,7 @@ class _BodyWidgetState extends State<BodyWidget> {
child: CustomButton(
text: "Keluar",
onTap: () async {
if (nikUser.isEmpty) {
if (nikController.text.isEmpty) {
EasyLoading.showToast(
"Silakan isi NIK terlebih dahulu",
);
......@@ -385,7 +403,7 @@ class _BodyWidgetState extends State<BodyWidget> {
);
Api.getUserProfile(
widget.nearestBranch[selectedOutlet].id,
nikUser,
nikController.text,
).then((apiResponse) {
EasyLoading.dismiss();
if (apiResponse.error) {
......@@ -430,7 +448,12 @@ class _BodyWidgetState extends State<BodyWidget> {
branchModel: widget
.nearestBranch[selectedOutlet],
profile: profileUser,
nik: nikUser,
nik: nikController.text,
shiftNameSelected:
profileUser.shiftSelectedName,
shiftStartTime:
profileUser.shiftStart,
shiftEndTime: profileUser.shiftEnd,
),
);
},
......@@ -449,7 +472,11 @@ class _BodyWidgetState extends State<BodyWidget> {
branchModel:
widget.nearestBranch[selectedOutlet],
profile: profileUser,
nik: nikUser,
nik: nikController.text,
shiftNameSelected:
profileUser.shiftSelectedName,
shiftStartTime: profileUser.shiftStart,
shiftEndTime: profileUser.shiftEnd,
),
);
}
......@@ -1092,6 +1119,12 @@ class _WidgetSelectShiftState extends State<WidgetSelectShift> {
shiftModel: widget.shiftList[selectedShift!],
profile: profileUser,
nik: widget.nik,
shiftNameSelected:
widget.shiftList[selectedShift!].name,
shiftStartTime:
widget.shiftList[selectedShift!].startTime,
shiftEndTime:
widget.shiftList[selectedShift!].endTime,
),
);
},
......@@ -1112,6 +1145,11 @@ class _WidgetSelectShiftState extends State<WidgetSelectShift> {
shiftModel: widget.shiftList[selectedShift!],
profile: profileUser,
nik: widget.nik,
shiftNameSelected:
widget.shiftList[selectedShift!].name,
shiftStartTime:
widget.shiftList[selectedShift!].startTime,
shiftEndTime: widget.shiftList[selectedShift!].endTime,
),
);
}
......
......@@ -8,5 +8,6 @@ class ColorManager {
static Color grey = const Color(0xff595959);
static Color softGreen = const Color(0xffA4D8C8);
static Color green = const Color(0xff3CA786);
static Color green2 = const Color(0xff219653);
static Color fontBlack = const Color(0xff444444);
}
class ConstantString {
static String outletDistance = '';
static String logoUrlHome = '';
static String logoUrlCamera = '';
}
......@@ -4,6 +4,7 @@ class FontConstants {
static const String openSans = "Open Sans";
static const String montserrat = "Montserrat";
static const String poppins = "Poppins";
static const String k2d = "K2D";
}
class FontWeightManager {
......
......@@ -46,6 +46,9 @@ class RouteGenerator {
shiftModel: args.shiftModel,
profile: args.profile,
nik: args.nik,
shiftNameSelected: args.shiftNameSelected,
shiftStartTime: args.shiftStartTime,
shiftEndTime: args.shiftEndTime,
),
nameRoute: Routes.absentCamera,
routeSettings: routeSettings,
......@@ -59,6 +62,9 @@ class RouteGenerator {
profil: args.profil,
nik: args.nik,
isIn: args.isIn,
shiftEnd: args.shiftEnd,
shiftStart: args.shiftStart,
shiftName: args.shiftName,
),
nameRoute: Routes.absentSuccess,
routeSettings: routeSettings,
......@@ -107,6 +113,9 @@ class RouteGenerator {
shiftModel: args.shiftModel,
profile: args.profile,
nik: args.nik,
shiftNameSelected: args.shiftNameSelected,
shiftStartTime: args.shiftStartTime,
shiftEndTime: args.shiftEndTime,
),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
......@@ -146,22 +155,15 @@ class RouteGenerator {
profil: args.profil,
nik: args.nik,
isIn: args.isIn,
shiftEnd: args.shiftEnd,
shiftStart: args.shiftStart,
shiftName: args.shiftName,
),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
// settings: RouteSettings(
// name: nameRoute.replaceFirst("/", ""), arguments: args),
);
} else if (nameRoute == Routes.notFoundPage) {
ErrorWidgetArguments args =
routeSettings!.arguments as ErrorWidgetArguments;
return PageRouteBuilder(
pageBuilder: (context, a, b) => ErrorWidgetView(
messageError: args.errorMessage,
),
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
);
} else {
return PageRouteBuilder(
pageBuilder: (context, a, b) => target,
......
......@@ -15,6 +15,7 @@ class AppPadding {
static double p12 = 12;
static double p14 = 14;
static double p15 = 15;
static double p16 = 16;
static double p20 = 20;
}
......
......@@ -93,6 +93,18 @@ flutter:
weight: 600
- asset: assets/fonts/poppins/Poppins-Bold.ttf
weight: 700
- family: K2D
fonts:
- asset: assets/fonts/k2d/K2D-Light.ttf
weight: 300
- asset: assets/fonts/k2d/K2D-Regular.ttf
weight: 400
- asset: assets/fonts/k2d/K2D-Medium.ttf
weight: 500
- asset: assets/fonts/k2d/K2D-SemiBold.ttf
weight: 600
- asset: assets/fonts/k2d/K2D-Bold.ttf
weight: 700
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
......
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