From cd201d608e9bbcbfbd415f2ef6f128fd1ef4b8da Mon Sep 17 00:00:00 2001 From: venbaittech Date: Fri, 21 Nov 2025 19:00:16 +0530 Subject: [PATCH] policy --- .../screens/staff/Enquiry/raise_enq_form.dart | 10 +- .../staff/Enquiry/tabs/createQuotation.dart | 44 +++- .../screens/staff/Enquiry/tabs/policyTab.dart | 247 ++++++++++-------- .../screens/staff/Enquiry/tabs/tab.dart | 8 +- .../themes/indicators/text_field_theme.dart | 9 +- .../text_field_theme_inline_editor.dart | 7 +- 6 files changed, 199 insertions(+), 126 deletions(-) diff --git a/lib/presentation/screens/staff/Enquiry/raise_enq_form.dart b/lib/presentation/screens/staff/Enquiry/raise_enq_form.dart index 0a09afe..8783d6d 100644 --- a/lib/presentation/screens/staff/Enquiry/raise_enq_form.dart +++ b/lib/presentation/screens/staff/Enquiry/raise_enq_form.dart @@ -326,7 +326,7 @@ class RaiseEnqFormState extends ConsumerState { return Container( // color: Color(0xFFFCFCFC), // margin: const EdgeInsets.symmetric(vertical: 8), - padding: const EdgeInsets.symmetric(vertical: 16, horizontal: 25), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 25), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), @@ -384,7 +384,7 @@ class RaiseEnqFormState extends ConsumerState { // width: fromHeader // ? MediaQuery.of(context).size.width * 0.11 // : MediaQuery.of(context).size.width * 0.08, - height: 30, + // height: 30, child: DropdownSearch>( key: dropDownKeyAgent, selectedItem: selectedAgntName.isNotEmpty ? selectedAgntName : null, @@ -564,6 +564,7 @@ class RaiseEnqFormState extends ConsumerState { // errorText: fieldErrors['name'], borderColor: Color(0xFFE2E8F0), highlightColor: Color(0xFF50A398), + padVertical: 13, isdense: true, validator: (value) => Validators.requiredField(value, "name"), widthNone: true, @@ -585,7 +586,7 @@ class RaiseEnqFormState extends ConsumerState { SizedBox(height: 5), Container( - height: 30, + // height: 30, width: MediaQuery.of(context).size.width * 0.12, child: DropdownSearch>( key: dropDownKeyInsurerEnqAsgn, @@ -746,6 +747,7 @@ class RaiseEnqFormState extends ConsumerState { hintText: 'Vehicle Number', borderColor: Color(0xFFE2E8F0), highlightColor: Color(0xFF50A398), + padVertical: 13, isdense: true, inputFormatters: [ UpperCaseTextFormatter(), // 👈 custom formatter for uppercase @@ -777,7 +779,7 @@ class RaiseEnqFormState extends ConsumerState { SizedBox(height: 5), SizedBox( - height: 30, + // height: 30, width: MediaQuery.of(context).size.width * 0.15, child: DropdownSearch>( key: dropDownSelectStaffKey, diff --git a/lib/presentation/screens/staff/Enquiry/tabs/createQuotation.dart b/lib/presentation/screens/staff/Enquiry/tabs/createQuotation.dart index 3d40ac4..b278de8 100644 --- a/lib/presentation/screens/staff/Enquiry/tabs/createQuotation.dart +++ b/lib/presentation/screens/staff/Enquiry/tabs/createQuotation.dart @@ -371,6 +371,7 @@ class CreateProposalFormState extends ConsumerState { // final bool isUpdating = widget.selectedQuotationFrmListId != null; // final id = widget.selectedQuotationFrmListId!; + print("userDatauserData1 - $userData"); final bool isUpdating = widget.selectedQuotationFrmListId != null; final id = widget.selectedQuotationFrmListId; // keep nullable @@ -396,6 +397,7 @@ class CreateProposalFormState extends ConsumerState { // request.fields['_method'] = 'PUT'; request.fields['id'] = id!; request.fields['updated_by'] = widget.userId!.toString(); + request.fields['created_by'] = widget.userId!.toString(); } else { print('Not Updatrinf'); request.fields['created_by'] = widget.userId!.toString(); @@ -591,6 +593,7 @@ class CreateProposalFormState extends ConsumerState { SizedBox(height: 10), ThemedFormField( controller: controllers['idv']!, + inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[0-9.]')), ], @@ -603,7 +606,7 @@ class CreateProposalFormState extends ConsumerState { txtwidth: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, - txtheight: 35, + // txtheight: 35, ), ], ); @@ -628,7 +631,7 @@ class CreateProposalFormState extends ConsumerState { txtwidth: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, - txtheight: 35, + // txtheight: 35, ), ], ); @@ -650,7 +653,7 @@ class CreateProposalFormState extends ConsumerState { width: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, - height: 35, + // height: 35, child: DropdownSearch>( key: dropDownKey, selectedItem: selectedVehicle.isNotEmpty ? selectedVehicle : null, @@ -804,7 +807,7 @@ class CreateProposalFormState extends ConsumerState { width: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, - height: 35, + // height: 35, child: DropdownSearch>( key: dropDownSelectPaymentModeKey, selectedItem: selectedVehicle.isNotEmpty ? selectedVehicle : null, @@ -938,7 +941,7 @@ class CreateProposalFormState extends ConsumerState { width: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, - height: 35, + // height: 35, child: DropdownSearch>( key: dropDownKeyBroker, selectedItem: selectedBrokers.isNotEmpty ? selectedBrokers : null, @@ -1066,19 +1069,46 @@ class CreateProposalFormState extends ConsumerState { children: [ ThemedUploadField( hintText: selectedFileNames ?? "Upload Document", - txtheight: 40, + // txtheight: 40, txtwidth: ResponsiveLayout.isMobile(context) ? null : MediaQuery.of(context).size.width * 0.18, borderColor: Color(0xFFE2E8F0), + // highlightColor: Color(0xFF50A398), // backgroundColor: Color(0xFFEDF6F5), - onFileSelected: (fileName, file) { + onFileSelected: (fileName, file) async { + print("Picked file: $fileName (${file.size} bytes)"); + + if (!fileName.toLowerCase().endsWith('.pdf')) { + ToastHelper.showErrorToast( + context, + 'Only PDF files are allowed.', + ); + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Only PDF files are allowed.'), + backgroundColor: Colors.red, + ), + ); + return; // Stop here + } + print("Picked file: $fileName (${file.size} bytes)"); setState(() { docUploadedFile = file; }); + + // if (selectedBrokerName == 'Nhance') { + // handleUploadPolicy(); + // } }, + // onFileSelected: (fileName, file) { + // print("Picked file: $fileName (${file.size} bytes)"); + // setState(() { + // docUploadedFile = file; + // }); + // }, ), // const SizedBox(height: 5), // diff --git a/lib/presentation/screens/staff/Enquiry/tabs/policyTab.dart b/lib/presentation/screens/staff/Enquiry/tabs/policyTab.dart index 0b2483c..4bebad6 100644 --- a/lib/presentation/screens/staff/Enquiry/tabs/policyTab.dart +++ b/lib/presentation/screens/staff/Enquiry/tabs/policyTab.dart @@ -404,7 +404,20 @@ class PolicyStaffTabState extends ConsumerState { } } + String fixInvalidDate(dynamic value) { + if (value == null) return ''; + final str = value.toString(); + + // Check for your invalid date patterns + if (str.contains('--0001') || str == '30-11--0001' || str == '0000-00-00') { + return ''; + } + return str; + } + void updatePolicyData(Map policyData) { + print("updatePolicyDataupdatePolicyData - $policyData"); + if (!mounted || policyData.isEmpty) return; setState(() { @@ -422,11 +435,18 @@ class PolicyStaffTabState extends ConsumerState { policyData['policy_number']?.toString() ?? ''; controllers["policyPaymentMode"]?.text = policyData['payment_mode']?.toString() ?? ''; - controllers["issueDate"]?.text = - policyData['issued_date']?.toString() ?? ''; - controllers["startDate"]?.text = - policyData['start_date']?.toString() ?? ''; - controllers["endDate"]?.text = policyData['end_date']?.toString() ?? ''; + + controllers["issueDate"]?.text = fixInvalidDate( + policyData['issued_date'], + ); + controllers["startDate"]?.text = fixInvalidDate(policyData['start_date']); + controllers["endDate"]?.text = fixInvalidDate(policyData['end_date']); + + // controllers["issueDate"]?.text = + // policyData['issued_date']?.toString() ?? ''; + // controllers["startDate"]?.text = + // policyData['start_date']?.toString() ?? ''; + // controllers["endDate"]?.text = policyData['end_date']?.toString() ?? ''; controllers["tp"]?.text = policyData['tp']?.toString() ?? ''; controllers["od"]?.text = policyData['od']?.toString() ?? ''; @@ -479,7 +499,7 @@ class PolicyStaffTabState extends ConsumerState { } void updateUploadPDFPolicyData(Map policyData) { - print('updateUploadPDFPolicyData - $policyData'); + print('updateUploadPDFPolicyDataJJ - $policyData'); if (!mounted || policyData.isEmpty) return; setState(() { @@ -527,35 +547,35 @@ class PolicyStaffTabState extends ConsumerState { } void handleSave() { - if (!_formKey.currentState!.validate()) return; + // if (!_formKey.currentState!.validate()) return; setState(() { - if (_formKey.currentState!.validate()) { - calculateAmount(); - dataDetails(); - final dataSet = dataDetails(); - print("dataSetPolicy - $dataSet"); + // if (_formKey.currentState!.validate()) { + calculateAmount(); + dataDetails(); + final dataSet = dataDetails(); + print("dataSetPolicy - $dataSet"); - final bool isUpdating = choosedPolcyId != null; + final bool isUpdating = choosedPolcyId != null; - // if (!isUpdating && selectedBrokerName == 'Nhance') { - // // if (!isUpdating && enqBrokerName == 'Nhance') { - // ToastHelper.showErrorToast(context, "Policy PDF is required"); - // return; - // } - // (enqBrokerName != 'Nhance') - // File validations - if ( - // (selectedBrokerName != 'Nhance') && - (docPDFUploadedFile == null || docPDFUploadedFile?.bytes == null) && - (docUploadedPDFFileUrlFromApi == null || - docUploadedPDFFileUrlFromApi!.isEmpty)) { - ToastHelper.showErrorToast(context, "Policy PDF is required"); - return; - } - createUserData(dataSet); - } else { - // isDi sable = false; + // if (!isUpdating && selectedBrokerName == 'Nhance') { + // // if (!isUpdating && enqBrokerName == 'Nhance') { + // ToastHelper.showErrorToast(context, "Policy PDF is required"); + // return; + // } + // (enqBrokerName != 'Nhance') + // File validations + if ( + // (selectedBrokerName != 'Nhance') && + (docPDFUploadedFile == null || docPDFUploadedFile?.bytes == null) && + (docUploadedPDFFileUrlFromApi == null || + docUploadedPDFFileUrlFromApi!.isEmpty)) { + ToastHelper.showErrorToast(context, "Policy PDF is required"); + return; } + createUserData(dataSet); + // } else { + // // isDi sable = false; + // } }); } @@ -1070,66 +1090,75 @@ class PolicyStaffTabState extends ConsumerState { key: _formKey, child: Column( children: [ - Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Paymentmode(context), - SizedBox(width: 20), - buildBroker(context), - if (selectedBrokerName != null) ...[ - SizedBox(width: 20), - buildUploadPolicyPdf(context), + if (docUploadedPDFFileUrlFromApi == null || + docUploadedPDFFileUrlFromApi!.isEmpty) ...[ + Text('No Data Found'), + ], - // SizedBox(width: 20), + // Show form fields when URL is NOT null AND NOT empty + if (docUploadedPDFFileUrlFromApi != null && + docUploadedPDFFileUrlFromApi!.isNotEmpty) ...[ + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Paymentmode(context), + SizedBox(width: 20), + buildBroker(context), + if (selectedBrokerName != null) ...[ + SizedBox(width: 20), + buildUploadPolicyPdf(context), + + // SizedBox(width: 20), + ], ], + ), + + if (selectedBrokerName != null) ...[ + SizedBox(height: 10), + Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + policynumber(context), + SizedBox(width: 20), + policyissuedate(context), + SizedBox(width: 20), + policystartdate(context), + SizedBox(width: 20), + policyenddate(context), + ], + ), + + Row( + crossAxisAlignment: CrossAxisAlignment.start, + + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildThirdParty(context), + buildOwnDamage(context), + buildPersonalAccident(context), + ], + ), + + SizedBox(width: 20), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildCGST(context), + buildSGST(context), + buildIGST(context), + buildPremiumTotal(context), + ], + ), + ], + ), ], - ), - - if (selectedBrokerName != null) ...[ - SizedBox(height: 10), - Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - policynumber(context), - SizedBox(width: 20), - policyissuedate(context), - SizedBox(width: 20), - policystartdate(context), - SizedBox(width: 20), - policyenddate(context), - ], - ), - - Row( - crossAxisAlignment: CrossAxisAlignment.start, - - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildThirdParty(context), - buildOwnDamage(context), - buildPersonalAccident(context), - ], - ), - - SizedBox(width: 20), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - buildCGST(context), - buildSGST(context), - buildIGST(context), - buildPremiumTotal(context), - ], - ), - ], - ), ], ], ), @@ -1393,13 +1422,13 @@ class PolicyStaffTabState extends ConsumerState { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Policy Number *', style: _textStyle), + Text('Policy Number ', style: _textStyle), SizedBox(height: 10), ThemedFormField( controller: controllers['policyNumber']!, borderColor: Color(0xFFE2E8F0), highlightColor: Color(0xFF50A398), - validator: (value) => Validators.requiredField(value, "policyNumber"), + // validator: (value) => Validators.requiredField(value, "policyNumber"), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[a-zA-Z 0-9]')), ], @@ -1605,7 +1634,7 @@ class PolicyStaffTabState extends ConsumerState { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Issue Date *', style: _textStyle), + Text('Issue Date', style: _textStyle), SizedBox(height: 10), ThemedDateField( hintText: "Select Date", @@ -1614,7 +1643,7 @@ class PolicyStaffTabState extends ConsumerState { : MediaQuery.of(context).size.width * 0.14, txtheight: 50, // backgroundColor: const Color(0xFFECECEC), - validator: (value) => Validators.requiredField(value, "date"), + // validator: (value) => Validators.requiredField(value, "date"), controller: controllers['issueDate']!, onDateSelected: (date) { print("Picked Date: $date"); @@ -1633,7 +1662,7 @@ class PolicyStaffTabState extends ConsumerState { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('Start Date *', style: _textStyle), + Text('Start Date', style: _textStyle), SizedBox(height: 10), ThemedDateField( hintText: "Select Date", @@ -1642,7 +1671,7 @@ class PolicyStaffTabState extends ConsumerState { : MediaQuery.of(context).size.width * 0.14, txtheight: 50, // backgroundColor: const Color(0xFFECECEC), - validator: (value) => Validators.requiredField(value, "date"), + // validator: (value) => Validators.requiredField(value, "date"), controller: controllers['startDate']!, onDateSelected: (date) { print("Picked Date: $date"); @@ -1674,7 +1703,7 @@ class PolicyStaffTabState extends ConsumerState { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('End Date *', style: _textStyle), + Text('End Date', style: _textStyle), SizedBox(height: 10), ThemedDateField( hintText: "Select Date", @@ -1685,9 +1714,9 @@ class PolicyStaffTabState extends ConsumerState { // backgroundColor: const Color(0xFFECECEC), // validator: (value) => Validators.requiredField(value, "date"), validator: (value) { - if (value == null || value.isEmpty) { - return "Required"; - } + // if (value == null || value.isEmpty) { + // return "Required"; + // } final startDateControllerText = controllers['startDate']?.text; if (startDateControllerText == null || @@ -1698,7 +1727,7 @@ class PolicyStaffTabState extends ConsumerState { final startDate = DateFormat( 'dd-MM-yyyy', ).parse(startDateControllerText); - final endDate = DateFormat('dd-MM-yyyy').parse(value); + final endDate = DateFormat('dd-MM-yyyy').parse(value!); if (endDate.isBefore(startDate)) { return "End date cannot be before start date"; @@ -1993,7 +2022,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('Third Party *', style: _textStyle), + child: Text('Third Party', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( @@ -2001,7 +2030,7 @@ class PolicyStaffTabState extends ConsumerState { // backgroundColor: Color(0xffEDF6F5), errorBorderColor: Color(0xffEDF6F5), hintText: '0', - validator: (value) => Validators.requiredField(value, "Third Party"), + // validator: (value) => Validators.requiredField(value, "Third Party"), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[.0-9]')), ], @@ -2025,7 +2054,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('Own Damage *', style: _textStyle), + child: Text('Own Damage ', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( @@ -2033,7 +2062,7 @@ class PolicyStaffTabState extends ConsumerState { // backgroundColor: Color(0xffEDF6F5), errorBorderColor: Color(0xffEDF6F5), hintText: '0', - validator: (value) => Validators.requiredField(value, "OwnDamage"), + // validator: (value) => Validators.requiredField(value, "OwnDamage"), onChanged: (value) => calculateAmount(), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[.0-9]')), @@ -2053,7 +2082,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('Personal Accident*', style: _textStyle), + child: Text('Personal Accident', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( @@ -2062,8 +2091,8 @@ class PolicyStaffTabState extends ConsumerState { errorBorderColor: Color(0xffEDF6F5), hintText: '0', onChanged: (value) => calculateAmount(), - validator: (value) => - Validators.requiredField(value, "PersonalAccident"), + // validator: (value) => + // Validators.requiredField(value, "PersonalAccident"), inputFormatters: [ FilteringTextInputFormatter.allow(RegExp(r'[.0-9]')), ], @@ -2082,7 +2111,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('CGST *', style: _textStyle), + child: Text('CGST', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( @@ -2109,7 +2138,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('SGST *', style: _textStyle), + child: Text('SGST', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( @@ -2136,7 +2165,7 @@ class PolicyStaffTabState extends ConsumerState { children: [ SizedBox( width: MediaQuery.of(context).size.width * 0.15, - child: Text('IGST *', style: _textStyle), + child: Text('IGST', style: _textStyle), ), SizedBox(width: 20), ThemedFormField( diff --git a/lib/presentation/screens/staff/Enquiry/tabs/tab.dart b/lib/presentation/screens/staff/Enquiry/tabs/tab.dart index 2fc696d..a09457a 100644 --- a/lib/presentation/screens/staff/Enquiry/tabs/tab.dart +++ b/lib/presentation/screens/staff/Enquiry/tabs/tab.dart @@ -126,9 +126,11 @@ class TabEnquiryStaffListState extends ConsumerState { // } // Auto-select tab based on showKey - if (widget.showKey == "Policy") { - selectedIndex = 1; // Policy tab index - } else if (tabIndex != null) { + // if (widget.showKey == "Policy") { + // selectedIndex = 1; // Policy tab index + // } else + + if (tabIndex != null) { selectedIndex = tabIndex; } else { selectedIndex = 0; // Default Quotation tab diff --git a/lib/presentation/themes/indicators/text_field_theme.dart b/lib/presentation/themes/indicators/text_field_theme.dart index c9dbc73..01550d1 100644 --- a/lib/presentation/themes/indicators/text_field_theme.dart +++ b/lib/presentation/themes/indicators/text_field_theme.dart @@ -106,9 +106,14 @@ class ThemedFormField extends HookWidget { ), filled: true, fillColor: backgroundColor ?? Colors.white, + + // contentPadding: EdgeInsets.symmetric( + // vertical: verticalPad ?? 12, + // horizontal: horizonalPad ?? 15, + // ), contentPadding: EdgeInsets.symmetric( - vertical: verticalPad ?? 14, - horizontal: horizonalPad ?? 15, + vertical: verticalPad ?? 10, + horizontal: 10, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), diff --git a/lib/presentation/themes/indicators/text_field_theme_inline_editor.dart b/lib/presentation/themes/indicators/text_field_theme_inline_editor.dart index 41159fd..d263b5b 100644 --- a/lib/presentation/themes/indicators/text_field_theme_inline_editor.dart +++ b/lib/presentation/themes/indicators/text_field_theme_inline_editor.dart @@ -30,6 +30,7 @@ class ThemedFormInlineField extends HookWidget { this.isShowCursor, this.onChanged, this.isdense, + this.padVertical, }); final String? hintText; @@ -52,6 +53,7 @@ class ThemedFormInlineField extends HookWidget { final TextInputType? keyboardType; final int? maxLength; final double? txtheight; + final double? padVertical; final List? inputFormatters; // void Function(dynamic value)? onChanged; final ValueChanged? onChanged; @@ -100,7 +102,10 @@ class ThemedFormInlineField extends HookWidget { filled: true, fillColor: backgroundColor ?? Colors.white, // contentPadding: const EdgeInsets.symmetric(vertical: 14, horizontal: 2), - contentPadding: const EdgeInsets.symmetric(vertical: 10, horizontal: 10), + contentPadding: EdgeInsets.symmetric( + vertical: padVertical ?? 10, + horizontal: 10, + ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(5),