From 96297a0104d37193bf495d61b592d79d4ef10d58 Mon Sep 17 00:00:00 2001 From: SurendarSuri30 Date: Mon, 3 Nov 2025 17:30:35 +0530 Subject: [PATCH] claim upload name added and permium hide content --- .env | 12 +- .env.development | 12 +- assets/nhance_client_logo.png | Bin assets/nhance_client_logo.svg | 11 + assets/nhance_logo.png | Bin 0 -> 17115 bytes lib/customAppBar/customAppBar.dart | 19 +- lib/pages/enrollment/addons.dart | 420 +++++++++--------- lib/pages/enrollment/empReview.dart | 3 + lib/pages/postEnrollment/planclaimsform.dart | 219 +++++---- .../service/file_upload_service.dart | 50 ++- .../service/multi_file_upload_widget.dart | 51 ++- lib/pages/service/popup_helper.dart | 139 +++--- 12 files changed, 533 insertions(+), 403 deletions(-) mode change 100755 => 100644 assets/nhance_client_logo.png create mode 100644 assets/nhance_client_logo.svg create mode 100644 assets/nhance_logo.png diff --git a/.env b/.env index 5f1f339..3c01a91 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -API_URL=https://venbait.in/nhance/dev/employeeRest/ -chatbot_Url=https://venbait.in/nhance/dev/chatbot -API_URL_Enrollment=https://venbait.in/enrollment/employeeRest/ -TICKET_API_URL=https://venbait.in/nhance/dev/api -BASE_HREF=/nhance/app/dev/ -ENV=development +API_URL=https://app.nhanceindia.in/zenith/employeeRest/ +API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ +TICKET_API_URL=https://app.nhanceindia.in/zenith/api +chatbot_Url=https://app.nhanceindia.in/zenith/chatbot +BASE_HREF=/app/ +ENV=production \ No newline at end of file diff --git a/.env.development b/.env.development index 5f1f339..3c01a91 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,6 @@ -API_URL=https://venbait.in/nhance/dev/employeeRest/ -chatbot_Url=https://venbait.in/nhance/dev/chatbot -API_URL_Enrollment=https://venbait.in/enrollment/employeeRest/ -TICKET_API_URL=https://venbait.in/nhance/dev/api -BASE_HREF=/nhance/app/dev/ -ENV=development +API_URL=https://app.nhanceindia.in/zenith/employeeRest/ +API_URL_Enrollment=https://app.nhanceindia.in/enrolment/employeeRest/ +TICKET_API_URL=https://app.nhanceindia.in/zenith/api +chatbot_Url=https://app.nhanceindia.in/zenith/chatbot +BASE_HREF=/app/ +ENV=production \ No newline at end of file diff --git a/assets/nhance_client_logo.png b/assets/nhance_client_logo.png old mode 100755 new mode 100644 diff --git a/assets/nhance_client_logo.svg b/assets/nhance_client_logo.svg new file mode 100644 index 0000000..1b3df04 --- /dev/null +++ b/assets/nhance_client_logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/nhance_logo.png b/assets/nhance_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..26029ebf981a655c0a50cee72c1f1a5ca74667f5 GIT binary patch literal 17115 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 literal 0 HcmV?d00001 diff --git a/lib/customAppBar/customAppBar.dart b/lib/customAppBar/customAppBar.dart index 30fa214..52d14e4 100755 --- a/lib/customAppBar/customAppBar.dart +++ b/lib/customAppBar/customAppBar.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:adaptive_navbar/adaptive_navbar.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:nhance_app_pwa/customAppBar/responsive.dart'; @@ -59,14 +60,18 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { .start, // Adjust the alignment as needed children: [ Container( - margin: EdgeInsets.only( - top: 10, bottom: 10, left: 10, right: 10), - width: Responsive.isDesktop(context) ? 150 : 130, - height: Responsive.isDesktop(context) ? 150 : 130, - child: Image.asset( - 'assets/nhance_client_logo.png', - fit: BoxFit.contain, // Adjust the fit as needed + // margin: EdgeInsets.only( + // top: 10, bottom: 10, left: 10, right: 10), + // width: Responsive.isDesktop(context) ? 150 : 130, + // height: Responsive.isDesktop(context) ? 31 : 130, + child: SvgPicture.asset( + 'assets/nhance_client_logo.svg', + width: 150, ), + // child: Image.asset( + // 'assets/nhance_logo.png', + // width: 250, + // ), ), ], ), diff --git a/lib/pages/enrollment/addons.dart b/lib/pages/enrollment/addons.dart index dc99640..42e8674 100755 --- a/lib/pages/enrollment/addons.dart +++ b/lib/pages/enrollment/addons.dart @@ -85,6 +85,8 @@ class _addOnsDetailsState extends State { dynamic gmcTypeName; dynamic clientName; dynamic clientLogo; + bool gpahasPremiumSummary = false; + bool gmchasPremiumSummary = false; dynamic addon_subheading; dynamic topUpECardDownload; dynamic topUpMappedFamilyFloatersSi; @@ -332,6 +334,10 @@ class _addOnsDetailsState extends State { setState(() { gpaPolicies = response['data']; for (var item in gpaPolicies) { + if (item['is_premium_summery'] == "1") { + gpahasPremiumSummary = true; + break; + } // Extract disclaimer value from each object if (item['OpenForEnrollment'] == '1') { dynamic disclaimer = item['disclaimer']; @@ -408,6 +414,13 @@ class _addOnsDetailsState extends State { // setState(() { gmcPolicies = response['data']; for (var item in gmcPolicies) { + print('checking is_premium_summery ${item['is_premium_summery']}'); + if (item['is_premium_summery'] == "1") { + print('checking is_premium_summery ${item['is_premium_summery']}'); + gmchasPremiumSummary = true; + print('gmchasPremiumSummary ${gmchasPremiumSummary}'); + break; + } if (item['OpenForEnrollment'] == '1') { dynamic disclaimer = item['disclaimer']; if (disclaimer != null && disclaimer.isNotEmpty) { @@ -4056,217 +4069,220 @@ class _addOnsDetailsState extends State { : EdgeInsets.all(10), child: Column( children: [ - - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 12, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Premium Summary', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, - color: Color(0xFF181818), - fontWeight: FontWeight.w600, - ), - ), - ], - ))), - ], - ), - ), - SizedBox(height: 15), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 12, - child: Container( - alignment: Alignment - .centerLeft, // Adjust padding as needed - child: Table( - columnWidths: { - 0: FlexColumnWidth( - 2), // Adjust column width as needed - 1: FlexColumnWidth(2), - 2: FlexColumnWidth( - 2), // Adjust column width as needed - 3: FlexColumnWidth(2), - }, - children: [ - TableRow( + if(gpahasPremiumSummary == true || gmchasPremiumSummary == true)...[ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 12, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Policy ', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 13, - fontWeight: - FontWeight - .bold), - ), - ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Additional Premium', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 13, - fontWeight: - FontWeight - .bold), - ), - ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'GST', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 13, - fontWeight: - FontWeight - .bold), - ), - ), - ), - TableCell( - child: Padding( - padding: - EdgeInsets.all(8.0), - child: Text( - 'Total', - textAlign: - TextAlign.start, - style: GoogleFonts.poppins( - fontSize: Responsive - .isDesktop( - context) - ? 16 - : 13, - fontWeight: - FontWeight - .bold), - ), + Text( + 'Premium Summary', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 18 + : 16, + color: Color(0xFF181818), + fontWeight: FontWeight.w600, ), ), ], + ))), + ], + ), + ), + SizedBox(height: 15), + if(gpahasPremiumSummary == true || gmchasPremiumSummary == true) + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 12, + child: Container( + alignment: Alignment + .centerLeft, // Adjust padding as needed + child: Table( + columnWidths: { + 0: FlexColumnWidth( + 2), // Adjust column width as needed + 1: FlexColumnWidth(2), + 2: FlexColumnWidth( + 2), // Adjust column width as needed + 3: FlexColumnWidth(2), + }, + children: [ + TableRow( + children: [ + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Policy ', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 13, + fontWeight: + FontWeight + .bold), + ), + ), + ), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Additional Premium', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 13, + fontWeight: + FontWeight + .bold), + ), + ), + ), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'GST', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 13, + fontWeight: + FontWeight + .bold), + ), + ), + ), + TableCell( + child: Padding( + padding: + EdgeInsets.all(8.0), + child: Text( + 'Total', + textAlign: + TextAlign.start, + style: GoogleFonts.poppins( + fontSize: Responsive + .isDesktop( + context) + ? 16 + : 13, + fontWeight: + FontWeight + .bold), + ), + ), + ), + ], + ), + if (gpaPolicies != null && + gpaPolicies.length > 0) + ...gpaBuildPolicyRows( + gpaPolicies, context), + if (gmcPolicies != null && + gmcPolicies.length > 0) + ...gmcBuildPolicyRows( + gmcPolicies, context), + ], ), - if (gpaPolicies != null && - gpaPolicies.length > 0) - ...gpaBuildPolicyRows( - gpaPolicies, context), - if (gmcPolicies != null && - gmcPolicies.length > 0) - ...gmcBuildPolicyRows( - gmcPolicies, context), - ], - ), - )) - ], - ), - ), - SizedBox(height: 10), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerLeft, - child: Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - 'Total Payable', - textAlign: TextAlign.left, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 20 - : 16, - color: Color(0xFF181818), - fontWeight: FontWeight.w600, + )) + ], + ), + ), + SizedBox(height: 10), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerLeft, + child: Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + 'Total Payable', + textAlign: TextAlign.left, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 20 + : 16, + color: Color(0xFF181818), + fontWeight: FontWeight.w600, + ), ), - ), - ], - ))), - Expanded( - flex: 6, - child: Container( - alignment: Alignment.centerRight, - child: Column( - mainAxisAlignment: - MainAxisAlignment.end, - crossAxisAlignment: - CrossAxisAlignment.end, - children: [ - Text( - '₹${allTotalSum()}/Year', - textAlign: TextAlign.right, - style: GoogleFonts.poppins( - fontSize: - Responsive.isDesktop( - context) - ? 18 - : 16, - color: Color(0xFFE26728), - fontWeight: FontWeight.w500, + ], + ))), + Expanded( + flex: 6, + child: Container( + alignment: Alignment.centerRight, + child: Column( + mainAxisAlignment: + MainAxisAlignment.end, + crossAxisAlignment: + CrossAxisAlignment.end, + children: [ + Text( + '₹${allTotalSum()}/Year', + textAlign: TextAlign.right, + style: GoogleFonts.poppins( + fontSize: + Responsive.isDesktop( + context) + ? 18 + : 16, + color: Color(0xFFE26728), + fontWeight: FontWeight.w500, + ), ), - ), - ], - ))) - ], + ], + ))) + ], + ), ), - ), - SizedBox(height: 10), + SizedBox(height: 10), + ], + Container( alignment: Alignment.topLeft, child: Row( diff --git a/lib/pages/enrollment/empReview.dart b/lib/pages/enrollment/empReview.dart index f0e4aea..1c86992 100755 --- a/lib/pages/enrollment/empReview.dart +++ b/lib/pages/enrollment/empReview.dart @@ -510,8 +510,11 @@ class _empReviewDetailsState extends State { print('gmcPolicies $gmcPolicies'); for (var policy in gmcPolicies) { + print('checking is_premium_summery ${policy['is_premium_summery']}'); if (policy['is_premium_summery'] == "1") { + print('checking is_premium_summery ${policy['is_premium_summery']}'); gmchasPremiumSummary = true; + print('gmchasPremiumSummary ${gmchasPremiumSummary}'); break; } } diff --git a/lib/pages/postEnrollment/planclaimsform.dart b/lib/pages/postEnrollment/planclaimsform.dart index 8bee409..313a39c 100755 --- a/lib/pages/postEnrollment/planclaimsform.dart +++ b/lib/pages/postEnrollment/planclaimsform.dart @@ -115,6 +115,8 @@ class _planclaimsformState extends State { bool isClaimAmountValid = true; bool isAccidentDateValid = true; bool isIntimationDateValid = true; + bool isAdmitDateValid = true; + bool isDischargeDateValid = true; final session = SessionManager(); @@ -516,7 +518,9 @@ class _planclaimsformState extends State { isMemberValid = selectedMemberId != null; isSubjectValid = subjectController.text.trim().isNotEmpty; isHospitalNameValid = policyTypeCondition != 1 || hospitalNameController.text.trim().isNotEmpty; - isAdmitDischargeValid = policyTypeCondition != 1 || (admitDate != null && dischargeDate != null); + // isAdmitDischargeValid = policyTypeCondition != 1 || (admitDate != null && dischargeDate != null); + isAdmitDateValid = policyTypeCondition != 1 || admitDate != null; + isDischargeDateValid = policyTypeCondition != 1 || dischargeDate != null; isClaimAmountValid = serviceId != 1 || claimAmountController.text.trim().isNotEmpty; isAccidentDateValid = (serviceId == 2 || serviceId == 3 || serviceId == 4) ? accidentDate != null : true; isIntimationDateValid = (serviceId == 2 || serviceId == 3 || serviceId == 4) ? intimationDate != null : true; @@ -527,10 +531,18 @@ class _planclaimsformState extends State { isMemberValid && isSubjectValid && isHospitalNameValid && - isAdmitDischargeValid && + isAdmitDateValid && + isDischargeDateValid && isClaimAmountValid && isAccidentDateValid && isIntimationDateValid) { + if (FileUploadService().files.isEmpty) { + setState(() { + MultiFileUploadWidget.hasFiles = false; + }); + ToastHelper.showErrorToast(context, 'Please upload at least one document'); + return; + } // Proceed to submit } else { ToastHelper.showErrorToast(context, 'Please Fill Required Fields'); @@ -544,20 +556,17 @@ class _planclaimsformState extends State { final SharedPreferences prefs = await SharedPreferences.getInstance(); final String? emp_id = session.empPrimaryId; print('Check One $client_policy_id'); - // print(employeePolicyList[0]['name']); - // print('Help $filteredPoliciesList'); + try { print('Check One'); Map fields = { - // 'opener': 'user', + 'emp_id': emp_id, 'client_policy_id': client_policy_id, 'ticket_type_id': serviceId, 'subject': subjectController.text, 'message': messageController.text, - // 'policy_id': fromClaimsPage == 0 - // ? claimsDetails['client_policy_id'] - // : policyNumberId, + 'emp_code': empCodeString ?? ' ', 'mobile_number': mobileNo ?? '', 'email': session.empEmailCorporate ?? '', @@ -571,35 +580,16 @@ class _planclaimsformState extends State { : (fromClaimsPage == 0 ? claimsDetails['policy_name'] : filteredPoliciesList[0]['policy_name']), - // 'tpa': serviceId == 1 - // ? null - // : (fromClaimsPage == 0 - // ? claimsDetails['tpa_name'] - // : filteredPoliciesList[0]['tpa_name']), - // 'insurer': serviceId == 1 - // ? null - // : (fromClaimsPage == 0 - // ? claimsDetails['insurer_name'] - // : filteredPoliciesList[0]['insurer_name']), + }; - // Conditionally add fields based on the first word in policy_type - // if (policyTypeCondition == 3) { - // String formattedAccidentDate = - // DateFormat('yyyy-MM-dd').format(accidentDate!); - // // formData['accident_details'] = accidentDetailsController.text; - // formData['accident_details'] = messageController.text; - // formData['accident_date'] = formattedAccidentDate; - // formData['claim_amount'] = claimAmountController.text; - // formData['policyholder_name'] = employeePolicyList[0]['name']; - // formData['member_name'] = selectedMemberName; - // formData['emp_policy_id'] = selectedMemberId; - // } else if (policyTypeCondition == 1) { + String formattedAdmitDate = DateFormat('yyyy-MM-dd').format(admitDate!); + String formattedDischargeDate = DateFormat('yyyy-MM-dd').format(dischargeDate!); fields['hospital_name'] = hospitalNameController.text; - fields['doa'] = admitDateController.text; - fields['dod'] = dischargeDateController.text; + fields['doa'] = formattedAdmitDate; + fields['dod'] = formattedDischargeDate; fields['claim_amount'] = claimAmountController.text; fields['policyholder_name'] = employeePolicyList[0]['name']; fields['member_name'] = selectedMemberName; @@ -611,8 +601,6 @@ class _planclaimsformState extends State { String formattedBirthDate = DateFormat('yyyy-MM-dd').format(birthDate!); String formattedIntimationDate = DateFormat('yyyy-MM-dd').format(intimationDate!); - // formData['accident_details'] = accidentDetailsController.text; - // formData['accident_details'] = messageController.text; fields['date_of_accident'] = formattedAccidentDate; fields['dob'] = formattedBirthDate; fields['date_of_intimat'] = formattedIntimationDate; @@ -623,26 +611,6 @@ class _planclaimsformState extends State { fields['insured_emp_id'] = selectedMemberId; } - // Multipart request - - // final request = http.MultipartRequest('POST', Uri.parse('${Environment.apiUrl}/initiateClaim')); - // request.headers['Authorization'] = 'Bearer $_token'; - // final stringFields = fields.map((key, value) => MapEntry(key, value?.toString() ?? '')); - // request.fields.addAll(stringFields); - // - // if (uploadedFile != null) { - // final reader = html.FileReader(); - // reader.readAsArrayBuffer(uploadedFile!); - // await reader.onLoad.first; - // - // final data = reader.result as Uint8List; - // - // request.files.add(http.MultipartFile.fromBytes( - // 'claim_docs', - // data, - // filename: uploadedFile!.name, - // )); - // } _token = await TokenService.getPostToken(); final request = http.MultipartRequest('POST', Uri.parse('${Environment.apiUrl}/initiateClaim')); @@ -650,31 +618,44 @@ class _planclaimsformState extends State { final stringFields = fields.map((key, value) => MapEntry(key, value?.toString() ?? '')); request.fields.addAll(stringFields); - // 🔥 Loop through multiple files - // for (var file in uploadedFiles) { - // final reader = html.FileReader(); - // reader.readAsArrayBuffer(file); - // await reader.onLoad.first; - // final data = reader.result as Uint8List; - // - // request.files.add(http.MultipartFile.fromBytes( - // 'claim_docs[]', // 👈 if backend expects array - // data, - // filename: file.name, - // )); - // } - uploadedFiles = FileUploadService().files; - print("Files available globally: ${uploadedFiles.map((f) => f.name).toList()}"); - for (var file in uploadedFiles) { - if (file.bytes != null) { + // get uploaded files + final uploadedFiles = FileUploadService().files; + print("📁 Total uploaded files: ${uploadedFiles.length}"); + print("📂 File list (original names): ${uploadedFiles.map((f) => f.file.name).toList()}"); + +// Validate all labels present (optional but recommended) + for (final uf in uploadedFiles) { + print("📝 Checking label for file: ${uf.file.name}, current label: '${uf.label}'"); + if ((uf.label ?? '').trim().isEmpty) { + ToastHelper.showErrorToast(context, 'Please enter name for all uploaded documents'); + setState(() => isLoading = false); + return; + } + } + + // Add files + for (var uf in uploadedFiles) { + final pf = uf.file; + if (pf.bytes != null) { request.files.add(http.MultipartFile.fromBytes( 'claim_docs[]', - file.bytes!, - filename: file.name, + pf.bytes!, + filename: pf.name, )); } } +// ✅ Combine all names into a JSON array string + final claimDocNames = uploadedFiles.map((uf) => uf.label.trim()).toList(); + final encodedNames = jsonEncode(claimDocNames); + request.fields['claim_doc_names'] = encodedNames; + +// ✅ Debug print + print("Payload being sent:"); + print("Files: ${uploadedFiles.map((f) => f.file.name).toList()}"); + print("Names (JSON): $encodedNames"); + + final response = await request.send(); final responseBody = await response.stream.bytesToString(); @@ -1199,25 +1180,42 @@ SizedBox(height: 15), // accidentDetailsController), // SizedBox(height: 15), if (policyTypeCondition == 1) ...[ - InkWell( - onTap: () => _pickFromToDate(context), - child: InputDecorator( - decoration: InputDecoration( - labelText: 'Admit Date - Discharge Date', - border: OutlineInputBorder(), - ), - child: Text( - admitDate != null && dischargeDate != null - ? '${admitDateController.text} to ${dischargeDateController.text}' - : 'Select Admit and Discharge Dates', - style: TextStyle(color: Colors.black), - ), - ), + // 🟡 Admit Date — no future allowed + buildDatePickerField( + label: 'Admit Date', + selectedDate: admitDate, + allowFuture: false, + onDateSelected: (selectedDate) { + setState(() { + admitDate = selectedDate; + dischargeDate = null; // reset discharge when admit changes + }); + }, ), - if (!isAdmitDischargeValid) - Text('Please select Admit and Discharge Dates', style: TextStyle(color: Colors.red)), + if (!isAdmitDateValid) + const Text('Please select the Admit Date', style: TextStyle(color: Colors.red)), + const SizedBox(height: 20), + + // 🟢 Discharge Date — must be after Admit Date + buildDatePickerField( + label: 'Discharge Date', + selectedDate: dischargeDate, + allowFuture: true, + minDate: admitDate != null + ? admitDate!.add(const Duration(days: 1)) + : DateTime.now().add(const Duration(days: 1)), + maxDate: null, + onDateSelected: (selectedDate) { + setState(() { + dischargeDate = selectedDate; + }); + }, + ), + if (!isDischargeDateValid) + const Text('Please select the Discharge Date', style: TextStyle(color: Colors.red)), ], + SizedBox(height: 15), if (serviceId == 1) ...[ buildTextField('Claims Amount', claimAmountController, TextInputType.number), @@ -1421,14 +1419,42 @@ SizedBox(height: 15), return InkWell( onTap: () async { final DateTime now = DateTime.now(); - final DateTime first = minDate ?? DateTime(2000); - final DateTime last = allowFuture ? (maxDate ?? DateTime(2100)) : now; + + // 👇 Special rules only for Admit & Discharge + DateTime first; + DateTime last; + + if (label == 'Admit Date') { + // ❌ Admit date cannot be future + first = minDate ?? DateTime(2000); + last = now; + } else if (label == 'Discharge Date') { + // ✅ Discharge date must be AFTER admit date, future allowed + first = minDate ?? now.add(const Duration(days: 1)); + last = maxDate ?? DateTime(2100); + } else { + // All other date pickers keep original behavior + first = minDate ?? DateTime(1980); + last = allowFuture ? (maxDate ?? DateTime(2100)) : now; + } + + // final DateTime? pickedDate = await showDatePicker( + // context: context, + // initialDate: selectedDate ?? now, + // firstDate: label == "Date of Birth" ? DateTime(1900) : first, + // lastDate: label == "Date of Birth" ? now : last, + // ); + + // ✅ Fix: Ensure initialDate always within valid range + DateTime initialDate = selectedDate ?? now; + if (initialDate.isBefore(first)) initialDate = first; + if (initialDate.isAfter(last)) initialDate = last; final DateTime? pickedDate = await showDatePicker( context: context, - initialDate: selectedDate ?? now, - firstDate: label == "Date of Birth" ? DateTime(1900) : first, - lastDate: label == "Date of Birth" ? now : last, + initialDate: initialDate, + firstDate: first, + lastDate: last, ); if (pickedDate != null) { @@ -1438,18 +1464,19 @@ SizedBox(height: 15), child: InputDecorator( decoration: InputDecoration( labelText: label, - border: OutlineInputBorder(), + border: const OutlineInputBorder(), ), child: Text( selectedDate != null ? DateFormat('dd-MM-yyyy').format(selectedDate) : 'Select $label', - style: TextStyle(color: Colors.black), + style: const TextStyle(color: Colors.black), ), ), ); } + Widget buildDropdownField( String label, void Function(int?) onChanged, diff --git a/lib/pages/postEnrollment/service/file_upload_service.dart b/lib/pages/postEnrollment/service/file_upload_service.dart index ea1da68..643d002 100644 --- a/lib/pages/postEnrollment/service/file_upload_service.dart +++ b/lib/pages/postEnrollment/service/file_upload_service.dart @@ -1,16 +1,31 @@ import 'package:file_picker/file_picker.dart'; +import 'package:flutter/widgets.dart'; + +class UploadedFile { + final PlatformFile file; + final TextEditingController controller; + UploadedFile({required this.file}) + : controller = TextEditingController( + text: file.extension != null + ? file.name.replaceAll('.${file.extension}', '') + : file.name); + + String get label => controller.text; + void dispose() => controller.dispose(); +} class FileUploadService { FileUploadService._(); static final FileUploadService _instance = FileUploadService._(); factory FileUploadService() => _instance; - final List _files = []; + final List _files = []; - List get files => List.unmodifiable(_files); + // Expose as unmodifiable but containing UploadedFile objects + List get files => List.unmodifiable(_files); // Allowed extensions - static const allowedExtensions = ['pdf', 'png', 'jpg', 'jpeg','heic']; + static const allowedExtensions = ['pdf', 'png', 'jpg', 'jpeg', 'heic']; Future pickFiles({int maxFileSizeInMB = 3}) async { final result = await FilePicker.platform.pickFiles( @@ -21,26 +36,35 @@ class FileUploadService { ); if (result != null) { - for (final file in result.files) { - final ext = file.extension?.toLowerCase() ?? ''; - final sizeInMB = (file.size / (1024 * 1024)); + for (final pf in result.files) { + final ext = pf.extension?.toLowerCase() ?? ''; + final sizeInMB = (pf.size / (1024 * 1024)); if (!allowedExtensions.contains(ext)) { - return "Unsupported file format: ${file.name}"; + return "Unsupported file format: ${pf.name}"; } if (sizeInMB > maxFileSizeInMB) { - return "File too large (${file.name}). Max $maxFileSizeInMB MB allowed."; + return "File too large (${pf.name}). Max $maxFileSizeInMB MB allowed."; } - } - _files.addAll(result.files); + // Wrap PlatformFile in our UploadedFile model + _files.add(UploadedFile(file: pf)); + } } - return null; // success + return null; } void removeFileAt(int index) { - if (index >= 0 && index < _files.length) _files.removeAt(index); + if (index >= 0 && index < _files.length) { + _files[index].dispose(); + _files.removeAt(index); + } } - void clearAll() => _files.clear(); + void clearAll() { + for (final f in _files) { + f.dispose(); + } + _files.clear(); + } } diff --git a/lib/pages/postEnrollment/service/multi_file_upload_widget.dart b/lib/pages/postEnrollment/service/multi_file_upload_widget.dart index 3f3dc3b..7ae2df4 100644 --- a/lib/pages/postEnrollment/service/multi_file_upload_widget.dart +++ b/lib/pages/postEnrollment/service/multi_file_upload_widget.dart @@ -7,6 +7,8 @@ class MultiFileUploadWidget extends StatefulWidget { @override State createState() => _MultiFileUploadWidgetState(); + + static bool hasFiles = false; // ✅ Static variable to check from parent } class _MultiFileUploadWidgetState extends State { @@ -39,13 +41,16 @@ class _MultiFileUploadWidgetState extends State { } else { setState(() { errorMessage = null; + MultiFileUploadWidget.hasFiles = fileService.files.isNotEmpty; }); } } void _removeFile(int index) { fileService.removeFileAt(index); - setState(() {}); + setState(() { + MultiFileUploadWidget.hasFiles = fileService.files.isNotEmpty; + }); } @override @@ -108,6 +113,14 @@ class _MultiFileUploadWidgetState extends State { ), ], + if (fileService.files.isEmpty && errorMessage == null) ...[ + const SizedBox(height: 4), + const Text( + "Required", + style: TextStyle(color: Colors.red, fontSize: 12), + ), + ], + if (errorMessage != null) ...[ const SizedBox(height: 4), Text( @@ -117,18 +130,34 @@ class _MultiFileUploadWidgetState extends State { ], const SizedBox(height: 8), - ...files.asMap().entries.map((entry) { + ...fileService.files.asMap().entries.map((entry) { final index = entry.key; - final file = entry.value; + final uploaded = entry.value; // UploadedFile - return ListTile( - dense: true, - contentPadding: EdgeInsets.zero, - title: Text(file.name, style: const TextStyle(fontSize: 14)), - trailing: IconButton( - icon: const Icon(Icons.close, color: Colors.red), - onPressed: () => _removeFile(index), - ), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + dense: true, + contentPadding: EdgeInsets.zero, + title: Text(uploaded.file.name, style: const TextStyle(fontSize: 14)), + trailing: IconButton( + icon: const Icon(Icons.close, color: Colors.red), + onPressed: () => _removeFile(index), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0, bottom: 8.0, right: 8.0), + child: TextField( + controller: uploaded.controller, + decoration: const InputDecoration( + labelText: 'Enter document name', + border: OutlineInputBorder(), + isDense: true, + ), + ), + ), + ], ); }), ], diff --git a/lib/pages/service/popup_helper.dart b/lib/pages/service/popup_helper.dart index f5067d5..7d86132 100644 --- a/lib/pages/service/popup_helper.dart +++ b/lib/pages/service/popup_helper.dart @@ -56,6 +56,19 @@ class PopupHelper { final double dialogHeight = isMobile ? MediaQuery.of(context).size.height * 0.17 : 150; + // Auto close after 3 seconds and redirect + Future.delayed(const Duration(seconds: 2), () { + if (Navigator.of(dialogContext).canPop()) { + Navigator.of(dialogContext).pop(); + } + + if (wellnessURL != null) { + launchURL(wellnessURL, context); + } else { + ToastHelper.showInfoToast(context, 'Invalid link or unavailable'); + } + }); + return Dialog( insetPadding: EdgeInsets.symmetric(horizontal: isMobile ? 40 : 0), shape: RoundedRectangleBorder( @@ -67,10 +80,12 @@ class PopupHelper { height: dialogHeight, padding: const EdgeInsets.all(20), child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( - 'You are being redirected out of this app. Click Proceed to Continue', + 'You are being redirected out of this app.', + // 'You are being redirected out of this app. Click Proceed to Continue', textAlign: TextAlign.center, style: GoogleFonts.poppins( fontSize: isMobile ? 14 : 16, @@ -78,65 +93,65 @@ class PopupHelper { color: const Color(0xFF777777), ), ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - child: OutlinedButton( - onPressed: () => Navigator.pop(dialogContext), - style: OutlinedButton.styleFrom( - side: const BorderSide(color: Color(0xFFE26728)), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - padding: const EdgeInsets.symmetric(vertical: 12), - ), - child: FittedBox( - fit: BoxFit.scaleDown, - child: Text( - 'Cancel', - style: GoogleFonts.poppins( - color: const Color(0xFFE26728), - fontSize: isMobile ? 14 : 16, - ), - ), - ), - ), - ), - const SizedBox(width: 15), - Expanded( - child: ElevatedButton( - onPressed: () { - Navigator.of(dialogContext).pop(); - if (wellnessURL != null) { - launchURL(wellnessURL, context); - } else { - ToastHelper.showInfoToast( - context, 'Invalid link or unavailable'); - } - }, - style: ElevatedButton.styleFrom( - backgroundColor: const Color(0xFFE26728), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - padding: const EdgeInsets.symmetric(vertical: 12), - ), - child: FittedBox( - fit: BoxFit.scaleDown, - child: Text( - 'Proceed', - style: GoogleFonts.poppins( - color: Colors.white, - fontSize: isMobile ? 14 : 16, - ), - ), - ), - ), - ), - ], - ), + // const SizedBox(height: 20), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceEvenly, + // children: [ + // Expanded( + // child: OutlinedButton( + // onPressed: () => Navigator.pop(dialogContext), + // style: OutlinedButton.styleFrom( + // side: const BorderSide(color: Color(0xFFE26728)), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(10), + // ), + // padding: const EdgeInsets.symmetric(vertical: 12), + // ), + // child: FittedBox( + // fit: BoxFit.scaleDown, + // child: Text( + // 'Cancel', + // style: GoogleFonts.poppins( + // color: const Color(0xFFE26728), + // fontSize: isMobile ? 14 : 16, + // ), + // ), + // ), + // ), + // ), + // const SizedBox(width: 15), + // Expanded( + // child: ElevatedButton( + // onPressed: () { + // Navigator.of(dialogContext).pop(); + // if (wellnessURL != null) { + // launchURL(wellnessURL, context); + // } else { + // ToastHelper.showInfoToast( + // context, 'Invalid link or unavailable'); + // } + // }, + // style: ElevatedButton.styleFrom( + // backgroundColor: const Color(0xFFE26728), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(10), + // ), + // padding: const EdgeInsets.symmetric(vertical: 12), + // ), + // child: FittedBox( + // fit: BoxFit.scaleDown, + // child: Text( + // 'Proceed', + // style: GoogleFonts.poppins( + // color: Colors.white, + // fontSize: isMobile ? 14 : 16, + // ), + // ), + // ), + // ), + // ), + // ], + // ), ], ), ), @@ -206,4 +221,4 @@ class PopupHelper { }, ); } -} +} \ No newline at end of file