MobilePortal23/lib/app_worktime/dailyReport.dart

469 lines
16 KiB
Dart

import 'package:flutter/material.dart';
import 'package:dropdown_search/dropdown_search.dart';
//import 'package:flutter/rendering.dart';
import 'package:intl/intl.dart';
import '../models/employee_model.dart';
//import '../http_service.dart';
//import '../post_model.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:expandable/expandable.dart';
//import 'package:shared_preferences/shared_preferences.dart';
import 'package:mobile_portal_23/classes/common_classes.dart';
late EmployeePageArguments employeePageArguments;
String appDomain = "iotechnic.eu";
//String appDomain = "192.168.0.144";
GlobalKey _key = GlobalKey();
List<Widget> appbarAct = [
const IconButton(
icon: Icon(Icons.save),
tooltip: 'Open shopping cart',
onPressed: null,
)
];
class DailyReportApp extends StatelessWidget {
final State<StatefulWidget>? homeBodyState = _key.currentState;
DailyReportApp({super.key});
@override
Widget build(BuildContext context) {
return DailyReport(key: key);
/*Scaffold(
appBar: AppBar(
title: Text('Napi Jelentés'),
elevation: 10.0,
leading: Icon(Icons.arrow_back_ios_new),
actions: appbarAct),
body: DailyReport(key: _key),
backgroundColor: Colors.grey[300],
);*/
}
}
class DailyReport extends StatefulWidget {
const DailyReport({Key? key}) : super(key: key);
@override
_DailyReportState createState() => _DailyReportState();
}
class EmpList {
String? id;
String? name;
bool? value;
}
class _DailyReportState extends State<DailyReport> {
//final HttpService httpService = HttpService();
String dropdownValue = 'One';
DateTime selectedDate = DateTime.now();
bool datePickerEnabled = false;
bool textMessageEnabled = false;
bool isSwitched = false;
TextEditingController dateinput = TextEditingController();
List<Widget> switches = [];
List<EmpList> emplist = [];
//Future<List<EmployeeLs>> futureEmployee;
List<EmployeeLs> employeeList = [];
List<WorkLs> workList = [];
bool _isData = false;
String textMessage = "";
// String selectedWork = "";
bool saveEnabled = false;
bool _textMessageOK = false;
WorkLs? selectedWork; // "XST8X8F-6Q9M1FG-PE9948X-SFPHVX9"
String? userApiKey; // = "XST8X8F-6Q9M1FG-PE9948X-SPFHVX9";
final bool _expanded = false;
final bool _appBarSaveEnabled = false;
var currentFocus;
/*Future<Null> getSharedPrefs() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
userApiKey = prefs.getString("apiKey");
}*/
unfocus() {
currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
}
/*_loadApiKey() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('apiKey');
}*/
Future fetchdata() async {
print("http://$appDomain/apiGetDailyReport/${employeePageArguments.apiKey!}");
var res = await http.get(
// "http://iotechnic.eu/apiemployeelist/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
Uri.parse("http://$appDomain/apiGetDailyReport/${employeePageArguments.apiKey!}")); //userApiKey!));
//"http://192.168.0.144/apiGetDailyReport/X8B0PQS-2KYMCV3-G5WD74N-8G0CRAH");
if (res.statusCode == 200) {
var obj = json.decode(res.body);
return obj;
}
}
_print(String p) {
print(p);
}
_enableSave() {
setState(() {
appbarAct = [
IconButton(
icon: const Icon(Icons.save),
tooltip: 'Open shopping cart',
onPressed: saveEnabled ? _print("Save Click") : null),
];
});
}
_saveForm() {
EasyLoading.show(status: 'Mentés...');
// _onLoading2();
debugPrint(DateFormat('yyyy-MM-dd').format(selectedDate));
debugPrint("Title: ${selectedWork!.title}");
debugPrint("WorkId: ${selectedWork!.id}");
debugPrint("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': userApiKey,
'workId': selectedWork?.id,
'date': DateFormat('yyyy.MM.dd').format(selectedDate),
'msg': textMessage,
'employeeList': emp
};
//print(json.encode(report));
postDailyReport(report).then((value) {
if (value.contains("OK")) {
EasyLoading.showSuccess('Sikeres Mentés');
Future.delayed(const Duration(seconds: 3), () {
// Navigator.pop(context); //pop dialog
EasyLoading.dismiss();
Navigator.of(context).pop();
//_login();
});
}
});
}
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.');
}
}
@override
initState() {
super.initState();
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) {
});
print("KEY: ${employeePageArguments.apiKey}");
fetchdata().then((data) {
for (var item in data["employeeList"]) {
//debugPrint(item["_id"]);
employeeList.add(EmployeeLs(
id: item["_id"], name: item["name"], value: false));
}
for (var item in data["workList"]) {
debugPrint(item["_id"]);
workList.add(WorkLs(
id: item["_id"],
title: item["title"],
body: item["body"],
state: item["state"] ??"",
//value: false
));
}
_isData = true;
setState(() {
debugPrint('Fetch ok.');
});
//employeeList = data;
});
//userApiKey = _loadApiKey();
_enableSave();
//_isData = false;
dateinput.text = ""; //set the initial value of text field
}
@override
void dispose() {
// Clean up the controller when the widget is removed from the
// widget tree.
super.dispose();
}
Column myUi() {
saveEnabled = false;
_enableSave();
//debugPrint("UI Update." + _isData.toString());
return Column(
children: employeeList.map((hobby) {
if (hobby.value == true) {
saveEnabled = true;
_enableSave();
// debugPrint(hobby.name);
}
return SwitchListTile(
//controlAffinity: ListTileControlAffinity.trailing,
activeColor: Colors.green,
value: hobby.value,
title: Text(hobby.name),
onChanged: _textMessageOK == false
? null
: (newValue) {
setState(() {
hobby.value = newValue;
});
});
}).toList());
}
DropdownSearch workUi() {
return DropdownSearch<WorkLs>(
//mode: Mode.MENU,
//showSelectedItem: true,
items: workList,
/*.map((e) {
return DropdownMenuItem<WorkLs>(child: Text(e.title), value: e);
}).toList(),*/
//showSearchBox: true,
//;["Brazil", "Italia (Disabled)", "Tunisia", 'Canada'],
//label: "Munka kiválasztása",
// hint: "country in menu mode",
//popupItemDisabled: (String s) => s.startsWith('I'),
onChanged: (data) {
//_dateSelected();
selectedWork = data;
//_selectDate(context);
setState(() {
datePickerEnabled = true;
});
});
}
@override
Widget build(BuildContext context) => GestureDetector(
onTap: () {
//_enableSave();
FocusScope.of(context).unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text('Napi Jelentés'),
elevation: 10.0,
leading: const Icon(Icons.arrow_back_ios_new),
actions: [
IconButton(
icon: const Icon(Icons.save),
tooltip: 'Open shopping cart',
onPressed: saveEnabled ? _print("Save Click") : null),
]),
//body: DailyReport(key: _key),
backgroundColor: Colors.grey[300],
body: SingleChildScrollView(
keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
//itemExtent: 100,
// shrinkWrap: true,
child:
//saveBegin == true
// ? _onLoading()
//: _isData == false
_isData == false
? SizedBox(
height: MediaQuery.of(context).size.height / 1.3,
width: MediaQuery.of(context).size.width,
child: const Center(
child: CircularProgressIndicator(),
),
)
: Column(
//diameterRatio: 10,
children: <Widget>[
Container(
padding: const EdgeInsets.all(15),
height: 100,
child: workUi(),
),
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(
2000), //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: TextField(
enabled: textMessageEnabled,
//keyboardType: TextInputType.multiline,
maxLines: null,
onSubmitted: (value) => {
textMessage = value,
(value.length > 3) == true
? _textMessageOK = true
: _textMessageOK = false,
},
//expands: true,
textInputAction: TextInputAction.done,
decoration: const InputDecoration(
border: OutlineInputBorder(),
labelText: 'Munkafolyamat leírása',
),
/* onChanged: (value) => {
textMessage = value,
(value.length > 3) == true
? _textMessageOK = true
: _textMessageOK = false,
//myUi.call()
}*/
)),
//),
// The checkboxes will be here
Container(
padding: const EdgeInsets.only(left: 10, right: 10),
child: Card(
//elevation: 2,
child: ExpandablePanel(
header: Container(
height: 35,
padding: const EdgeInsets.all(5),
color: Colors.indigo,
child: const Text(
"Jelenlévők kiválasztása",
style: TextStyle(
fontSize: 18,
color: Colors.white,
fontWeight: FontWeight.bold),
),
),
collapsed:
const Text("Érintse a lenyitáshoz."),
expanded: AbsorbPointer(
absorbing: !_textMessageOK,
child: myUi(),
)
// tapHeaderToExpand: true,
//hasIcon: true,
))
/* Column(children: [
ListTile(
title: const Text(
"Jelenlévők",
style: TextStyle(fontWeight: FontWeight.bold),
),
leading: Icon(Icons.arrow_drop_down_circle),
//onTap: ,
),
_isData == false
? Center(child: new CircularProgressIndicator())
: myUi(),
]),*/
),
Container(
padding: const EdgeInsets.all(20),
child: Center(
child: ElevatedButton.icon(
onPressed: saveEnabled ? _saveForm : null,
icon: const Icon(Icons.save),
label: const Text('Save')),
// something like 2013-04-20
//Text(DateFormat('yyyy.MM.dd').format(selectedDate))
),
),
],
))));
}