APY integrated without testing...
This commit is contained in:
@@ -1,4 +1,8 @@
|
||||
import 'dart:convert';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:kmobile/api/services/yojna_service.dart';
|
||||
import 'package:kmobile/di/injection.dart';
|
||||
import 'package:kmobile/l10n/app_localizations.dart';
|
||||
|
||||
class APYRegisterScreen extends StatefulWidget {
|
||||
@@ -12,42 +16,73 @@ class APYRegisterScreen extends StatefulWidget {
|
||||
class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
final _formKey = GlobalKey<FormState>();
|
||||
|
||||
// Controllers
|
||||
late final _titleController = TextEditingController(text: widget.initialData?['customertitle']?.toString());
|
||||
late final _firstNameController = TextEditingController(text: widget.initialData?['customerfirstname']?.toString());
|
||||
late final _middleNameController = TextEditingController(text: widget.initialData?['customermiddlename']?.toString());
|
||||
late final _lastNameController = TextEditingController(text: widget.initialData?['customerlastname']?.toString());
|
||||
late final _customerNoController = TextEditingController(text: widget.initialData?['customerno']?.toString());
|
||||
late final _accountNoController = TextEditingController(text: widget.initialData?['accountno']?.toString());
|
||||
late final _balanceController = TextEditingController(text: widget.initialData?['availablebalance']?.toString());
|
||||
late final _dobController = TextEditingController(text: widget.initialData?['customerdob']?.toString());
|
||||
late final _genderController = TextEditingController(text: widget.initialData?['gender']?.toString());
|
||||
late final _marriedController = TextEditingController(text: widget.initialData?['married']?.toString());
|
||||
late final _mobileController = TextEditingController(text: widget.initialData?['mobilenumber']?.toString());
|
||||
late final _emailController = TextEditingController(text: widget.initialData?['emailid']?.toString());
|
||||
late final _aadhaarController = TextEditingController(text: widget.initialData?['aadharno']?.toString());
|
||||
late final _pincodeController = TextEditingController(text: widget.initialData?['pincode']?.toString());
|
||||
// Helper to format initial date string (DDMMYYYY -> DD/MM/YYYY)
|
||||
String _formatInitialDate(dynamic date) {
|
||||
if (date == null) return '';
|
||||
String dateStr = date.toString();
|
||||
if (dateStr.length == 8) {
|
||||
return "${dateStr.substring(0, 2)}/${dateStr.substring(2, 4)}/${dateStr.substring(4)}";
|
||||
}
|
||||
return dateStr;
|
||||
}
|
||||
|
||||
late final _pensionAmountController = TextEditingController(text: widget.initialData?['pensionamtoptedfor']?.toString() ?? '1000');
|
||||
late final _ageOfJoiningController = TextEditingController(text: widget.initialData?['ageofjoining']?.toString());
|
||||
late final _spouseNameController = TextEditingController(text: widget.initialData?['nameofspouse']?.toString());
|
||||
late final _incomeTaxPayerController = TextEditingController(text: widget.initialData?['whetherincometaxpayer']?.toString());
|
||||
late final _otherSchemeController = TextEditingController(text: widget.initialData?['beneficaryofothersociatysecurityschemes']?.toString());
|
||||
late final _collectionChannelController = TextEditingController(text: widget.initialData?['collectionchannel']?.toString() ?? '1');
|
||||
late final _contributionTypeController = TextEditingController(text: widget.initialData?['contributionType']?.toString() ?? 'C');
|
||||
late final _debitDateController = TextEditingController(text: widget.initialData?['subsequentContributionDebitDate']?.toString());
|
||||
// Controllers initialized strictly from initialData where available, otherwise empty.
|
||||
late final _titleController = TextEditingController(
|
||||
text: widget.initialData?['customertitle']?.toString());
|
||||
late final _firstNameController = TextEditingController(
|
||||
text: widget.initialData?['customerfirstname']?.toString());
|
||||
late final _middleNameController = TextEditingController(
|
||||
text: widget.initialData?['customermiddlename']?.toString());
|
||||
late final _lastNameController = TextEditingController(
|
||||
text: widget.initialData?['customerlastname']?.toString());
|
||||
late final _customerNoController = TextEditingController(
|
||||
text: widget.initialData?['customerno']?.toString());
|
||||
late final _accountNoController = TextEditingController(
|
||||
text: widget.initialData?['accountno']?.toString());
|
||||
late final _balanceController = TextEditingController(
|
||||
text: widget.initialData?['availablebalance']?.toString());
|
||||
late final _dobController = TextEditingController(
|
||||
text: _formatInitialDate(widget.initialData?['customerdob']));
|
||||
late final _genderController = TextEditingController(
|
||||
text: widget.initialData?['gender']?.toString());
|
||||
late final _aadhaarController = TextEditingController(
|
||||
text: widget.initialData?['aadharno']?.toString());
|
||||
late final _ageOfJoiningController = TextEditingController(
|
||||
text: widget.initialData?['ageofjoining']?.toString());
|
||||
late final _emailController = TextEditingController(
|
||||
text: widget.initialData?['emailid']?.toString());
|
||||
late final _modeOfCollectionController = TextEditingController(
|
||||
text: widget.initialData?['modeofcollection']?.toString());
|
||||
|
||||
late final _nomineeNameController = TextEditingController(text: widget.initialData?['nomineename']?.toString());
|
||||
late final _nomineeRelationController = TextEditingController(text: widget.initialData?['relationwithsubscriber']?.toString());
|
||||
late final _nomineeMinorController = TextEditingController(text: widget.initialData?['nomineeminor']?.toString() ?? 'N');
|
||||
// Fields that must be filled by the user (no defaults)
|
||||
late final _marriedController = TextEditingController();
|
||||
late final _mobileController = TextEditingController();
|
||||
late final _pincodeController = TextEditingController();
|
||||
late final _pensionAmountController = TextEditingController();
|
||||
late final _spouseNameController = TextEditingController();
|
||||
late final _incomeTaxPayerController = TextEditingController();
|
||||
late final _otherSchemeController = TextEditingController();
|
||||
late final _collectionChannelController = TextEditingController();
|
||||
late final _contributionTypeController = TextEditingController();
|
||||
late final _debitDateController = TextEditingController();
|
||||
late final _nomineeNameController = TextEditingController();
|
||||
late final _nomineeRelationController = TextEditingController();
|
||||
late final _nomineeMinorController = TextEditingController();
|
||||
late final _nomineeDobController = TextEditingController();
|
||||
late final _guardianNameController = TextEditingController();
|
||||
late final _fatcaController = TextEditingController();
|
||||
late final _birthCountryController = TextEditingController();
|
||||
late final _citizenshipCountryController = TextEditingController();
|
||||
late final _taxResidenceCountryController = TextEditingController();
|
||||
late final _usPersonController = TextEditingController();
|
||||
|
||||
late final _fatcaController = TextEditingController(text: widget.initialData?['fatcacrsapplicable']?.toString());
|
||||
late final _birthCountryController = TextEditingController(text: widget.initialData?['countryofbirth']?.toString());
|
||||
late final _citizenshipCountryController = TextEditingController(text: widget.initialData?['countryofcitizenship']?.toString());
|
||||
late final _taxResidenceCountryController = TextEditingController(text: widget.initialData?['countryofresidencefortaxpurpose']?.toString());
|
||||
late final _usPersonController = TextEditingController(text: widget.initialData?['uspersonflag']?.toString());
|
||||
late final _secondNomineeNameController = TextEditingController();
|
||||
late final _secondNomineeMinorController = TextEditingController();
|
||||
late final _secondNomineeRelationController = TextEditingController();
|
||||
late final _fatcaCountController = TextEditingController();
|
||||
late final _docCitizenshipFlagController = TextEditingController();
|
||||
late final _reasonNoEvidenceController = TextEditingController();
|
||||
late final _docNameEvidenceController = TextEditingController();
|
||||
|
||||
final Map<String, String> _yesNoOptions = {
|
||||
'Y': 'Yes',
|
||||
@@ -60,6 +95,12 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
'03': 'Miss',
|
||||
};
|
||||
|
||||
final Map<String, String> _genderOptions = {
|
||||
'M': 'Male',
|
||||
'F': 'Female',
|
||||
'O': 'Other',
|
||||
};
|
||||
|
||||
final Map<String, String> _pensionOptions = {
|
||||
'1000': '₹1000',
|
||||
'2000': '₹2000',
|
||||
@@ -143,20 +184,121 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
_citizenshipCountryController.dispose();
|
||||
_taxResidenceCountryController.dispose();
|
||||
_usPersonController.dispose();
|
||||
_secondNomineeNameController.dispose();
|
||||
_secondNomineeMinorController.dispose();
|
||||
_secondNomineeRelationController.dispose();
|
||||
_fatcaCountController.dispose();
|
||||
_docCitizenshipFlagController.dispose();
|
||||
_reasonNoEvidenceController.dispose();
|
||||
_docNameEvidenceController.dispose();
|
||||
_modeOfCollectionController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
bool _isFetched(String key) {
|
||||
return widget.initialData != null &&
|
||||
widget.initialData!.containsKey(key) &&
|
||||
widget.initialData![key]?.toString().isNotEmpty == true;
|
||||
Future<void> _selectDate(BuildContext context, TextEditingController controller) async {
|
||||
final DateTime? picked = await showDatePicker(
|
||||
context: context,
|
||||
initialDate: DateTime.now(),
|
||||
firstDate: DateTime(1900),
|
||||
lastDate: DateTime(2100),
|
||||
);
|
||||
if (picked != null) {
|
||||
setState(() {
|
||||
// Display format: DD/MM/YYYY
|
||||
controller.text = DateFormat('dd/MM/yyyy').format(picked);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _handleRegister() {
|
||||
void _handleRegister() async {
|
||||
if (_formKey.currentState!.validate()) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('Registration logic to be implemented')),
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (context) => const Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
|
||||
try {
|
||||
final yojnaService = getIt<YojnaService>();
|
||||
final response = await yojnaService.registerAPY(
|
||||
accountno: _accountNoController.text,
|
||||
customerfirstname: _firstNameController.text,
|
||||
customermiddlename: _middleNameController.text,
|
||||
customerlastname: _lastNameController.text,
|
||||
availablebalance: _balanceController.text,
|
||||
// Remove slashes for API (DD/MM/YYYY -> DDMMYYYY)
|
||||
customerdob: _dobController.text.replaceAll('/', ''),
|
||||
emailid: _emailController.text,
|
||||
gender: _genderController.text,
|
||||
married: _marriedController.text,
|
||||
nomineename: _nomineeNameController.text,
|
||||
relationwithsubscriber: _nomineeRelationController.text,
|
||||
mobilenumber: _mobileController.text,
|
||||
nomineeminor: _nomineeMinorController.text,
|
||||
customerno: _customerNoController.text,
|
||||
beneficaryofothersociatysecurityschemes: _otherSchemeController.text,
|
||||
whetherincometaxpayer: _incomeTaxPayerController.text,
|
||||
customertitle: _titleController.text,
|
||||
aadharno: _aadhaarController.text,
|
||||
nameofspouse: _spouseNameController.text,
|
||||
ageofjoining: _ageOfJoiningController.text,
|
||||
pensionamtoptedfor: _pensionAmountController.text,
|
||||
montlycontributioncalculate: _calculatedContribution,
|
||||
collectionchannel: _collectionChannelController.text,
|
||||
// Remove slashes for API
|
||||
subsequentContributionDebitDate: _debitDateController.text.replaceAll('/', ''),
|
||||
secondnomineeminor: _secondNomineeMinorController.text,
|
||||
secondnomineename: _secondNomineeNameController.text,
|
||||
secondrelationshipwithsubscriber: _secondNomineeRelationController.text,
|
||||
pincode: _pincodeController.text,
|
||||
fatcacrsapplicable: _fatcaController.text,
|
||||
countryofbirth: _birthCountryController.text,
|
||||
countryofcitizenship: _citizenshipCountryController.text,
|
||||
countryofresidencefortaxpurpose: _taxResidenceCountryController.text,
|
||||
uspersonflag: _usPersonController.text,
|
||||
fatcadeclarationcount: _fatcaCountController.text,
|
||||
documentevidencingcitizenshipflag: _docCitizenshipFlagController.text,
|
||||
reasonfornoevidence: _reasonNoEvidenceController.text,
|
||||
nameofdocumentforcitizenshipevidence: _docNameEvidenceController.text,
|
||||
modeofcollection: _modeOfCollectionController.text,
|
||||
contributionType: _contributionTypeController.text,
|
||||
);
|
||||
|
||||
if (!mounted) return;
|
||||
Navigator.pop(context); // Close loading dialog
|
||||
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Registration Result'),
|
||||
content: SingleChildScrollView(
|
||||
child: Text(response.toString()),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('OK'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
if (!mounted) return;
|
||||
Navigator.pop(context); // Close loading dialog
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('Error'),
|
||||
content: Text('Failed to register: $e'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('OK'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,7 +316,7 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
// Tile 1: Customer & APY Details
|
||||
// Tile 1: Customer Details
|
||||
Card(
|
||||
elevation: 2,
|
||||
child: Padding(
|
||||
@@ -182,53 +324,104 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(l10n.details,
|
||||
Text(l10n.personaldetails,
|
||||
style: const TextStyle(
|
||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 16),
|
||||
_buildDropdownField(_titleController, l10n.customerTitle,
|
||||
_titleOptions,
|
||||
readOnly: _isFetched('customertitle')),
|
||||
_buildDropdownField(
|
||||
_titleController, l10n.customerTitle, _titleOptions),
|
||||
_buildTextField(
|
||||
_firstNameController, l10n.customerFirstName,
|
||||
readOnly: _isFetched('customerfirstname')),
|
||||
_firstNameController, l10n.customerFirstName),
|
||||
_buildTextField(
|
||||
_middleNameController, l10n.customerMiddleName,
|
||||
readOnly: _isFetched('customermiddlename')),
|
||||
_middleNameController, l10n.customerMiddleName),
|
||||
_buildTextField(
|
||||
_lastNameController, l10n.customerLastName,
|
||||
readOnly: _isFetched('customerlastname')),
|
||||
_lastNameController, l10n.customerLastName),
|
||||
_buildTextField(_customerNoController, l10n.customerNo),
|
||||
_buildTextField(_accountNoController, l10n.accountNumber,
|
||||
keyboardType: TextInputType.number,
|
||||
readOnly: _isFetched('accountno')),
|
||||
_buildTextField(
|
||||
_balanceController, l10n.availableBalance,
|
||||
keyboardType: TextInputType.number,
|
||||
readOnly: _isFetched('availablebalance')),
|
||||
keyboardType: TextInputType.number),
|
||||
_buildTextField(_balanceController, l10n.availableBalance,
|
||||
keyboardType: TextInputType.number),
|
||||
_buildTextField(_dobController, l10n.customerDobFormat,
|
||||
mandatory: true, readOnly: _isFetched('customerdob')),
|
||||
mandatory: true, onTap: () => _selectDate(context, _dobController)),
|
||||
_buildDropdownField(
|
||||
_genderController, l10n.gender, _genderOptions),
|
||||
_buildTextField(_mobileController, l10n.mobileNumber,
|
||||
keyboardType: TextInputType.phone),
|
||||
_buildTextField(_emailController, l10n.emailId,
|
||||
keyboardType: TextInputType.emailAddress,
|
||||
readOnly: _isFetched('emailid')),
|
||||
keyboardType: TextInputType.emailAddress),
|
||||
_buildTextField(_aadhaarController, l10n.aadhaarNo,
|
||||
keyboardType: TextInputType.number),
|
||||
_buildTextField(_pincodeController, l10n.pincode,
|
||||
keyboardType: TextInputType.number),
|
||||
_buildDropdownField(
|
||||
_marriedController, l10n.marriedYesNo, _yesNoOptions,
|
||||
mandatory: true),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Tile 2: Nominee Details
|
||||
Card(
|
||||
elevation: 2,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(l10n.nomineeDetails,
|
||||
style: const TextStyle(
|
||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 16),
|
||||
Text("Nominee 1", style: TextStyle(fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary)),
|
||||
const SizedBox(height: 8),
|
||||
_buildTextField(_nomineeNameController, l10n.nomineeName,
|
||||
mandatory: true),
|
||||
_buildTextField(_nomineeRelationController, l10n.relationWithSubscriber,
|
||||
mandatory: true),
|
||||
_buildDropdownField(_nomineeMinorController,
|
||||
l10n.nomineeMinor, _yesNoOptions,
|
||||
mandatory: true, onChanged: (val) {
|
||||
l10n.nomineeMinor, _yesNoOptions, mandatory: true,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_nomineeMinorController.text = val ?? 'N';
|
||||
_nomineeMinorController.text = val ?? '';
|
||||
});
|
||||
}),
|
||||
if (_nomineeMinorController.text == 'Y') ...[
|
||||
_buildTextField(_nomineeDobController, l10n.nomineeDob,
|
||||
mandatory: true),
|
||||
mandatory: true, onTap: () => _selectDate(context, _nomineeDobController)),
|
||||
_buildTextField(
|
||||
_guardianNameController, l10n.guardianName,
|
||||
mandatory: true),
|
||||
],
|
||||
const Divider(height: 32),
|
||||
Text("Nominee 2", style: TextStyle(fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary)),
|
||||
const SizedBox(height: 8),
|
||||
_buildTextField(_secondNomineeNameController, l10n.secondNomineeName),
|
||||
_buildTextField(_secondNomineeRelationController, l10n.secondNomineeRelationship),
|
||||
_buildDropdownField(_secondNomineeMinorController,
|
||||
l10n.secondNomineeMinor, _yesNoOptions,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_secondNomineeMinorController.text = val ?? '';
|
||||
});
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Tile 3: Scheme & APY Details
|
||||
Card(
|
||||
elevation: 2,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(l10n.schemeDetails,
|
||||
style: const TextStyle(
|
||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 16),
|
||||
_buildDropdownField(_otherSchemeController,
|
||||
l10n.isBeneficiaryOtherScheme, _yesNoOptions,
|
||||
mandatory: true),
|
||||
@@ -242,40 +435,78 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
_buildDropdownField(_collectionChannelController,
|
||||
l10n.collectionChannel, _collectionChannelOptions,
|
||||
mandatory: true),
|
||||
_buildDropdownField(
|
||||
_fatcaController, l10n.fatcaApplicable, _yesNoOptions),
|
||||
_buildTextField(_modeOfCollectionController, l10n.modeOfCollection),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Tile 4: FATCA / CRS Details (KYC Details)
|
||||
Card(
|
||||
elevation: 2,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(l10n.kycdetails,
|
||||
style: const TextStyle(
|
||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 16),
|
||||
_buildDropdownField(_fatcaController,
|
||||
l10n.fatcaApplicable, _yesNoOptions),
|
||||
_buildTextField(
|
||||
_birthCountryController, l10n.countryOfBirth),
|
||||
_buildTextField(
|
||||
_citizenshipCountryController, l10n.countryOfCitizenship),
|
||||
_buildTextField(_citizenshipCountryController,
|
||||
l10n.countryOfCitizenship),
|
||||
_buildTextField(_taxResidenceCountryController,
|
||||
l10n.countryOfTaxResidence),
|
||||
_buildDropdownField(
|
||||
_usPersonController, l10n.usPersonFlag, _yesNoOptions),
|
||||
const Divider(height: 32),
|
||||
_buildDropdownField(_usPersonController,
|
||||
l10n.usPersonFlag, _yesNoOptions),
|
||||
_buildTextField(_fatcaCountController, "FATCA Declaration Count"),
|
||||
_buildTextField(_docCitizenshipFlagController, "Doc Evidencing Citizenship Flag"),
|
||||
_buildTextField(_reasonNoEvidenceController, "Reason for No Evidence"),
|
||||
_buildTextField(_docNameEvidenceController, "Doc Name for Citizenship Evidence"),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Tile 5: Pension & Contribution Settings
|
||||
Card(
|
||||
elevation: 2,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(l10n.contributionAmount,
|
||||
style: const TextStyle(
|
||||
fontSize: 18, fontWeight: FontWeight.bold)),
|
||||
const SizedBox(height: 16),
|
||||
_buildDropdownField(_pensionAmountController,
|
||||
l10n.pensionAmount, _pensionOptions,
|
||||
mandatory: true, onChanged: (val) {
|
||||
l10n.pensionAmount, _pensionOptions, mandatory: true,
|
||||
onChanged: (val) {
|
||||
setState(() {
|
||||
_pensionAmountController.text = val ?? '1000';
|
||||
_pensionAmountController.text = val ?? '';
|
||||
});
|
||||
}),
|
||||
_buildDropdownField(_contributionTypeController,
|
||||
l10n.periodicity, _getPeriodicityOptions(l10n),
|
||||
mandatory: true, onChanged: (val) {
|
||||
setState(() {
|
||||
_contributionTypeController.text = val ?? 'C';
|
||||
_contributionTypeController.text = val ?? '';
|
||||
});
|
||||
}),
|
||||
_buildTextField(
|
||||
_debitDateController, l10n.subsequentDebitDate,
|
||||
mandatory: true),
|
||||
mandatory: true, onTap: () => _selectDate(context, _debitDateController)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
// Tile 2: Contribution Amount
|
||||
// Tile 6: Contribution Amount Summary
|
||||
Card(
|
||||
elevation: 2,
|
||||
color: Theme.of(context).colorScheme.secondaryContainer,
|
||||
@@ -306,8 +537,10 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
ElevatedButton(
|
||||
onPressed: _handleRegister,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Theme.of(context).colorScheme.primaryContainer,
|
||||
foregroundColor: Theme.of(context).colorScheme.onPrimaryContainer,
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.primaryContainer,
|
||||
foregroundColor:
|
||||
Theme.of(context).colorScheme.onPrimaryContainer,
|
||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||
elevation: 4,
|
||||
shape: RoundedRectangleBorder(
|
||||
@@ -316,7 +549,8 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
),
|
||||
child: Text(
|
||||
l10n.register,
|
||||
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
|
||||
style: const TextStyle(
|
||||
fontSize: 16, fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 32),
|
||||
@@ -327,9 +561,11 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildDropdownField(
|
||||
TextEditingController controller, String label, Map<String, String> options,
|
||||
{bool readOnly = false, bool mandatory = false, void Function(String?)? onChanged}) {
|
||||
Widget _buildDropdownField(TextEditingController controller, String label,
|
||||
Map<String, String> options,
|
||||
{bool readOnly = false,
|
||||
bool mandatory = false,
|
||||
void Function(String?)? onChanged}) {
|
||||
String? currentValue =
|
||||
options.containsKey(controller.text) ? controller.text : null;
|
||||
|
||||
@@ -337,15 +573,18 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
padding: const EdgeInsets.only(bottom: 16.0),
|
||||
child: DropdownButtonFormField<String>(
|
||||
value: currentValue,
|
||||
onChanged: readOnly ? null : (newValue) {
|
||||
if (onChanged != null) {
|
||||
onChanged(newValue);
|
||||
} else {
|
||||
setState(() {
|
||||
controller.text = newValue ?? '';
|
||||
});
|
||||
}
|
||||
},
|
||||
onChanged: readOnly
|
||||
? null
|
||||
: (newValue) {
|
||||
if (newValue != null) {
|
||||
setState(() {
|
||||
controller.text = newValue;
|
||||
});
|
||||
}
|
||||
if (onChanged != null) {
|
||||
onChanged(newValue);
|
||||
}
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
labelText: mandatory ? '$label *' : label,
|
||||
border: const OutlineInputBorder(),
|
||||
@@ -371,15 +610,18 @@ class _APYRegisterScreenState extends State<APYRegisterScreen> {
|
||||
Widget _buildTextField(TextEditingController controller, String label,
|
||||
{TextInputType keyboardType = TextInputType.text,
|
||||
bool readOnly = false,
|
||||
bool mandatory = false}) {
|
||||
bool mandatory = false,
|
||||
VoidCallback? onTap}) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 16.0),
|
||||
child: TextFormField(
|
||||
controller: controller,
|
||||
readOnly: readOnly,
|
||||
readOnly: readOnly || onTap != null,
|
||||
onTap: onTap,
|
||||
decoration: InputDecoration(
|
||||
labelText: mandatory ? '$label *' : label,
|
||||
border: const OutlineInputBorder(),
|
||||
suffixIcon: onTap != null ? const Icon(Icons.calendar_today) : null,
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 16, horizontal: 12),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user