diff --git a/lib/Reports/add_reports.dart b/lib/Reports/add_reports.dart index 539ab53..0f0ca12 100644 --- a/lib/Reports/add_reports.dart +++ b/lib/Reports/add_reports.dart @@ -45,7 +45,7 @@ class _AddReportsState extends State { imageFileList.addAll(selectedImages); } - var res = await AppSettings.uploadImageForFindings(imageFileList); + var res = await AppSettings.uploadFindingsGallery(imageFileList); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -59,7 +59,7 @@ class _AddReportsState extends State { if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); - var res = await AppSettings.uploadImageForFindingsCamera(image); + var res = await AppSettings.uploadFindingsCamera(image); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -69,7 +69,38 @@ class _AddReportsState extends State { print('Failed to pick image: $e'); } } + /*Future pickImageFromGalleryForUpdate() async { + imageFileList = []; + final List? selectedImages = await imagePicker.pickMultiImage(); + AppSettings.preLoaderDialog(context); + if (selectedImages!.isNotEmpty) { + imageFileList.addAll(selectedImages); + } + var res = await AppSettings.updateFindingsGallery(imageFileList,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['findings']; + }); + } + + Future takeImageFromCameraForUpdate() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.updateFindingsCamera(image,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['findings']; + }); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + }*/ Future takeImageFromCameraForReports() async { try { @@ -104,18 +135,17 @@ class _AddReportsState extends State { }); } - Future takeImageFromCameraForPrescriptions() async { try { final image = await _picker.pickImage(source: ImageSource.camera); if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); - var res = await AppSettings.uploadImageForFindingsCamera(image); + var res = await AppSettings.uploadPrescriptionsCamera(image); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { - uiFindingsImages = jsonDecode(res)['findings']; + uiPrescriptionImages = jsonDecode(res)['precription']; }); } on PlatformException catch (e) { print('Failed to pick image: $e'); @@ -123,14 +153,15 @@ class _AddReportsState extends State { } Future pickImageFromGalleryForPrescriptions() async { - imageFileListPrescriptions = []; + // imageFileListPrescriptions = []; final List? selectedImages = await imagePicker.pickMultiImage(); AppSettings.preLoaderDialog(context); if (selectedImages!.isNotEmpty) { imageFileListPrescriptions.addAll(selectedImages); } - var res = await AppSettings.uploadImageForPrescriptions(imageFileListPrescriptions); + var res = await AppSettings.uploadPrescriptionsGallery( + imageFileListPrescriptions); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -138,8 +169,6 @@ class _AddReportsState extends State { }); } - - @override Widget build(BuildContext context) { return Scaffold( @@ -233,143 +262,167 @@ class _AddReportsState extends State { ), Row( children: [ - - Expanded(child: RadioListTile( - title: Text("For Yourself"), - value: "self", - groupValue: prescriptionFor, - activeColor: primaryColor, - onChanged: (value){ - setState(() { - prescriptionFor = value.toString(); - }); - }, - ),), - Expanded(child: RadioListTile( - title: Text("For Family"), - value: "others", - groupValue: prescriptionFor, - activeColor: primaryColor, - onChanged: (value){ - setState(() { - prescriptionFor = value.toString(); - }); - }, - ),), + Expanded( + child: RadioListTile( + title: Text("For Yourself"), + value: "self", + groupValue: prescriptionFor, + activeColor: primaryColor, + onChanged: (value) { + setState(() { + prescriptionFor = value.toString(); + }); + }, + ), + ), + Expanded( + child: RadioListTile( + title: Text("For Family"), + value: "others", + groupValue: prescriptionFor, + activeColor: primaryColor, + onChanged: (value) { + setState(() { + prescriptionFor = value.toString(); + }); + }, + ), + ), ], ), Visibility( - visible:prescriptionFor.toString().toLowerCase()=='others' , + visible: + prescriptionFor.toString().toLowerCase() == 'others', child: Container( child: TextFormField( cursorColor: greyColor, controller: patientNameController, - decoration: textFormFieldDecoration(Icons.person,'Enter patient name'), - + decoration: textFormFieldDecoration( + Icons.person, 'Enter patient name'), ), - ),), - SizedBox(height:MediaQuery.of(context).size.height * .02,), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * .02, + ), Visibility( - visible:prescriptionFor.toString().toLowerCase()=='others' , + visible: + prescriptionFor.toString().toLowerCase() == 'others', child: Container( child: TextFormField( cursorColor: greyColor, keyboardType: TextInputType.number, controller: patientAgeController, - decoration: textFormFieldDecoration(Icons.person,'Enter patient age'), - + decoration: textFormFieldDecoration( + Icons.person, 'Enter patient age'), ), - ),), + ), + ), Visibility( - visible:prescriptionFor.toString().toLowerCase()=='others' , + visible: + prescriptionFor.toString().toLowerCase() == 'others', child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - - Expanded(child: RadioListTile( - title: Text("Male",style: TextStyle(fontSize: 10)), - value: "male", - groupValue: gender, - activeColor: primaryColor, - onChanged: (value){ - setState(() { - gender = value.toString(); - }); - }, - ),), - Expanded(child: RadioListTile( - title: Text("Female",style: TextStyle(fontSize: 10),), - value: "female", - groupValue: gender, - activeColor: primaryColor, - onChanged: (value){ - setState(() { - gender = value.toString(); - }); - }, - ),), - Expanded(child: RadioListTile( - title: Text("Others",style: TextStyle(fontSize: 10)), - value: "other", - groupValue: gender, - activeColor: primaryColor, - onChanged: (value){ - setState(() { - gender = value.toString(); - }); - }, - ),), + Expanded( + child: RadioListTile( + title: Text("Male", style: TextStyle(fontSize: 10)), + value: "male", + groupValue: gender, + activeColor: primaryColor, + onChanged: (value) { + setState(() { + gender = value.toString(); + }); + }, + ), + ), + Expanded( + child: RadioListTile( + title: Text( + "Female", + style: TextStyle(fontSize: 10), + ), + value: "female", + groupValue: gender, + activeColor: primaryColor, + onChanged: (value) { + setState(() { + gender = value.toString(); + }); + }, + ), + ), + Expanded( + child: RadioListTile( + title: + Text("Others", style: TextStyle(fontSize: 10)), + value: "other", + groupValue: gender, + activeColor: primaryColor, + onChanged: (value) { + setState(() { + gender = value.toString(); + }); + }, + ), + ), ], - ),), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground ), - onPressed: () async { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return SizedBox( - height: 200, - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - child: Icon( - Icons.camera_alt_outlined, - size: 100, - color: primaryColor, + ), + Visibility( + visible: uiFindingsImages.length == 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCamera(); + Navigator.pop(context); + }, ), - onTap: () async { - await takeImageFromCamera(); - Navigator.pop(context); - }, - ), - SizedBox( - width: MediaQuery.of(context).size.width * - .20, - ), - GestureDetector( - child: Icon( - Icons.photo, - size: 100, - color: primaryColor, + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, ), - onTap: () async { - await pickImageFromGallery(); - Navigator.pop(context); - }, - ), - ], + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGallery(); + Navigator.pop(context); + }, + ), + ], + ), ), - ), - ); - }); - }, - child: const Text('Select Findings'), + ); + }); + }, + child: const Text('Select Findings'), + ), ), Visibility( visible: uiFindingsImages.length > 0, @@ -384,8 +437,11 @@ class _AddReportsState extends State { children: [ Card( child: Container( - width: MediaQuery.of(context).size.width * .30, - height: MediaQuery.of(context).size.height * .15, + width: MediaQuery.of(context).size.width * + .30, + height: + MediaQuery.of(context).size.height * + .15, decoration: BoxDecoration( shape: BoxShape.rectangle, image: DecorationImage( @@ -407,54 +463,111 @@ class _AddReportsState extends State { ); }), )), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground + Visibility( + visible: uiFindingsImages.length != 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: Colors.red, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCamera(); + Navigator.pop(context); + }, + ), + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGallery(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + child: const Text('Add Findings'), ), - onPressed: () async { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return SizedBox( - height: 200, - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - child: Icon( - Icons.camera_alt_outlined, - size: 100, - color: primaryColor, + ), + Visibility( + visible: uiReportsImages.length == 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForReports(); + Navigator.pop(context); + }, ), - onTap: () async { - await takeImageFromCameraForReports(); - Navigator.pop(context); - }, - ), - SizedBox( - width: MediaQuery.of(context).size.width * - .20, - ), - GestureDetector( - child: Icon( - Icons.photo, - size: 100, - color: primaryColor, + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, ), - onTap: () async { - await pickImageFromGalleryForReports(); - Navigator.pop(context); - }, - ), - ], + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForReports(); + Navigator.pop(context); + }, + ), + ], + ), ), - ), - ); - }); - }, - child: const Text('Select Reports'), + ); + }); + }, + child: const Text('Select Reports'), + ), ), Visibility( visible: uiReportsImages.length > 0, @@ -469,15 +582,18 @@ class _AddReportsState extends State { children: [ Card( child: Container( - width: MediaQuery.of(context).size.width * .30, - height: MediaQuery.of(context).size.height * .15, + width: MediaQuery.of(context).size.width * + .30, + height: + MediaQuery.of(context).size.height * + .15, decoration: BoxDecoration( shape: BoxShape.rectangle, image: DecorationImage( image: NetworkImage( - uiReportsImages[index] - ['url']) - as ImageProvider, // picked file + uiReportsImages[index] + ['url']) + as ImageProvider, // picked file fit: BoxFit.fill)), ), ), @@ -492,56 +608,112 @@ class _AddReportsState extends State { ); }), )), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground + Visibility( + visible: uiReportsImages.length != 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: Colors.red, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForReports(); + Navigator.pop(context); + }, + ), + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForReports(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + child: const Text('Add Reports'), ), - onPressed: () async { - showModalBottomSheet( - context: context, - builder: (BuildContext context) { - return SizedBox( - height: 200, - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - GestureDetector( - child: Icon( - Icons.camera_alt_outlined, - size: 100, - color: primaryColor, + ), + Visibility( + visible: uiPrescriptionImages.length == 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForPrescriptions(); + Navigator.pop(context); + }, ), - onTap: () async { - await takeImageFromCameraForPrescriptions(); - Navigator.pop(context); - }, - ), - SizedBox( - width: MediaQuery.of(context).size.width * - .20, - ), - GestureDetector( - child: Icon( - Icons.photo, - size: 100, - color: primaryColor, + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, ), - onTap: () async { - await pickImageFromGalleryForPrescriptions(); - Navigator.pop(context); - }, - ), - ], + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForPrescriptions(); + Navigator.pop(context); + }, + ), + ], + ), ), - ), - ); - }); - }, - child: const Text('Select Prescriptions'), + ); + }); + }, + child: const Text('Select Prescriptions'), + ), ), - Visibility( visible: uiPrescriptionImages.length > 0, child: Container( @@ -555,16 +727,44 @@ class _AddReportsState extends State { children: [ Card( child: Container( - width: MediaQuery.of(context).size.width * .30, - height: MediaQuery.of(context).size.height * .15, + width: MediaQuery.of(context).size.width * + .30, + height: + MediaQuery.of(context).size.height * + .15, decoration: BoxDecoration( shape: BoxShape.rectangle, image: DecorationImage( image: NetworkImage( - uiPrescriptionImages[index] - ['url']) - as ImageProvider, // picked file + uiPrescriptionImages[index]['url']) + as ImageProvider, // picked file fit: BoxFit.fill)), + child: Stack(children: [ + Positioned( + right: 0, + child: Container( + child: IconButton( + iconSize: 30, + icon: const Icon( + Icons.cancel, + color: Colors.red, + ), + onPressed: () async { + AppSettings.preLoaderDialog(context); + + String fileName = uiPrescriptionImages[index]['url'].split('/').last; + var response = await AppSettings.deletePrescriptions(fileName); + print(jsonDecode(response)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + uiPrescriptionImages = jsonDecode(response)['precription']; + }); + + }, + ), + ), + ) + ]), ), ), /*Expanded(child:IconButton( @@ -578,89 +778,149 @@ class _AddReportsState extends State { ); }), )), - + Visibility( + visible: uiPrescriptionImages.length != 0, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + primary: Colors.red, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForPrescriptions(); + Navigator.pop(context); + }, + ), + SizedBox( + width: + MediaQuery.of(context).size.width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForPrescriptions(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + }, + child: const Text('Add Prescriptions'), + ), + ), Container( - width:double.infinity, + width: double.infinity, height: MediaQuery.of(context).size.height * .06, child: ElevatedButton( style: ElevatedButton.styleFrom( primary: buttonColors, // background onPrimary: Colors.black, // foreground ), - onPressed: () async{ - - if(doctorNameController.text!=''&& problemController.text!=''&& dateInput.text!=''&&prescriptionFor!=''){ - - String _name=''; - String _age=''; - String? _gender=''; - - if(prescriptionFor.toString().toLowerCase()=='others'){ - if(patientNameController!=''&& patientAgeController.text!=''&&gender!=''){ - _name=patientNameController.text; - _age=patientAgeController.text; - _gender=gender; + onPressed: () async { + if (doctorNameController.text != '' && + problemController.text != '' && + dateInput.text != '' && + prescriptionFor != '') { + String _name = ''; + String _age = ''; + String? _gender = ''; + + if (prescriptionFor.toString().toLowerCase() == + 'others') { + if (patientNameController != '' && + patientAgeController.text != '' && + gender != '') { + _name = patientNameController.text; + _age = patientAgeController.text; + _gender = gender; + } else { + AppSettings.longFailedToast( + 'Please enter details'); } - else{ - AppSettings.longFailedToast('Please enter details'); - } - } - else{ - _name=AppSettings.userName; - _age=AppSettings.age; - _gender=AppSettings.gender; + } else { + _name = AppSettings.userName; + _age = AppSettings.age; + _gender = AppSettings.gender; } - AppSettings.preLoaderDialog(context); - bool isOnline = await AppSettings.internetConnectivity(); - if(isOnline){ - - var payload = new Map(); - payload["problem"] = problemController.text.toString(); - payload["doctorName"] = doctorNameController.text.toString(); - payload["hospitalName"] = hospitalNameController.text.toString(); - payload["date"] = dateInput.text.toString(); - payload["findings_date"] = ''; - payload["reports_date"] = ''; - payload["prescription_date"] = ''; - payload["patientType"] = prescriptionFor.toString(); - payload["others"] ={ - "name": _name, - "age": int.parse(_age), - "gender": _gender.toString().toLowerCase() - }; - payload["findings"] =uiFindingsImages; - payload["reports"] =uiReportsImages; - payload["prescription"] =uiPrescriptionImages; - - bool uploadStatus = await AppSettings.addRecords(payload); - - try{ - if(uploadStatus){ - Navigator.of(context,rootNavigator: true).pop(); - AppSettings.longSuccessToast('Record added successfully'); - Navigator.pop(context); - } - else{ - Navigator.of(context,rootNavigator: true).pop(); - AppSettings.longFailedToast('Fail to add record details'); - } + AppSettings.preLoaderDialog(context); + bool isOnline = + await AppSettings.internetConnectivity(); + if (isOnline) { + var payload = new Map(); + payload["problem"] = + problemController.text.toString(); + payload["doctorName"] = + doctorNameController.text.toString(); + payload["hospitalName"] = + hospitalNameController.text.toString(); + payload["date"] = dateInput.text.toString(); + payload["findings_date"] = ''; + payload["reports_date"] = ''; + payload["prescription_date"] = ''; + payload["patientType"] = + prescriptionFor.toString(); + payload["others"] = { + "name": _name, + "age": int.parse(_age), + "gender": _gender.toString().toLowerCase() + }; + payload["findings"] = uiFindingsImages; + payload["reports"] = uiReportsImages; + payload["prescription"] = uiPrescriptionImages; + + bool uploadStatus = + await AppSettings.addRecords(payload); + + try { + if (uploadStatus) { + Navigator.of(context, rootNavigator: true) + .pop(); + AppSettings.longSuccessToast( + 'Record added successfully'); + Navigator.pop(context); + } else { + Navigator.of(context, rootNavigator: true) + .pop(); + AppSettings.longFailedToast( + 'Fail to add record details'); } - catch(e){ - print(e); - Navigator.of(context,rootNavigator: true).pop(); - AppSettings.longFailedToast('Fail to add record details'); - } - - } - else{ - AppSettings.longFailedToast('Please check internet'); + } catch (e) { + print(e); + Navigator.of(context, rootNavigator: true) + .pop(); + AppSettings.longFailedToast( + 'Fail to add record details'); } - - - - } - else{ - AppSettings.longFailedToast('Please enter valid details'); + } else { + AppSettings.longFailedToast( + 'Please check internet'); + } + } else { + AppSettings.longFailedToast( + 'Please enter valid details'); } }, child: const Text('Submit'), diff --git a/lib/Reports/allreports.dart b/lib/Reports/allreports.dart index c1d43f4..671d88c 100644 --- a/lib/Reports/allreports.dart +++ b/lib/Reports/allreports.dart @@ -24,8 +24,63 @@ class _AllReportsState extends State { List reportsListOriginal = []; bool isReportsDataLoading = false; bool isSereverIssue = false; + TextEditingController searchController = TextEditingController(); + String dropdownSearchType = 'Problem'; + var typeOfSearchItems = [ + 'Problem', + 'Doctor', + 'Date', + ]; + + Future getAllRecords() async { + isReportsDataLoading=true; + try { + var response = await AppSettings.getAllRecords(); + + setState(() { + reportsListOriginal = ((jsonDecode(response)) as List) + .map((dynamic model) { + return ReportsModel.fromJson(model); + }).toList(); + reportsList=reportsListOriginal.reversed.toList(); + isReportsDataLoading = false; + }); + } catch (e) { + setState(() { + isReportsDataLoading = false; + isSereverIssue = true; + }); + } + } + + + Future getRecordsByProblemName(var problem) async { + + isReportsDataLoading=true; + try { + var response = await AppSettings.getAllRecords(); + + setState(() { + reportsListOriginal = ((jsonDecode(response)) as List) + .map((dynamic model) { + return ReportsModel.fromJson(model); + }).toList(); + reportsList=reportsListOriginal.reversed.toList(); + reportsList= reportsListOriginal.where( + (x) => x.problem.toString().toLowerCase().contains(problem.toString().toLowerCase()) + ).toList(); + isReportsDataLoading = false; + }); + } catch (e) { + setState(() { + isReportsDataLoading = false; + isSereverIssue = true; + }); + } + } + + Future getRecordsByDoctorName(var doctor) async { - Future gaetAllRecords() async { isReportsDataLoading=true; try { var response = await AppSettings.getAllRecords(); @@ -36,6 +91,9 @@ class _AllReportsState extends State { return ReportsModel.fromJson(model); }).toList(); reportsList=reportsListOriginal.reversed.toList(); + reportsList= reportsListOriginal.where( + (x) => x.doctorName.toString().toLowerCase().contains(doctor.toString().toLowerCase()) + ).toList(); isReportsDataLoading = false; }); } catch (e) { @@ -48,7 +106,7 @@ class _AllReportsState extends State { @override void initState() { - gaetAllRecords(); + getAllRecords(); super.initState(); } @@ -244,207 +302,397 @@ class _AllReportsState extends State { } + Widget _filtereddata(){ + if(reportsList.length!=0){ + return ListView.builder( + padding: EdgeInsets.all(0), + itemCount: reportsList.length, + itemBuilder: (BuildContext context, int index) { + return Card( + + //color: prescriptionsList[index].cardColor, + child: Padding( + padding:EdgeInsets.all(8) , + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + + Container( + width: MediaQuery.of(context).size.width * .55, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Problem: '+reportsList[index].problem.toString().toUpperCase(),style: problemTextStyle()), + Text(reportsList[index].doctorName.toString().toUpperCase(),style: valuesTextStyle()), + Text(reportsList[index].hospitalName.toString().toUpperCase(),style: valuesTextStyle()), + Text(reportsList[index].date.toString().toUpperCase(),style: valuesTextStyle()), + Text(reportsList[index].patient_name.toString().toUpperCase(),style: valuesTextStyle()), + Row( + children: [ + Text(reportsList[index].gender.toString().toUpperCase(),style: valuesTextStyle()), + SizedBox(width:MediaQuery.of(context).size.width * .05,), + Text(reportsList[index].age.toString().toUpperCase()+" Yrs",style: valuesTextStyle()), + ], + ), + + + ], + ), + + + ), + + + Expanded(child:IconButton( + icon: const Icon(Icons.edit,color: primaryColor,), + onPressed: () { + + + }, + ),), + Expanded(child:IconButton( + icon: const Icon(Icons.delete,color: primaryColor,), + + onPressed: () async{ + showDialog( + //if set to true allow to close popup by tapping out of the popup + //barrierDismissible: false, + context: context, + builder: (BuildContext context) => AlertDialog( + title: const Text('Do you want to delete Record?', + style: TextStyle( + color: primaryColor, + fontSize: 20, + )), + actionsAlignment: MainAxisAlignment.spaceBetween, + actions: [ + TextButton( + onPressed: ()async { + + bool deleteTankStatus = await AppSettings.deleteRecord(reportsList[index].recordId); + + + if(deleteTankStatus){ + getAllRecords(); + AppSettings.longSuccessToast('Record deleted successfully'); + Navigator.of(context).pop(true); + + } + else{ + AppSettings.longFailedToast('Record deletion failed'); + Navigator.of(context).pop(true); + } + }, + child: const Text('Yes', + style: TextStyle( + color: primaryColor, + fontSize: 20, + )), + ), + TextButton( + onPressed: () { + Navigator.of(context).pop(true); + }, + child: const Text('No', + style: TextStyle( + color: primaryColor, + fontSize: 20, + )), + ), + ], + ), + ); + + + + }, + ),) + + ], + + ), + + Row( + children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + Navigator.push( + context, + new MaterialPageRoute( + builder: (__) => new FindingImages(imageDetails:reportsList[index].findingsImages,recordId: reportsList[index].recordId,))).then((value) { + getAllRecords(); + }); + }, + child: Text('Findings: '+reportsList[index].findingsImages.length.toString()), + ), + SizedBox( + width:MediaQuery.of(context).size.width * .05, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + Navigator.push( + context, + new MaterialPageRoute( + builder: (__) => new ReportImages(imageDetails:reportsList[index].reportImages,recordId:reportsList[index].recordId ,))).then((value) { + getAllRecords(); + }); + + }, + child: Text('Reports: '+reportsList[index].reportImages.length.toString()), + ), + SizedBox( + width:MediaQuery.of(context).size.width * .05, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: primaryColor, // background + onPrimary: Colors.white, // foreground + ), + onPressed: () async { + Navigator.push( + context, + new MaterialPageRoute( + builder: (__) => new PrescriptionImages(imageDetails:reportsList[index].prescriptionImages,recordId: reportsList[index].recordId,familyDetails:reportsList[index]))).then((value) { + getAllRecords(); + }); + + }, + child: Text('Prescriptions: '+reportsList[index].prescriptionImages.length.toString()), + ), + ], + ), + + + + Visibility( + visible: false, + child: Text('Findings',style: headingsTextStyle()),), + Visibility( + visible: false, + child: findings(reportsList[index])), + Visibility( + visible: false, + child: Text('Reports',style: headingsTextStyle()),), + Visibility( + visible: false, + child:reports(reportsList[index]) ), + Visibility( + visible: false, + child: Text('Prescriptions',style: headingsTextStyle()),), + Visibility( + visible:false, + child:prescriptions(reportsList[index]) ), + ], + ), + ), + ); + }); + } + else{ + return Padding(padding: EdgeInsets.fromLTRB(60,10,60,10), + child: Column( + children: [ + Text('No records found related to your search'), + SizedBox( + height: 20, + ), + CircleAvatar( + backgroundColor: Colors.red, + radius: 30, + child: const Icon( + Icons.info, + color: Colors.white, + ), + ) + ], + ),); + + } + } + Widget _allreports(){ - if(reportsList.length!=0){ + if(reportsListOriginal.length!=0){ + return Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ - Expanded(child:ListView.builder( - padding: EdgeInsets.all(0), - itemCount: reportsList.length, - itemBuilder: (BuildContext context, int index) { - return Card( - - //color: prescriptionsList[index].cardColor, - child: Padding( - padding:EdgeInsets.all(8) , - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - - Container( - width: MediaQuery.of(context).size.width * .55, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Problem: '+reportsList[index].problem.toString().toUpperCase(),style: problemTextStyle()), - Text(reportsList[index].doctorName.toString().toUpperCase(),style: valuesTextStyle()), - Text(reportsList[index].hospitalName.toString().toUpperCase(),style: valuesTextStyle()), - Text(reportsList[index].date.toString().toUpperCase(),style: valuesTextStyle()), - Text(reportsList[index].patient_name.toString().toUpperCase(),style: valuesTextStyle()), - Row( - children: [ - Text(reportsList[index].gender.toString().toUpperCase(),style: valuesTextStyle()), - SizedBox(width:MediaQuery.of(context).size.width * .05,), - Text(reportsList[index].age.toString().toUpperCase()+" Yrs",style: valuesTextStyle()), - ], - ), - - - ], - ), - - - ), - - - Expanded(child:IconButton( - icon: const Icon(Icons.edit,color: primaryColor,), - onPressed: () { - - - }, - ),), - Expanded(child:IconButton( - icon: const Icon(Icons.delete,color: primaryColor,), - - onPressed: () async{ - showDialog( - //if set to true allow to close popup by tapping out of the popup - //barrierDismissible: false, - context: context, - builder: (BuildContext context) => AlertDialog( - title: const Text('Do you want to delete Record?', - style: TextStyle( - color: primaryColor, - fontSize: 20, - )), - actionsAlignment: MainAxisAlignment.spaceBetween, - actions: [ - TextButton( - onPressed: ()async { - - bool deleteTankStatus = await AppSettings.deleteRecord(reportsList[index].recordId); - - - if(deleteTankStatus){ - gaetAllRecords(); - AppSettings.longSuccessToast('Record deleted successfully'); - Navigator.of(context).pop(true); - - } - else{ - AppSettings.longFailedToast('Record deletion failed'); - Navigator.of(context).pop(true); - } - }, - child: const Text('Yes', - style: TextStyle( - color: primaryColor, - fontSize: 20, - )), - ), - TextButton( - onPressed: () { - Navigator.of(context).pop(true); - }, - child: const Text('No', - style: TextStyle( - color: primaryColor, - fontSize: 20, - )), - ), - ], - ), - ); - - - - }, - ),) - - ], - - ), - - Row( - children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground - ), - onPressed: () async { - Navigator.push( - context, - new MaterialPageRoute( - builder: (__) => new FindingImages(imageDetails:reportsList[index].findingsImages,recordId: reportsList[index].recordId,))).then((value) { - gaetAllRecords(); - }); - }, - child: Text('Findings: '+reportsList[index].findingsImages.length.toString()), - ), - SizedBox( - width:MediaQuery.of(context).size.width * .05, - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground - ), - onPressed: () async { - Navigator.push( - context, - new MaterialPageRoute( - builder: (__) => new ReportImages(imageDetails:reportsList[index].reportImages))); - - }, - child: Text('Reports: '+reportsList[index].reportImages.length.toString()), - ), - SizedBox( - width:MediaQuery.of(context).size.width * .05, - ), - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: primaryColor, // background - onPrimary: Colors.white, // foreground - ), - onPressed: () async { - Navigator.push( - context, - new MaterialPageRoute( - builder: (__) => new PrescriptionImages(imageDetails:reportsList[index].prescriptionImages,recordId: reportsList[index].recordId,familyDetails:reportsList[index]))).then((value) { - gaetAllRecords(); - }); - - }, - child: Text('Prescriptions: '+reportsList[index].prescriptionImages.length.toString()), - ), - ], - ), - - - - Visibility( - visible: false, - child: Text('Findings',style: headingsTextStyle()),), - Visibility( - visible: false, - child: findings(reportsList[index])), - Visibility( - visible: false, - child: Text('Reports',style: headingsTextStyle()),), - Visibility( - visible: false, - child:reports(reportsList[index]) ), - Visibility( - visible: false, - child: Text('Prescriptions',style: headingsTextStyle()),), - Visibility( - visible:false, - child:prescriptions(reportsList[index]) ), - ], + Container( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 0), + child: DropdownButtonFormField( + // Initial Value + value: dropdownSearchType, + isExpanded: true, + decoration: const InputDecoration( + prefixIcon: Icon( + Icons.search, + color: greyColor, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: greyColor)), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: greyColor), + ), + labelText: 'Search By', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + + hint: Text('Select Search Type'), + // Down Arrow Icon + icon: const Icon(Icons.keyboard_arrow_down), + + // Array list of items + items: typeOfSearchItems.map((String items) { + return DropdownMenuItem( + value: items, + child: Text(items), + ); + }).toList(), + // After selecting the desired option,it will + // change button value to selected value + onChanged: (String? newValue) { + setState(() { + dropdownSearchType = newValue!; + }); + }, + ), + ), + Visibility( + visible:dropdownSearchType.toString().toLowerCase()=='problem' , + child: Container( + height: MediaQuery.of(context).size.height * .07, + padding: EdgeInsets.all(5), + child: Center(child: TextField( + + cursorColor: primaryColor, + controller: searchController, + onChanged: (string) { + if(string.length>=1){ + getRecordsByProblemName(string); + } + else{ + getAllRecords(); + } + }, + decoration: InputDecoration( + prefixIcon: Icon( + Icons.search, + color: primaryColor, + ), + /*suffixIcon: Icon( + Icons.clear, + color: greyColor, + ),*/ + suffixIcon: IconButton( + icon: Icon( + Icons.clear, + color: Colors.red, ), + onPressed: () { + setState(() { + searchController.text=''; + }); + getAllRecords(); + }, ), - ); - }) ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + //labelText: 'Search by phone number', + hintText: 'Search by problem', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ),) + ),), + Visibility( + visible:dropdownSearchType.toString().toLowerCase()=='doctor' , + child: Container( + height: MediaQuery.of(context).size.height * .07, + padding: EdgeInsets.all(5), + child: Center(child: TextField( + + cursorColor: primaryColor, + controller: searchController, + onChanged: (string) { + if(string.length>=1){ + getRecordsByDoctorName(string); + } + else{ + getAllRecords(); + } + }, + decoration: InputDecoration( + prefixIcon: Icon( + Icons.search, + color: primaryColor, + ), + /*suffixIcon: Icon( + Icons.clear, + color: greyColor, + ),*/ + suffixIcon: IconButton( + icon: Icon( + Icons.clear, + color: Colors.red, + ), + onPressed: () { + setState(() { + searchController.text=''; + }); + getAllRecords(); + }, + ), + border: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: primaryColor), + borderRadius: BorderRadius.circular(30), + ), + //labelText: 'Search by phone number', + hintText: 'Search by doctor', + labelStyle: TextStyle( + color: greyColor, //<-- SEE HERE + ), + ), + ),) + ),), + Expanded(child: _filtereddata()), Padding( padding: EdgeInsets.fromLTRB(8, 8, 8, 8), child: CircleAvatar( @@ -466,7 +714,7 @@ class _AllReportsState extends State { builder: (context) => AddPrescription()), );*/ Navigator.push(context, MaterialPageRoute(builder: (context) => AddReports())).then((value) { - gaetAllRecords(); + getAllRecords(); }); //showBoreAddingDialog(); }, @@ -483,6 +731,8 @@ class _AllReportsState extends State { ), ), ]); + + } else{ return Center( @@ -507,7 +757,7 @@ class _AllReportsState extends State { ), onPressed: () async { Navigator.push(context, MaterialPageRoute(builder: (context) => AddReports())).then((value) { - gaetAllRecords(); + getAllRecords(); }); }, ), diff --git a/lib/Reports/finding_images.dart b/lib/Reports/finding_images.dart index 609bc5f..951ad3a 100644 --- a/lib/Reports/finding_images.dart +++ b/lib/Reports/finding_images.dart @@ -27,7 +27,7 @@ class _FindingImagesState extends State { List uiFindingsImages = []; final ImagePicker _picker = ImagePicker(); - Future pickImageFromGallery() async { + /* Future pickImageFromGallery() async { imageFileList = []; final List? selectedImages = await imagePicker.pickMultiImage(); AppSettings.preLoaderDialog(context); @@ -35,23 +35,7 @@ class _FindingImagesState extends State { imageFileList.addAll(selectedImages); } - var res = await AppSettings.uploadImageForFindings(imageFileList); - print(jsonDecode(res)); - Navigator.of(context, rootNavigator: true).pop(); - setState(() { - widget.imageDetails = jsonDecode(res)['findings']; - }); - } - - Future pickImageFromGalleryForUpdate() async { - imageFileList = []; - final List? selectedImages = await imagePicker.pickMultiImage(); - AppSettings.preLoaderDialog(context); - if (selectedImages!.isNotEmpty) { - imageFileList.addAll(selectedImages); - } - - var res = await AppSettings.uploadImageForFindingsUpdate(imageFileList,widget.recordId); + var res = await AppSettings.updateFindingsGallery(imageFileList,widget.recordId); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -65,7 +49,7 @@ class _FindingImagesState extends State { if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); - var res = await AppSettings.uploadImageForFindingsFromCamera(image); + var res = await AppSettings.updateFindingsCamera(image,widget.recordId); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -74,6 +58,22 @@ class _FindingImagesState extends State { } on PlatformException catch (e) { print('Failed to pick image: $e'); } + }*/ + + Future pickImageFromGalleryForUpdate() async { + imageFileList = []; + final List? selectedImages = await imagePicker.pickMultiImage(); + AppSettings.preLoaderDialog(context); + if (selectedImages!.isNotEmpty) { + imageFileList.addAll(selectedImages); + } + + var res = await AppSettings.updateFindingsGallery(imageFileList,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['findings']; + }); } Future takeImageFromCameraForUpdate() async { @@ -82,7 +82,7 @@ class _FindingImagesState extends State { if (image == null) return; final imageTemp = File(image.path); AppSettings.preLoaderDialog(context); - var res = await AppSettings.uploadImageForFindingsUpdateFromCamera(image,widget.recordId); + var res = await AppSettings.updateFindingsCamera(image,widget.recordId); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { @@ -148,22 +148,21 @@ class _FindingImagesState extends State { payload["urlType"] = 'findings'; payload["url"] = widget.imageDetails[index]['url']; - bool deleteStatus = await AppSettings.deleteRecords(payload,widget.recordId); - - if(deleteStatus){ + // bool deleteStatus = await AppSettings.deleteRecordsNew(payload,widget.recordId); + try{ + var res = await AppSettings.deleteRecordsNew(payload,widget.recordId); + print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); AppSettings.longSuccessToast("Image deleted Successfully"); - //AllReportsState().getAllRecords(); - Navigator.pop(context); + setState(() { + widget.imageDetails = jsonDecode(res)['remainingUrls']; + }); } - else{ + catch(e){ + print(e); Navigator.of(context, rootNavigator: true).pop(); AppSettings.longFailedToast("Image deletion failed"); } - - - - }, ), /* color: Colors.pinkAccent, @@ -186,7 +185,7 @@ class _FindingImagesState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox(height: MediaQuery.of(context).size.height * .25,), - Text('Click below icon to add new Report'), + Text('Click below icon to add new findings'), SizedBox( height: 20, ), @@ -216,7 +215,7 @@ class _FindingImagesState extends State { color: primaryColor, ), onTap: () async { - await takeImageFromCamera(); + await takeImageFromCameraForUpdate(); Navigator.pop(context); }, ), @@ -231,7 +230,7 @@ class _FindingImagesState extends State { color: primaryColor, ), onTap: () async { - await pickImageFromGallery(); + await pickImageFromGalleryForUpdate(); Navigator.pop(context); }, ), diff --git a/lib/Reports/prescription_images.dart b/lib/Reports/prescription_images.dart index edb1b47..a994852 100644 --- a/lib/Reports/prescription_images.dart +++ b/lib/Reports/prescription_images.dart @@ -1,6 +1,8 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:healthcare_user/Reports/allreports.dart'; import 'package:healthcare_user/Reports/order_medicines_new.dart'; import 'package:healthcare_user/common/settings.dart'; @@ -24,8 +26,9 @@ class _PrescriptionImagesState extends State { final ImagePicker imagePicker = ImagePicker(); List imageFileList = []; List uiPrescriptionImages = []; + final ImagePicker _picker = ImagePicker(); - Future pickImageFromGallery() async { + /*Future pickImageFromGallery() async { imageFileList = []; final List? selectedImages = await imagePicker.pickMultiImage(); AppSettings.preLoaderDialog(context); @@ -33,14 +36,65 @@ class _PrescriptionImagesState extends State { imageFileList.addAll(selectedImages); } - var res = await AppSettings.uploadImageForPrescriptions(imageFileList); + var res = await AppSettings.uploadPrescriptionsGallery(imageFileList); print(jsonDecode(res)); Navigator.of(context, rootNavigator: true).pop(); setState(() { - widget.imageDetails = jsonDecode(res)['findings']; + widget.imageDetails = jsonDecode(res)['precription']; }); } + Future takeImageFromCamera() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.uploadPrescriptionsCamera(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['precription']; + }); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + }*/ + + Future pickImageFromGalleryForUpdate() async { + imageFileList = []; + final List? selectedImages = await imagePicker.pickMultiImage(); + AppSettings.preLoaderDialog(context); + if (selectedImages!.isNotEmpty) { + imageFileList.addAll(selectedImages); + } + + var res = await AppSettings.updatePrescriptionsGallery(imageFileList,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['prescription']; + }); + } + + Future takeImageFromCameraForUpdate() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.updatePrescriptionsCamera(image,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['prescription']; + }); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + } + + Widget renderUi() { if (widget.imageDetails.length != 0) { return Column( @@ -94,26 +148,22 @@ class _PrescriptionImagesState extends State { .last; var payload = new Map(); - payload["urlType"] = 'prescriptions'; - payload["url"] = - widget.imageDetails[index]['url']; - - bool deleteStatus = - await AppSettings.deleteRecords( - payload, widget.recordId); + payload["urlType"] = 'prescription'; + payload["url"] = widget.imageDetails[index]['url']; - if (deleteStatus) { - Navigator.of(context, rootNavigator: true) - .pop(); - AppSettings.longSuccessToast( - "Image deleted Successfully"); - //AllReportsState().getAllRecords(); - Navigator.pop(context); - } else { - Navigator.of(context, rootNavigator: true) - .pop(); - AppSettings.longFailedToast( - "Image deletion failed"); + try{ + var res = await AppSettings.deleteRecordsNew(payload,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longSuccessToast("Image deleted Successfully"); + setState(() { + widget.imageDetails = jsonDecode(res)['remainingUrls']; + }); + } + catch(e){ + print(e); + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast("Image deletion failed"); } }, ), @@ -184,7 +234,7 @@ class _PrescriptionImagesState extends State { color: primaryColor, ), onTap: () async { - //await takeImageFromCamera(); + await takeImageFromCameraForUpdate(); Navigator.pop(context); }, ), @@ -199,7 +249,7 @@ class _PrescriptionImagesState extends State { color: primaryColor, ), onTap: () async { - await pickImageFromGallery(); + await pickImageFromGalleryForUpdate(); Navigator.pop(context); }, ), @@ -249,12 +299,13 @@ class _PrescriptionImagesState extends State { color: primaryColor, ), onTap: () async { - //await takeImageFromCamera(); + await takeImageFromCameraForUpdate(); Navigator.pop(context); }, ), SizedBox( - width: MediaQuery.of(context).size.width * .20, + width: MediaQuery.of(context).size.width * + .20, ), GestureDetector( child: Icon( @@ -263,7 +314,7 @@ class _PrescriptionImagesState extends State { color: primaryColor, ), onTap: () async { - await pickImageFromGallery(); + await pickImageFromGalleryForUpdate(); Navigator.pop(context); }, ), @@ -272,6 +323,9 @@ class _PrescriptionImagesState extends State { ), ); }); + + + }, ), ) diff --git a/lib/Reports/report_images.dart b/lib/Reports/report_images.dart index d970ab4..8198213 100644 --- a/lib/Reports/report_images.dart +++ b/lib/Reports/report_images.dart @@ -1,16 +1,93 @@ +import 'dart:convert'; +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:healthcare_user/common/settings.dart'; import 'package:healthcare_user/common/zoom_image.dart'; +import 'package:image_picker/image_picker.dart'; class ReportImages extends StatefulWidget { var imageDetails; - ReportImages({this.imageDetails}); + var recordId; + ReportImages({this.imageDetails,this.recordId}); @override State createState() => _ReportImagesState(); } class _ReportImagesState extends State { + final ImagePicker imagePicker = ImagePicker(); + List imageFileList = []; + List uiFindingsImages = []; + final ImagePicker _picker = ImagePicker(); + + + /*Future pickImageFromGallery() async { + imageFileList = []; + final List? selectedImages = await imagePicker.pickMultiImage(); + AppSettings.preLoaderDialog(context); + if (selectedImages!.isNotEmpty) { + imageFileList.addAll(selectedImages); + } + + var res = await AppSettings.uploadReportsGallery(imageFileList); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['reports']; + }); + } + + Future takeImageFromCamera() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.uploadReportsCamera(image); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['reports']; + }); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + }*/ + + Future pickImageFromGalleryForUpdate() async { + imageFileList = []; + final List? selectedImages = await imagePicker.pickMultiImage(); + AppSettings.preLoaderDialog(context); + if (selectedImages!.isNotEmpty) { + imageFileList.addAll(selectedImages); + } + + var res = await AppSettings.updateReportsGallery(imageFileList,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['reports']; + }); + } + + Future takeImageFromCameraForUpdate() async { + try { + final image = await _picker.pickImage(source: ImageSource.camera); + if (image == null) return; + final imageTemp = File(image.path); + AppSettings.preLoaderDialog(context); + var res = await AppSettings.updateReportsCamera(image,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + setState(() { + widget.imageDetails = jsonDecode(res)['reports']; + }); + } on PlatformException catch (e) { + print('Failed to pick image: $e'); + } + } Widget renderUi() { @@ -55,9 +132,28 @@ class _ReportImagesState extends State { ), onPressed: () async { - + AppSettings.preLoaderDialog(context); + + String fileName = widget.imageDetails[index]['url'].split('/').last; + var payload = new Map(); + payload["urlType"] = 'reports'; + payload["url"] = widget.imageDetails[index]['url']; + try{ + var res = await AppSettings.deleteRecordsNew(payload,widget.recordId); + print(jsonDecode(res)); + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longSuccessToast("Image deleted Successfully"); + setState(() { + widget.imageDetails = jsonDecode(res)['remainingUrls']; + }); + } + catch(e){ + print(e); + Navigator.of(context, rootNavigator: true).pop(); + AppSettings.longFailedToast("Image deletion failed"); + } }, ), /* color: Colors.pinkAccent, @@ -95,11 +191,46 @@ class _ReportImagesState extends State { color: Colors.white, ), onPressed: () async { - /*Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const Login()), - );*/ + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForUpdate(); + Navigator.pop(context); + }, + ), + SizedBox( + width: MediaQuery.of(context).size.width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForUpdate(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); }, ), ) @@ -127,6 +258,48 @@ class _ReportImagesState extends State { color: Colors.white, ), onPressed: () async { + showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return SizedBox( + height: 200, + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + child: Icon( + Icons.camera_alt_outlined, + size: 100, + color: primaryColor, + ), + onTap: () async { + await takeImageFromCameraForUpdate(); + Navigator.pop(context); + }, + ), + SizedBox( + width: MediaQuery.of(context).size.width * + .20, + ), + GestureDetector( + child: Icon( + Icons.photo, + size: 100, + color: primaryColor, + ), + onTap: () async { + await pickImageFromGalleryForUpdate(); + Navigator.pop(context); + }, + ), + ], + ), + ), + ); + }); + + }, ),) diff --git a/lib/common/settings.dart b/lib/common/settings.dart index fd63d22..4759648 100644 --- a/lib/common/settings.dart +++ b/lib/common/settings.dart @@ -236,10 +236,12 @@ class AppSettings { static String getSugarHistoryUrl = host + 'userssugar'; static String addMedicineTimingsUrl = host + 'medicine-timing'; static String getMedicineTimingsUrl = host + 'getmedicineztiming'; - static String prescriptionUploadPicUrl = host + 'uploads-precription'; static String findingsUploadPicUrl = host + 'uploads-findings-prescription'; static String updateFindingsUploadPicUrl = host + 'update-uploads-findings-prescription'; + static String updateReportsUploadPicUrl = host + 'update-uploads-reports-prescription'; static String reportsUploadPicUrl = host + 'uploads-reports-prescription'; + static String prescriptionUploadPicUrl = host + 'uploads-prescription-prescription'; + static String updatePrescriptionPicUrl = host + 'update-uploads-prescription-prescription'; static String recordPrescriptionsUploadPicUrl = host + 'uploads-prescription-prescription'; static String getAllpharmaciesDataUrl = host + 'getAllPharmacylist'; static String getAllQuotationRequestsUrl = host + 'userprecription'; @@ -252,6 +254,7 @@ class AppSettings { static String getRecordsDataUrl = host + 'getAllRecords'; static String deleteRecordUrl = host + 'deleteRecord'; static String deleteFindingsUrl = host + 'uploads-findings-prescription'; + static String deletePrescriptionsUrl = host + 'uploads-prescription-prescription'; static String deleteRecordsUrl = host + 'delete-url'; @@ -720,7 +723,9 @@ class AppSettings { return response.body; } - static Future uploadImageForFindings(file) async { + /*upload and update findings*/ + + static Future uploadFindingsGallery(file) async { var request = http.MultipartRequest( 'POST', Uri.parse(findingsUploadPicUrl + '/' + customerId)); @@ -734,8 +739,7 @@ class AppSettings { return response.body; } - - static Future uploadImageForFindingsFromCamera(file) async { + static Future uploadFindingsCamera(file) async { var request = http.MultipartRequest('POST', Uri.parse(findingsUploadPicUrl + '/' + customerId)); request.files.add(await http.MultipartFile.fromPath('picture', file.path)); var res = await request.send(); @@ -743,7 +747,7 @@ class AppSettings { return response.body; } - static Future uploadImageForFindingsUpdate(file,var recordId) async { + static Future updateFindingsGallery(file,var recordId) async { var request = http.MultipartRequest( 'POST', Uri.parse(updateFindingsUploadPicUrl + '/' + customerId+'/'+recordId)); @@ -757,7 +761,7 @@ class AppSettings { return response.body; } - static Future uploadImageForFindingsUpdateFromCamera(file,var recordId) async { + static Future updateFindingsCamera(file,var recordId) async { var request = http.MultipartRequest('POST', Uri.parse(updateFindingsUploadPicUrl + '/' + customerId+'/'+recordId)); request.files.add(await http.MultipartFile.fromPath('picture', file.path)); var res = await request.send(); @@ -765,7 +769,12 @@ class AppSettings { return response.body; } - static Future uploadImageForReports(file) async { + /*End*/ + + + /*upload and update Reports*/ + + static Future uploadReportsGallery(file) async { var request = http.MultipartRequest( 'POST', Uri.parse(reportsUploadPicUrl + '/' + customerId)); @@ -779,11 +788,45 @@ class AppSettings { return response.body; } + static Future uploadReportsCamera(file) async { + var request = http.MultipartRequest('POST', Uri.parse(reportsUploadPicUrl + '/' + customerId)); + request.files.add(await http.MultipartFile.fromPath('picture', file.path)); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + static Future updateReportsGallery(file,var recordId) async { + + var request = http.MultipartRequest( + 'POST', Uri.parse(updateReportsUploadPicUrl + '/' + customerId+'/'+recordId)); + if (file.length > 0) { + for (var i = 0; i < file.length; i++) { + request.files.add(await http.MultipartFile.fromPath('picture', file[i].path)); + }} + // request.files.add(await http.MultipartFile.fromPath('picture', images.toString().replaceAll('[', '').replaceAll(']',''))); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + static Future updateReportsCamera(file,var recordId) async { + var request = http.MultipartRequest('POST', Uri.parse(updateReportsUploadPicUrl + '/' + customerId+'/'+recordId)); + request.files.add(await http.MultipartFile.fromPath('picture', file.path)); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + /*End*/ - static Future uploadImageForPrescriptions(file) async { + + /*upload and update Prescriptions*/ + + static Future uploadPrescriptionsGallery(file) async { var request = http.MultipartRequest( - 'POST', Uri.parse(recordPrescriptionsUploadPicUrl + '/' + customerId)); + 'POST', Uri.parse(prescriptionUploadPicUrl + '/' + customerId)); if (file.length > 0) { for (var i = 0; i < file.length; i++) { request.files.add(await http.MultipartFile.fromPath('picture', file[i].path)); @@ -794,6 +837,60 @@ class AppSettings { return response.body; } + static Future uploadPrescriptionsCamera(file) async { + var request = http.MultipartRequest('POST', Uri.parse(prescriptionUploadPicUrl + '/' + customerId)); + request.files.add(await http.MultipartFile.fromPath('picture', file.path)); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + static Future updatePrescriptionsGallery(file,var recordId) async { + + var request = http.MultipartRequest( + 'POST', Uri.parse(updatePrescriptionPicUrl + '/' + customerId+'/'+recordId)); + if (file.length > 0) { + for (var i = 0; i < file.length; i++) { + request.files.add(await http.MultipartFile.fromPath('picture', file[i].path)); + }} + // request.files.add(await http.MultipartFile.fromPath('picture', images.toString().replaceAll('[', '').replaceAll(']',''))); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + static Future updatePrescriptionsCamera(file,var recordId) async { + var request = http.MultipartRequest('POST', Uri.parse(updatePrescriptionPicUrl + '/' + customerId+'/'+recordId)); + request.files.add(await http.MultipartFile.fromPath('picture', file.path)); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + /*End*/ + + + + + + + + + static Future uploadImageForReports(file) async { + + var request = http.MultipartRequest( + 'POST', Uri.parse(reportsUploadPicUrl + '/' + customerId)); + if (file.length > 0) { + for (var i = 0; i < file.length; i++) { + request.files.add(await http.MultipartFile.fromPath('picture', file[i].path)); + }} + // request.files.add(await http.MultipartFile.fromPath('picture', images.toString().replaceAll('[', '').replaceAll(']',''))); + var res = await request.send(); + var response = await http.Response.fromStream(res); + return response.body; + } + + static Future uploadImageForFindingsCamera(file) async { var request = http.MultipartRequest( @@ -805,6 +902,8 @@ class AppSettings { } + + static Future uploadVideoInReportMySelf(file) async { var request = http.MultipartRequest( 'POST', Uri.parse(reportMySelfVideoUploadUrl + '/' + customerId)); @@ -1116,6 +1215,35 @@ class AppSettings { } } + static Future deletePrescriptions(fileName) async { + var uri = Uri.parse(deletePrescriptionsUrl + '/' + customerId+'/'+fileName); + + try { + var response = await http.delete(uri, headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + return response.body; + } else if (response.statusCode == 401) { + bool status = await AppSettings.resetToken(); + if (status) { + response = await http.delete(uri, headers: await buildRequestHeaders()); + if (response.statusCode == 200) { + return response.body; + } else { + return ''; + } + } else { + return ''; + } + } else { + return ''; + } + } catch (e) { + print(e); + return ''; + } + } + static Future deleteRecords(payload, recordId) async { var uri = Uri.parse(deleteRecordsUrl + '/' + customerId+'/'+recordId); @@ -1148,6 +1276,37 @@ class AppSettings { + static Future deleteRecordsNew(payload, recordId) async { + var uri = Uri.parse(deleteRecordsUrl + '/' + customerId+'/'+recordId); + + try { + var response = await http.post(uri, body: json.encode(payload),headers: await buildRequestHeaders()); + + if (response.statusCode == 200) { + return response.body; + } else if (response.statusCode == 401) { + bool status = await AppSettings.resetToken(); + if (status) { + response = await http.delete(uri, headers: await buildRequestHeaders()); + if (response.statusCode == 200) { + return response.body; + } else { + return ''; + } + } else { + return ''; + } + } else { + return ''; + } + } catch (e) { + print(e); + return ''; + } + } + + +