MobilePortal23/lib/widgets/reportNew.dart

490 lines
17 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mobile_portal_23/classes/common_classes.dart';
import 'package:mobile_portal_23/models/employee_model.dart';
import 'package:mobile_portal_23/models/reportListModel.dart';
import 'package:intl/intl.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
//import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
//String? userApiKey;
TextEditingController dateinput = TextEditingController();
String appDomain = "iotechnic.eu";
bool _enableSave = false;
bool _textMessageOK = false;
String textMessage = "";
late EmployeePageArguments employeePageArguments;
late ReportArguments reportArguments;
/*Future<Null> getSharedPrefs() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
userApiKey = prefs.getString("apiKey");
}*/
class reportNew extends StatefulWidget {
const reportNew({Key? key}) : super(key: key);
static const routeName = '/reportNew';
@override
State<reportNew> createState() => _reportNewState();
}
Future fetchReport(BuildContext context) async {
var res = await http.get(Uri.parse("http://$appDomain/apiGetAllReport/${employeePageArguments.apiKey!}"));
if (res.statusCode == 200) {
var data = json.decode(res.body);
//return obj;
if (data != null) {
for (var item in data) {
ModelReportList mr = ModelReportList.fromJson(item);
if (mr.sId == reportArguments.workId) {
reportArguments.report.clear();
reportArguments.report.addAll(mr.dailyReport);
}
}
//employeeList = data;
}
}
}
Future fetchEmployeeData(String userApiKey) async {
var res = await http.get(
// "http://iotechnic.eu/apiemployeelist/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
Uri.parse("http://$appDomain/apiGetDailyReport/$userApiKey"));
//"http://192.168.0.144/apiGetDailyReport/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
if (res.statusCode == 200) {
var obj = json.decode(res.body);
return obj;
} else {
throw ("ERROR");
}
}
Future<List<EmployeeLs>> fetchData(String userApiKey) async {
var url = "http://$appDomain/apiemployeelist/$userApiKey";
http.Response response = await http.get(Uri.parse(url));
var resp = jsonDecode(response.body);
print(resp.toString());
return resp.map<EmployeeLs>((m) => EmployeeLs.fromJson(m)).toList();
}
Future<String> postDailyReport(var json) async {
final response = await http.post(
Uri.parse("http://$appDomain/apiPostDailyReport/${employeePageArguments.apiKey!}"),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(json),
);
if (response.statusCode == 200) {
// If the server did return a 201 CREATED response,
// then parse the JSON.
return response.body;
} else {
// If the server did not return a 201 CREATED response,
// then throw an exception.
throw Exception('Failed to create album.');
}
}
_saveForm(BuildContext context, ReportArguments arguments,
List<EmployeeLs> employeeList) {
EasyLoading.show(status: 'Mentés...');
// _onLoading2();
print("SUBMITTED!");
print(dateinput.text);
print("Title: ${arguments.workName}");
print("WorkId: ${arguments.workId}");
print("Message: $textMessage");
List<String> emp = [];
//print("Jelenlévők: ");
for (var hobby in employeeList) {
if (hobby.value == true) {
//print(hobby.name);
emp.add(hobby.id);
}
}
var report = {
'userApiKey': employeePageArguments.apiKey,
'workId': arguments.workId,
'date': dateinput.text,
'msg': textMessage,
'employeeList': emp
};
//print(json.encode(report));
postDailyReport(report).then((value) {
if (value.contains("OK")) {
EasyLoading.showSuccess('Sikeres Mentés');
fetchReport(context).then((value) {
Future.delayed(const Duration(seconds: 3), () {
// Navigator.pop(context); //pop dialog
EasyLoading.dismiss();
Navigator.of(context).pop();
//_login();
});
});
}
});
}
class _reportNewState extends State<reportNew> {
final _formKey = GlobalKey<FormState>();
List<EmployeeLs> employeeList = [];
bool _isData = false;
@override
void initState() {
// TODO: implement initState
// getSharedPrefs().then((args) {
WidgetsBinding.instance.addPostFrameCallback((_) {
/*final arguments = (ModalRoute.of(context)?.settings.arguments ??
<String, dynamic>{}) as ReportArguments;*/
//var args = ModalRoute.of(context)!.settings.arguments;
//userApiKey = arguments.userApiKey; // as List<DailyReport>;
final args = ModalRoute.of(context)!.settings.arguments as Map;
employeePageArguments = args['userArgs'];
reportArguments = args['dataArgs'];
fetchData(employeePageArguments.apiKey!).then((value) {
setState(() {
employeeList.addAll(value);
_isData = true;
});
});
});
// });
dateinput.text = DateFormat('yyyy.MM.dd').format(DateTime.now());
//set output date to TextField value
super.initState();
}
checkize() {
_enableSave = false;
for (var item in employeeList) {
if (item.value == true) {
setState(() {
if (_textMessageOK) _enableSave = true;
});
print("Save Enabled");
}
}
}
Widget _buildLastName() {
return Form(
key: _formKey,
//margin: const EdgeInsets.only(left: 40),
child: TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
textMessage = "";
_textMessageOK = false;
checkize();
return 'A mező nem lehet üres!';
}
if (value.length < 3) {
textMessage = "";
_textMessageOK = false;
checkize();
return "Legalább 3 karakter!";
} else {
textMessage = value;
_textMessageOK = true;
checkize();
return null;
}
},
onChanged: (_) {
_formKey.currentState!.validate();
},
onFieldSubmitted: (_) {
_formKey.currentState!.validate();
},
style: const TextStyle(
color: Color.fromARGB(255, 3, 163, 29),
fontFamily: 'RadikalLight'),
decoration: //_buildInputDecoration("Last name", ''),
const InputDecoration(labelText: 'Munka leírása')));
}
Container gridList(BuildContext context) {
//_enableSave = false;
return Container(
color: Colors.white,
child: ListView.builder(
itemCount: employeeList.length, // The length Of the array
padding: const EdgeInsets.all(5),
shrinkWrap: true,
itemBuilder: (context, index) => Container(
child: employeeWidget(context, index),
),
),
);
}
SwitchListTile employeeWidget(BuildContext context, index) {
return SwitchListTile(
//controlAffinity: ListTileControlAffinity.trailing,
activeColor: Colors.green,
value: employeeList[index].value,
title: Text(employeeList[index].name),
onChanged: (newValue) {
setState(() {
employeeList[index].value = newValue;
checkize();
});
});
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
@override
Widget build(BuildContext context) {
List<String> emp = [];
/* final arguments =
ModalRoute.of(context)!.settings.arguments as ReportArguments;*/
final args = ModalRoute.of(context)!.settings.arguments as Map;
employeePageArguments = args['userArgs'];
reportArguments = args['dataArgs'];
//<String, dynamic>{}) as ReportArguments;
return Scaffold(
//resizeToAvoidBottomInset: false,
appBar: AppBar(
title: const Text("Új jelentés"),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () {},
),
/* IconButton(
icon: Icon(
Icons.save,
//color: Colors.white,
),
onPressed: _enableSave
? () {
print("Save");
}
: null)*/
],
actionsIconTheme: const IconThemeData(
size: 32,
),
),
//drawer: Drawer(),
body: SingleChildScrollView(
child: page(context),
),
bottomNavigationBar: BottomAppBar(
color: Colors.cyan,
child: Container(
height: 50.0,
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: Visibility(
visible: _enableSave,
child: FloatingActionButton(
onPressed: _enableSave
? () => {
if (_formKey.currentState!.validate())
{
/* print("SUBMITTED!"),
print(dateinput.text),
print("Title: " + arguments.workName),
print("WorkId: " + arguments.workId),
print("Message: " + textMessage),
//print("Jelenlévők: ");
for (var hobby in employeeList)
{
if (hobby.value == true)
{
//print(hobby.name);
emp.add(hobby.id),
}
},
print(emp),*/
// TODO submit
_saveForm(context, reportArguments, employeeList)
}
// Navigator.pushNamed(context, reportNew.routeName,
// arguments: arguments),
}
: null,
child: const Icon(Icons.save),
),
));
}
Widget page(BuildContext context) {
/* final arguments = (ModalRoute.of(context)?.settings.arguments ??
<String, dynamic>{}) as ReportArguments;*/
final args = ModalRoute.of(context)!.settings.arguments as Map;
employeePageArguments = args['userArgs'];
reportArguments = args['dataArgs'];
List<DailyReport> reportDetailsList =
reportArguments.report; // as List<DailyReport>;
String textMessage = "";
DateTime selectedDate = DateTime.now();
return Container(
child: Column(children: [
Card(
clipBehavior: Clip.antiAlias,
child: Column(
children: [
ListTile(
tileColor: Colors.cyan,
/* trailing: IconButton(
color: Colors.green,
icon: Icon(
Icons.save,
//color: Colors.white,
),
onPressed: _enableSave
? () {
print("Save");
}
: null),*/
/* ReportArguments arg = new ReportArguments(
reportList[index].dailyReport, userApiKey!);
Navigator.pushNamed(context, reportDetails.routeName,
arguments: arg);*/
title: Text(
reportArguments.workName,
// reportDetailsList[index].foremanId!,
style: const TextStyle(color: Colors.white, fontSize: 18),
),
/*subtitle: Text(
"Date",
style: TextStyle(color: Colors.black.withOpacity(0.6)),
),*/
),
Padding(
padding: const EdgeInsets.all(10.0),
child: IntrinsicHeight(
child: Column(children: [
/* Row(children: [
Flexible(
child: Text(
arguments.workName,
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
),
]),
Divider(
thickness: 1.0,
),*/
Container(
padding: const EdgeInsets.only(left: 10, right: 10),
child: Center(
child: TextField(
//enabled: datePickerEnabled,
controller:
dateinput, //editing controller of this TextField
decoration: const InputDecoration(
icon:
Icon(Icons.calendar_today), //icon of text field
labelText: "Jelentés Dátuma" //label text of field
),
readOnly:
true, //set it true, so that user will not able to edit text
onTap: () async {
DateTime? pickedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(
2020), //DateTime.now() - not to allow to choose before today.
lastDate: DateTime.now());
if (pickedDate != null) {
//print(pickedDate); //pickedDate output format => 2021-03-10 00:00:00.000
String formattedDate =
DateFormat('yyyy.MM.dd').format(pickedDate);
//print(formattedDate); //formatted date output using intl package => 2021-03-16
//you can implement different kind of Date Format here according to your requirement
// setState(() {
//textMessageEnabled = true;
selectedDate = pickedDate;
dateinput.text =
formattedDate; //set output date to TextField value.
// });
} else {
print("Nem választott dátumot!");
}
},
)),
),
Container(
padding: const EdgeInsets.only(top: 20, left: 15, right: 15),
//margin: const EdgeInsets.only(left: 5, right: 5),
height: 100,
//child: Padding(
//padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
child: _buildLastName(),
),
const Divider(
thickness: 1.0,
),
SizedBox(
height: 300,
child: _isData
? gridList(context)
: SizedBox(
height:
MediaQuery.of(context).size.height / 1.3,
width: MediaQuery.of(context).size.width,
child: const Center(
child: CircularProgressIndicator(),
),
))
//ListView(children: UsersUi(arguments.userApiKey)),
/*new Column(
children: reportDetailsList[index]
.employeeList
.map(
(e) => new Text(
'• ' + findEmployee(e).name!,
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black.withOpacity(0.6)),
),
)
.toList(),
),
*/
]))),
],
),
),
]),
);
}
}