MobilePortal23/lib/app_worktime/worktime_details.dart

766 lines
28 KiB
Dart

import 'package:expandable/expandable.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'dart:convert';
import 'package:mobile_portal_23/models/workTimeDetailsModel.dart';
import 'package:mobile_portal_23/classes/common_classes.dart';
import 'package:http/http.dart' as http;
import 'package:jiffy/jiffy.dart';
extension on Duration {
String format(String s) => '$this'.split('.')[0].padLeft(8, '0');
}
class workTimeDetails extends StatefulWidget {
const workTimeDetails({Key? key}) : super(key: key);
static const routeName = '/wtdetails';
@override
State<workTimeDetails> createState() => _workTimeDetailsState();
}
late EmployeePageArguments employeePageArguments;
late WorkTimeDetailsModel workTimeList;
bool _isError = false;
bool _isData = false;
final DateFormat nowformat = DateFormat('yyyy.MM');
class _workTimeDetailsState extends State<workTimeDetails> {
final DateFormat formatter = DateFormat('yyyy MMMM');
DateTime selectedDate = DateTime.now();
String appDomain = "iotechnic.eu";
@override
void initState() {
super.initState();
initializeDateFormatting('hu');
WidgetsBinding.instance.addPostFrameCallback((_) {
final args = ModalRoute.of(context)!.settings.arguments as Map;
employeePageArguments = args['userArgs'];
// empArgs = (ModalRoute.of(context)?.settings.arguments ??
// <String, dynamic>{}) as EmployeeArguments;
// getSharedPrefs().then((value) {
reloadData(nowformat.format(selectedDate));
});
// });
}
reloadData(String date) {
fetchdata(date).then((data) {
if (data != null) {
// for (var item in data) {
workTimeList =
WorkTimeDetailsModel.fromJson(data); //{'wd': data['wd']}));
// }
setState(() {
_isData = true;
debugPrint('Fetch ok.');
});
} else {
_isError = true;
}
//employeeList = data;
});
}
Future fetchdata(String date) async {
var res = await http.get(
// "http://iotechnic.eu/apiGetAllReport/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
Uri.parse("http://$appDomain/employee/androidAccessList/${employeePageArguments.apiKey!}/$date"));
//"http://192.168.0.144/apiGetDailyReport/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
if (res.statusCode == 200) {
var obj = json.decode(res.body);
return obj;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: _isData ? Text(formatter.format(selectedDate)) : const Text("ss"),
elevation: 10.0,
actions: <Widget>[
IconButton(
icon: const Icon(Icons.navigate_before),
tooltip: 'Show Snackbar',
onPressed: () {
selectedDate = Jiffy.parse(selectedDate.toString()).subtract(months: 1).dateTime;
reloadData(nowformat.format(selectedDate));
}),
IconButton(
icon: const Icon(Icons.navigate_next_rounded),
color: Colors.white,
tooltip: 'Go to the next page',
onPressed: selectedDate.difference(DateTime.now()).inDays < 0
? () {
_isData = false;
_isError = false;
selectedDate = Jiffy.parse(selectedDate.toString()).add(months: 1).dateTime;
// String jiffy=selectedDate.
reloadData(nowformat.format(selectedDate));
}
: null,
),
],
// leading: Icon(Icons.arrow_back_ios_new),
),
body: _isData
? detailsPage(
context, workTimeList) //reportCard(context, workTimeList)
: const Center(child: CircularProgressIndicator()),
backgroundColor: Colors.grey[300],
);
}
String minToTime(var seconds) {
int minutes = (seconds / 60).truncate();
int sec = (seconds % 60);
String minutesStr = "${minutes.toString().padLeft(2, "0")}.${sec.toString().padLeft(2, "0")}";
return minutesStr;
}
/* Widget _buildContent(BuildContext context) {
return Container(
color: Color(0xffECF0F1),
child: ListView.builder(
itemCount: workTimeList
.length, //workTimeList.wd?.length, // The length Of the array
padding: EdgeInsets.all(5),
shrinkWrap: true,
itemBuilder: (context, index) => Container(
child: //if (_isData)
reportCard(context, workTimeList, index)),
));
}*/
Widget Arrive(e, Wd wtd) {
var dateformat = DateFormat.E('hu');
final DateFormat formatter = DateFormat('HH:mm');
return //Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
/* Expanded(
// flex: 1,
child: Text(
wtd.date!.substring(8, 11).toString(),
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black87),
)),
Expanded(
//flex: 1,
child: Text(
//"$item.month.fullWorkHours",
wtd.isHoliday == true
? dateformat
.format(DateFormat("yyyy.MM.DD").parse(wtd.date.toString()))
: dateformat
.format(DateFormat("yyyy.MM.DD.").parse(wtd.date.toString())),
//item.month?.fullWorkHours.toString(),
style: TextStyle(
fontSize: 16, fontWeight: FontWeight.bold, color: Colors.blue),
)),*/
Expanded(
flex: 8,
child:
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(
'É: ${formatter.format(DateFormat("H:mm")
.parse(e.start.substring(12, e.start.length)))} ' +
e.arriveLoc,
overflow: TextOverflow.ellipsis),
if (e.stop == '-')
const Text('--:--')
else
Text(
'T: ${formatter.format(DateFormat("H:mm")
.parse(e.stop.substring(12, e.stop.length)))} ' +
e.getawayLoc,
overflow: TextOverflow.ellipsis),
]));
}
Container startStopWidget(BuildContext context, Wd wtd) {
var dateformat = DateFormat.E('hu');
final DateFormat formatter = DateFormat('HH:mm');
List<Widget> v = [];
v.add(Expanded(
// flex: 1,
child: Text(
wtd.date!.substring(8, 10).toString(),
style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black87),
)));
v.add(
Expanded(
//flex: 1,
child: Text(
//"$item.month.fullWorkHours",
wtd.isHoliday == true
? dateformat
.format(DateFormat("yyyy.MM.DD").parse(wtd.date.toString()))
: dateformat
.format(DateFormat("yyyy.MM.DD.").parse(wtd.date.toString())),
//item.month?.fullWorkHours.toString(),
style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.bold, color: Colors.blue),
)),
);
if (wtd.isHoliday == false) {
for (var e in wtd.startStop!) {
v.add(Expanded(
flex: 8,
child:
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(
'É: ${formatter.format(DateFormat("yyyy.MM.dd. H:mm")
.parse(e.start.toString()))} ${e.arriveLoc}',
overflow: TextOverflow.ellipsis),
if (e.stop == '-')
const Text('--:--')
else
Text(
'T: ${formatter.format(DateFormat("yyyy.MM.dd. H:mm")
.parse(e.stop.toString()))} ${e.getawayLoc}',
overflow: TextOverflow.ellipsis),
])));
debugPrint(wtd.toString());
}
}
return Container(
color: const Color.fromARGB(255, 206, 206, 206),
margin: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: wtd.isHoliday == true
? [
Text(wtd.date.toString()),
const Text("Szabadság"),
const Divider(
thickness: 1.0,
),
]
: //wtd.startStop!.map((e) => Arrive(e, wtd)).toList()),
[
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children:
v /*[
Expanded(
// flex: 1,
child: Text(
wtd.date!.substring(8, 11).toString(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black87),
)
),
Expanded(
//flex: 1,
child: Text(
//"$item.month.fullWorkHours",
wtd.isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.DD")
.parse(wtd.date.toString()))
: dateformat.format(DateFormat("yyyy.MM.DD.")
.parse(wtd.date.toString())),
//item.month?.fullWorkHours.toString(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue),
)
),
wtd.startStop!.map((e) => Arrive(e, wtd)).toList()),
]*/
)
]));
}
Container detailsPage(BuildContext context, WorkTimeDetailsModel item) {
return Container(
child: ListView.builder(
itemCount: item.wd!.length,
itemBuilder: (BuildContext context, int index) {
_isData = false;
return //startStopWidget(context, item.wd![index]);
//reportCard2(context, item.wd![index]);
buildCard(context, item.wd![index]);
},
));
}
Widget buildCard(BuildContext context, Wd itemx) {
var dayformat = DateFormat.d('hu');
var dateformat = DateFormat.E('hu');
final DateFormat formatter = DateFormat('HH:mm');
return Padding(
padding: const EdgeInsets.all(10),
child: Card(
child: Padding(
padding: const EdgeInsets.all(10),
child: ExpandablePanel(
header: Column(children: [
Row(
children: [
Text(
itemx.isHoliday == true
? '${dayformat.format(DateFormat("yyyy.MM.dd")
.parse(itemx.date.toString()))}.'
: '${dayformat.format(DateFormat("yyyy.MM.dd.")
.parse(itemx.date.toString()))}.',
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black),
),
const SizedBox(
width: 10,
),
Text(
//"$item.month.fullWorkHours",
itemx.isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.dd")
.parse(itemx.date.toString()))
: dateformat.format(DateFormat("yyyy.MM.dd.")
.parse(itemx.date.toString())),
//item.month?.fullWorkHours.toString(),
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue),
),
],
),
const Divider(
color: Colors.blue,
thickness: 1,
)
]),
//Text("Header"),
collapsed: //Text('collapsed'),
itemx.isHoliday == true
? const Text("Szabadság")
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
//Text(itemx.fullHours.toString()),
Text('Normál óra'),
Text('Túlóra óra'),
Text('Összes óra'),
]),
Row(
mainAxisAlignment:
MainAxisAlignment.spaceAround,
children: [
Text(
formatter.format(DateFormat("mm")
.parse(itemx.hours.toString())),
textAlign: TextAlign.center),
Text(
formatter.format(DateFormat("mm")
.parse(itemx.overTime.toString())),
textAlign: TextAlign.center),
Text(
formatter.format(DateFormat("mm")
.parse(itemx.fullHours.toString())),
textAlign: TextAlign.center),
]),
]),
expanded: itemx.isHoliday == true
? const Text("Szabadság")
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
//Text(itemx.fullHours.toString()),
Text('Érkezés'),
Text('Távozás'),
Text('Óra'),
]),
Column(
children: itemx.startStop!
.map<Widget>((e) => _getrow(e))
.toList())
]),
)),
),
);
}
Widget _getrow(StartStop e) {
final DateFormat formatter = DateFormat('HH:mm');
var start = DateFormat("yyyy.MM.dd. HH:mm").parse(e.start.toString());
DateTime stop=DateTime(2024);
late Duration diff;
if (e.stop != '-') {
stop = DateFormat("yyyy.MM.dd. HH:mm").parse(e.stop.toString());
diff = stop.difference(start);
}
return Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [
Text(formatter.format(start), textAlign: TextAlign.center),
if (e.stop == '-') ...[
const Text('--:--'),
const Text('--:--')
] else ...[
Text(formatter.format(stop), textAlign: TextAlign.center),
Text(
formatter.format(DateFormat("mm").parse(diff.inMinutes.toString())),
textAlign: TextAlign.center),
]
]);
}
Card reportCard2(BuildContext context, Wd itemx) {
var dateformat = DateFormat.E('hu');
final DateFormat formatter = DateFormat('HH:mm');
return Card(
child: Padding(
padding: const EdgeInsets.all(15.0),
child:
Column(mainAxisAlignment: MainAxisAlignment.center, children: [
Expanded(
flex: 1,
child: Text(
//"$item.month.fullWorkHours",
itemx.isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.dd")
.parse(itemx.date.toString()))
: dateformat.format(DateFormat("yyyy.MM.dd.")
.parse(itemx.date.toString())),
//item.month?.fullWorkHours.toString(),
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue),
)),
const Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
//Text(itemx.fullHours.toString()),
Text('Normál óra'),
Text('Túlóra óra'),
Text('Összes óra'),
]),
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [
Text(
formatter
.format(DateFormat("mm").parse(itemx.hours.toString())),
textAlign: TextAlign.center),
Text(
formatter.format(
DateFormat("mm").parse(itemx.overTime.toString())),
textAlign: TextAlign.center),
Text(
formatter.format(
DateFormat("mm").parse(itemx.fullHours.toString())),
textAlign: TextAlign.center),
]),
])));
}
Card reportCard(BuildContext context, WorkTimeDetailsModel itemx) {
int workHour = 0;
bool workOpened = false;
//bool? isHoliday = item.wd![index].isHoliday;
var dateformat = DateFormat.E('hu');
return Card(
clipBehavior: Clip.antiAlias,
child: ListView.builder(
itemCount: itemx.wd?.length,
itemBuilder: (BuildContext context, int index) {
List<Text> start = itemx.wd![index].isHoliday != true
? itemx.wd![index].startStop!
.map(
(e) => Text(
e.start.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
)
//.cast<StartStop>()
.toList()
: [const Text("Szabi")];
bool? isHoliday = itemx.wd![index].isHoliday;
return ListTile(
leading: CircleAvatar(
backgroundColor: Colors.blue,
child: Text(
//"$item.month.fullWorkHours",
isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.DD")
.parse(itemx.wd![index].date.toString()))
: dateformat.format(DateFormat("yyyy.MM.DD.")
.parse(itemx.wd![index].date.toString())),
//item.month?.fullWorkHours.toString(),
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.white),
),
),
title: isHoliday == false
? Column(children: [
Row(
children:
start /*itemx.wd![index].startStop!
.map(
(e) => Text(
e.start.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
)
.toList(),*/
),
const Divider(
thickness: 1.0,
),
])
: const Text("Szabi"));
//Text(itemx.wd![index].date.toString());
},
),
/*Column(
children: [
ListTile(
tileColor: Colors.blue,
onTap: () {},
leading: CircleAvatar(
backgroundColor: Colors.white,
child: Text(
//"$item.month.fullWorkHours",
isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.DD")
.parse(item.wd![index].date.toString()))
: dateformat.format(DateFormat("yyyy.MM.DD.")
.parse(item.wd![index].date.toString())),
//item.month?.fullWorkHours.toString(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue),
)),
title: Text(
item.wd?[index].date as String,
style: TextStyle(color: Colors.white),
),
subtitle: isHoliday == true
? Text(
"Szabadság",
style: TextStyle(
color: Colors.yellow,
fontWeight: FontWeight.bold,
fontSize: 18),
)
: item.wd![index].notes != null
? Text(
item.wd![index].notes as String,
style:
TextStyle(color: Colors.black.withOpacity(0.6)),
)
: Text("Nincs")),
Padding(
padding: const EdgeInsets.all(10.0),
child: IntrinsicHeight(
child: Column(children: [
Row(children: [
Text(
'KL', //+ item.workNumber!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
VerticalDivider(color: Colors.grey, thickness: 1, width: 30),
Text(
'Órák: ' +
Duration(minutes: item.month!.fullWorkHours!.toInt())
.format(),
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
VerticalDivider(color: Colors.grey, thickness: 1, width: 30),
Text(
'PO:', // + item.poNumber!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
]),
Divider(
thickness: 1.0,
),
Row(children: [
Text(
item.wd![index].date.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
]
/* .map(
(e) => Text(
e.date.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
)
.toList(),*/
),
Divider(
thickness: 1.0,
),
]))),
],
),*/
);
}
/*
Widget _buildContent(BuildContext context) {
return Container(
color: Color(0xffECF0F1),
child: ListView.builder(
itemCount: workTimeList.wd?.length, // The length Of the array
padding: EdgeInsets.all(5),
shrinkWrap: true,
itemBuilder: (context, index) => Container(
child: //if (_isData)
reportCard(context, workTimeList, index)),
));
}
*/
/* Card reportCard(BuildContext context, WorkTimeDetailsModel item, int index) {
int workHour = 0;
bool workOpened = false;
bool? isHoliday = item.wd![index].isHoliday;
var dateformat = new DateFormat.E('hu');
return Card(
clipBehavior: Clip.antiAlias,
child: Column(
children: [
ListTile(
tileColor: Colors.blue,
onTap: () {},
leading: CircleAvatar(
backgroundColor: Colors.white,
child: Text(
//"$item.month.fullWorkHours",
isHoliday == true
? dateformat.format(DateFormat("yyyy.MM.DD")
.parse(item.wd![index].date.toString()))
: dateformat.format(DateFormat("yyyy.MM.DD.")
.parse(item.wd![index].date.toString())),
//item.month?.fullWorkHours.toString(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.blue),
)),
title: Text(
item.wd?[index].date as String,
style: TextStyle(color: Colors.white),
),
subtitle: isHoliday == true
? Text(
"Szabadság",
style: TextStyle(
color: Colors.yellow,
fontWeight: FontWeight.bold,
fontSize: 18),
)
: item.wd![index].notes != null
? Text(
item.wd![index].notes as String,
style:
TextStyle(color: Colors.black.withOpacity(0.6)),
)
: Text("Nincs")),
Padding(
padding: const EdgeInsets.all(10.0),
child: IntrinsicHeight(
child: Column(children: [
Row(children: [
Text(
'KL', //+ item.workNumber!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
VerticalDivider(color: Colors.grey, thickness: 1, width: 30),
Text(
'Órák: ' +
Duration(minutes: item.month!.fullWorkHours!.toInt())
.format(),
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
VerticalDivider(color: Colors.grey, thickness: 1, width: 30),
Text(
'PO:', // + item.poNumber!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
]),
Divider(
thickness: 1.0,
),
Row(children: [
Text(
item.wd![index].date.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
]
/* .map(
(e) => Text(
e.date.toString(),
//item.dailyReport[0].workTitle!,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
)
.toList(),*/
),
Divider(
thickness: 1.0,
),
]))),
],
),
);
}*/
}