Commit d2939607 authored by Sai Srinivas's avatar Sai Srinivas
Browse files

Correction and changes

parent a5ccb211
class ValidateBankAccountDetailsResponse {
String? nameAtBank;
String? bankName;
String? branch;
String? error;
String? message;
int? sessionExists;
ValidateBankAccountDetailsResponse(
{this.nameAtBank,
this.bankName,
this.branch,
this.error,
this.message,
this.sessionExists});
ValidateBankAccountDetailsResponse.fromJson(Map<String, dynamic> json) {
nameAtBank = json['name_at_bank'];
bankName = json['bank_name'];
branch = json['branch'];
error = json['error'];
message = json['message'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['name_at_bank'] = this.nameAtBank;
data['bank_name'] = this.bankName;
data['branch'] = this.branch;
data['error'] = this.error;
data['message'] = this.message;
data['session_exists'] = this.sessionExists;
return data;
}
}
class ValidateGstNumResponse {
String? legalNameOfBusiness;
String? address;
String? error;
String? message;
int? sessionExists;
ValidateGstNumResponse(
{this.legalNameOfBusiness,
this.address,
this.error,
this.message,
this.sessionExists});
ValidateGstNumResponse.fromJson(Map<String, dynamic> json) {
legalNameOfBusiness = json['legal_name_of_business'];
address = json['address'];
error = json['error'];
message = json['message'];
sessionExists = json['session_exists'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['legal_name_of_business'] = this.legalNameOfBusiness;
data['address'] = this.address;
data['error'] = this.error;
data['message'] = this.message;
data['session_exists'] = this.sessionExists;
return data;
}
}
class CommonResponse { class CommonResponse {
String? error; String? error;
String? message; String? message;
String? qrCode;
String? qrId;
int? sessionExists; int? sessionExists;
CommonResponse({this.error, this.message, this.sessionExists}); CommonResponse({this.error, this.message, this.sessionExists});
CommonResponse.fromJson(Map<String, dynamic> json) { CommonResponse.fromJson(Map<String, dynamic> json) {
error = json['error']; error = json['error'];
qrCode = json['qr_code'];
qrId = json['razorpay_order_id'];
message = json['message']; message = json['message'];
sessionExists = json['session_exists']; sessionExists = json['session_exists'];
} }
...@@ -15,6 +18,8 @@ class CommonResponse { ...@@ -15,6 +18,8 @@ class CommonResponse {
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{}; final Map<String, dynamic> data = <String, dynamic>{};
data['error'] = error; data['error'] = error;
data['qr_code'] = qrCode;
data['razorpay_order_id'] = qrId;
data['message'] = message; data['message'] = message;
data['session_exists'] = sessionExists; data['session_exists'] = sessionExists;
return data; return data;
......
...@@ -208,6 +208,7 @@ class Paymentdetailsprovider extends ChangeNotifier { ...@@ -208,6 +208,7 @@ class Paymentdetailsprovider extends ChangeNotifier {
_imageName = null; _imageName = null;
_image_picked = 0; _image_picked = 0;
resetErrors();
notifyListeners(); notifyListeners();
} else {} } else {}
} else { } else {
...@@ -775,6 +776,22 @@ class Paymentdetailsprovider extends ChangeNotifier { ...@@ -775,6 +776,22 @@ class Paymentdetailsprovider extends ChangeNotifier {
} }
} }
void resetErrors() {
nameError = null;
designationError = null;
mobError = null;
altMobError = null;
telError = null;
emailError = null;
selectContactError = null;
selectPaymentError = null;
selectAmountError = null;
ReferenceError = null;
imageError = null;
notifyListeners();
}
resetAddContect() { resetAddContect() {
Amountcontroller.clear(); Amountcontroller.clear();
Referencecontroller.clear(); Referencecontroller.clear();
......
import 'dart:async';
import 'package:flutter/material.dart';
import '../Models/ordersModels/commonResponse.dart';
import '../Utils/custom_snackbar.dart';
import '../services/api_calling.dart';
class QrProvider extends ChangeNotifier {
CommonResponse? _qrResponse;
bool _isLoading = false;
String? _errorMessage;
int _secondsLeft = 120; // 2 minutes
CommonResponse? get qrResponse => _qrResponse;
bool get isLoading => _isLoading;
String? get errorMessage => _errorMessage;
int get secondsLeft => _secondsLeft;
Timer? _timer;
/// Fetch Razorpay QR API
Future<void> fetchRazorpayQr({
required String sessionId,
required String empId,
required String amount,
required String refType,
required String refId,
}) async {
_isLoading = true;
_errorMessage = null;
notifyListeners();
try {
final response = await ApiCalling.fetchRazorpayUpiQrApi(
sessionId,
empId,
amount,
refType,
refId,
);
if (response != null && response.error == "0") {
_qrResponse = response;
_startTimer();
} else {
_errorMessage = response?.message ?? "Something went wrong";
}
} catch (e) {
_errorMessage = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
/// Start 2-minute countdown
void _startTimer() {
_secondsLeft = 120;
_timer?.cancel();
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (_secondsLeft > 0) {
_secondsLeft--;
notifyListeners();
} else {
timer.cancel();
}
});
}
/// Dispose timer properly
@override
void dispose() {
_timer?.cancel();
super.dispose();
}
bool _isPaymentUpdating = false;
bool get isPaymentUpdating => _isPaymentUpdating;
set isPaymentUpdating(bool value) {
_isPaymentUpdating = value;
notifyListeners();
}
/// Fetch Razorpay QR Payment Status
Future<CommonResponse?> fetchRazorpayUpiQrStatus({
required BuildContext context,
required String sessionId,
required String empId,
required String razorpayOrderId,
}) async {
try {
isPaymentUpdating = true;
final response = await ApiCalling.fetchRazorpayUpiQrStatusApi(
sessionId,
empId,
razorpayOrderId,
);
if (response != null) {
if (response.sessionExists == 1 && response.error == "0") {
debugPrint(" Payment Status: ${response.message}");
} else {
CustomSnackBar.showWarning(
context: context,
message: "⚠️ Payment not yet completed or failed"
);
debugPrint("⚠️ Payment not yet completed or failed");
}
} else {
debugPrint("❌ Null response from Razorpay QR Status API");
}
return response; // return here
} catch (e) {
debugPrint("❌ fetchRazorpayUpiQrStatus error: $e");
return null;
} finally {
isPaymentUpdating = false;
}
}
}
import 'package:flutter/material.dart';
import 'package:generp/services/api_calling.dart';
import '../../Models/financeModels/ValidateBankAccountDetailsResponse.dart';
import '../../Models/financeModels/ValidateGstNumResponse.dart';
class ValidationProvider extends ChangeNotifier {
bool isLoading = false;
ValidateGstNumResponse? gstResponse;
ValidateBankAccountDetailsResponse? bankResponse;
String? errorMessage;
/// Validate GST Number
/// -----------------------------
Future<void> validateGstNumber(
String empId, String sessionId, String gstNumber) async {
try {
isLoading = true;
errorMessage = null;
notifyListeners();
gstResponse = await ApiCalling.validateGstNumberApi(
empId,
sessionId,
gstNumber,
);
if (gstResponse == null) {
errorMessage = "Failed to validate GST number";
}
} catch (e) {
errorMessage = e.toString();
}
isLoading = false;
notifyListeners();
}
/// Validate Bank Account Details
/// -----------------------------
Future<void> validateBankDetails(
String empId, String sessionId, String accountNumber) async {
try {
isLoading = true;
errorMessage = null;
notifyListeners();
bankResponse = await ApiCalling.validateBankAccountDetailsApi(
empId,
sessionId,
accountNumber,
""
);
if (bankResponse == null) {
errorMessage = "Failed to validate bank account";
}
} catch (e) {
errorMessage = e.toString();
}
isLoading = false;
notifyListeners();
}
/// Reset before calling again
void clear() {
gstResponse = null;
bankResponse = null;
errorMessage = null;
notifyListeners();
}
}
...@@ -757,14 +757,17 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -757,14 +757,17 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
onChangeCompanyName(value) { // onChangeCompanyName(value) {
companynameError = ""; // companynameError = "";
// notifyListeners();
// }
onChangeContactPersonName(value) {
nameError = "";
notifyListeners(); notifyListeners();
} }
onChangeAlternatemobile(value) { onChangeAlternatemobile(value) {
AlternatemobileError = ""; AlternatemobileError = "";
notifyListeners(); notifyListeners();
...@@ -775,22 +778,22 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -775,22 +778,22 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
Future<void> onChangeContactPersonName(BuildContext context, String value) async { Future<void> onChangeCompanyName(BuildContext context, String value) async {
nameError = ""; companynameError = "";
if (value.isEmpty) { if (value.isEmpty) {
nameError = "Name cannot be empty"; companynameError = "Company Name cannot be empty";
} else if (value.length < 3) { } else if (value.length < 3) {
nameError = "Name must be at least 3 characters"; companynameError = "Company Name must be at least 3 characters";
} else { } else {
final exists = await checkAccountFieldExistence( final exists = await checkAccountFieldExistence(
context, context,
type: "name", type: "company",
typeValue: value, typeValue: value,
); );
if (!exists) { if (!exists) {
nameError = "Name already exists"; companynameError = "Company Name already exists";
} else { } else {
nameError = null; companynameError = null;
} }
} }
notifyListeners(); notifyListeners();
...@@ -997,7 +1000,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier { ...@@ -997,7 +1000,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
isValid = false; isValid = false;
} }
if(nameError == "Name already exists"){ if(companynameError == "Company Name already exists"){
isValid = false; isValid = false;
} }
......
...@@ -34,16 +34,26 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -34,16 +34,26 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
List<Teams> get teamsList => _teamsList; List<Teams> get teamsList => _teamsList;
List<Segments> get segmentsList => _segmentsList; List<Segments> get segmentsList => _segmentsList;
Teams? get selectedTeams => _selectedTeams;
Segments? get selectedSegments => _selectedSegments; // IMPORTANT: Return null if the selected object is not present in the current list.
// This prevents DropdownButton2 from receiving a value that is not part of items.
Teams? get selectedTeams {
if (_selectedTeams == null) return null;
if (!_teamsList.contains(_selectedTeams)) return null;
return _selectedTeams;
}
Segments? get selectedSegments {
if (_selectedSegments == null) return null;
if (!_segmentsList.contains(_selectedSegments)) return null;
return _selectedSegments;
}
AccountDetails get accountsDetails => _accountDetails; AccountDetails get accountsDetails => _accountDetails;
String? get selectedTeamId => _selectedTeamId; String? get selectedTeamId => _selectedTeamId;
String? get selectedTeamValue => _selectedTeamValue; String? get selectedTeamValue => _selectedTeamValue;
String? get selectedSegmentId => _selectedSegmentId; String? get selectedSegmentId => _selectedSegmentId;
String? get selectedSegmentValue => _selectedSegmentValue; String? get selectedSegmentValue => _selectedSegmentValue;
set isLoading(bool value) { set isLoading(bool value) {
...@@ -68,15 +78,25 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -68,15 +78,25 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
set selectedTeams(Teams? value) { set selectedTeams(Teams? value) {
_selectedTeams = value; _selectedTeams = value;
_selectedTeamId = value!.id!; if (value != null) {
_selectedTeamValue = value.name; _selectedTeamId = value.id;
_selectedTeamValue = value.name;
} else {
_selectedTeamId = null;
_selectedTeamValue = null;
}
notifyListeners(); notifyListeners();
} }
set selectedSegments(Segments? value) { set selectedSegments(Segments? value) {
_selectedSegments = value; _selectedSegments = value;
_selectedSegmentId = value!.id!; if (value != null) {
_selectedSegmentValue = value.name; _selectedSegmentId = value.id;
_selectedSegmentValue = value.name;
} else {
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
notifyListeners(); notifyListeners();
} }
...@@ -101,10 +121,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -101,10 +121,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
} }
Future<void> crmLeadDetailsEditAccountAPIFunction( Future<void> crmLeadDetailsEditAccountAPIFunction(
context, context,
leadID, leadID,
mode, mode,
) async { ) async {
try { try {
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false); var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsEditAccountViewAPI( final data = await ApiCalling.crmLeadDetailsEditAccountViewAPI(
...@@ -117,8 +137,21 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -117,8 +137,21 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
notifyListeners(); notifyListeners();
if (data != null) { if (data != null) {
if (data.error == "0") { if (data.error == "0") {
_teamsList = data.teams!; _teamsList = data.teams ?? [];
_accountDetails = data.accountDetails!; _accountDetails = data.accountDetails ?? AccountDetails();
// If current selected team/segment are not in the new lists, clear them
if (_selectedTeams != null && !_teamsList.contains(_selectedTeams)) {
_selectedTeams = null;
_selectedTeamId = null;
_selectedTeamValue = null;
}
if (_selectedSegments != null && !_segmentsList.contains(_selectedSegments)) {
_selectedSegments = null;
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
_isLoading = false; _isLoading = false;
notifyListeners(); notifyListeners();
} else { } else {
...@@ -136,10 +169,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -136,10 +169,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
} }
Future<void> crmLeadListSegmentOnTeamAPIFunction( Future<void> crmLeadListSegmentOnTeamAPIFunction(
context, context,
mode, mode,
teamID, teamID,
) async { ) async {
try { try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false); var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadListSegmentOnTeamAPI( final data = await ApiCalling.crmLeadListSegmentOnTeamAPI(
...@@ -149,23 +182,43 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -149,23 +182,43 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
); );
if (data != null) { if (data != null) {
if (data.error == "0") { if (data.error == "0") {
_segmentsList = data.segments!; _segmentsList = data.segments ?? [];
// clear selectedSegments if it's not part of new list
if (_selectedSegments != null && !_segmentsList.contains(_selectedSegments)) {
_selectedSegments = null;
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
notifyListeners(); notifyListeners();
} }
} }
} catch (e) {} } catch (e) {}
} }
// Fixed: check string emptiness properly (IDs are strings in your model)
bool get isFormValid {
final nameOk = editCompanyNameController.text.trim().isNotEmpty;
final teamOk = _selectedTeamId != null && _selectedTeamId!.isNotEmpty;
final segmentOk = _selectedSegmentId != null && _selectedSegmentId!.isNotEmpty;
return nameOk && teamOk && segmentOk;
}
Future<void> crmLeadDetailsEditAccountSubmitAPIFunction( Future<void> crmLeadDetailsEditAccountSubmitAPIFunction(
context, context,
accountId, accountId,
segmentId, segmentId,
teamId, teamId,
) async { ) async {
try { try {
if (!validateForm(context)) { if (!validateForm(context)) {
return; return;
} }
_isLoading = true;
notifyListeners();
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false); var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsEditAccountSubmitAPI( final data = await ApiCalling.crmLeadDetailsEditAccountSubmitAPI(
HomeProv.empId, HomeProv.empId,
...@@ -175,8 +228,7 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -175,8 +228,7 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
teamId, teamId,
editCompanyNameController.text, editCompanyNameController.text,
); );
_isLoading = true;
notifyListeners();
if (data != null) { if (data != null) {
if (data.error == "0") { if (data.error == "0") {
Navigator.pop(context, true); Navigator.pop(context, true);
...@@ -200,19 +252,24 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -200,19 +252,24 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
bool validateForm(BuildContext context) { bool validateForm(BuildContext context) {
// Reset all errors // Reset all errors
_companyNameError = null; _companyNameError = null;
_selectedTeamError = null;
_selectedSegmentError = null;
bool isValid = true; bool isValid = true;
if (_selectedTeams == null || _selectedTeamId!.isEmpty) { // Team checks
_selectedTeamError = "Please select an account"; if (_selectedTeams == null || _selectedTeamId == null || _selectedTeamId!.isEmpty) {
_selectedTeamError = "Please select a team";
isValid = false; isValid = false;
} }
if (_selectedSegments == null || _selectedSegmentId!.isEmpty) { // Segment checks
_selectedSegmentError = "Please select an account"; if (_selectedSegments == null || _selectedSegmentId == null || _selectedSegmentId!.isEmpty) {
_selectedSegmentError = "Please select a segment";
isValid = false; isValid = false;
} }
// Company name check
if (editCompanyNameController.text.trim().isEmpty) { if (editCompanyNameController.text.trim().isEmpty) {
_companyNameError = "Please enter Company name"; _companyNameError = "Please enter Company name";
isValid = false; isValid = false;
...@@ -223,7 +280,12 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -223,7 +280,12 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
} }
onChangedCompanyName(value) { onChangedCompanyName(value) {
_companyNameError = ""; // Clear the company name error when user types
if (value != null && value.toString().trim().isNotEmpty) {
_companyNameError = null;
} else {
_companyNameError = "Name is required";
}
notifyListeners(); notifyListeners();
} }
...@@ -236,11 +298,13 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier { ...@@ -236,11 +298,13 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
_selectedSegmentId = null; _selectedSegmentId = null;
_selectedTeamValue = null; _selectedTeamValue = null;
_selectedSegmentValue = null; _selectedSegmentValue = null;
_selectedTeamError = null;
_selectedSegmentError = null;
_companyNameError = null;
} }
void checkDropDownValues() { void checkDropDownValues() {
if (!_segmentsList.contains(_selectedSegments) && if (!_segmentsList.contains(_selectedSegments) && _selectedSegments != null) {
_selectedSegments != null) {
_selectedTeamId = null; _selectedTeamId = null;
_selectedTeamValue = null; _selectedTeamValue = null;
} }
......
...@@ -10,6 +10,7 @@ import 'package:flutter/services.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart'; import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
import 'package:generp/Models/hrmModels/leaveApplicationLIstResponse.dart'; import 'package:generp/Models/hrmModels/leaveApplicationLIstResponse.dart';
import 'package:generp/Notifiers/QrProvider.dart';
import 'package:generp/Utils/app_colors.dart'; import 'package:generp/Utils/app_colors.dart';
import 'package:generp/screens/AttendanceScreen.dart'; import 'package:generp/screens/AttendanceScreen.dart';
import 'package:generp/screens/HomeScreen.dart'; import 'package:generp/screens/HomeScreen.dart';
...@@ -426,6 +427,7 @@ class MyApp extends StatelessWidget { ...@@ -426,6 +427,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => AdvanceListProvider()), ChangeNotifierProvider(create: (_) => AdvanceListProvider()),
ChangeNotifierProvider(create: (_) => CasualLeaveHistoryProvider()), ChangeNotifierProvider(create: (_) => CasualLeaveHistoryProvider()),
ChangeNotifierProvider(create: (_) => ContactProvider()), ChangeNotifierProvider(create: (_) => ContactProvider()),
ChangeNotifierProvider(create: (_) => QrProvider()),
], ],
child: Builder( child: Builder(
......
This diff is collapsed.
...@@ -103,7 +103,7 @@ class _TransactiondetailsState extends State<Transactiondetails> { ...@@ -103,7 +103,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
), ),
), ),
), ),
SizedBox(width: 10), SizedBox(width: 8),
Expanded( Expanded(
flex: 3, flex: 3,
child: Container( child: Container(
...@@ -117,15 +117,15 @@ class _TransactiondetailsState extends State<Transactiondetails> { ...@@ -117,15 +117,15 @@ class _TransactiondetailsState extends State<Transactiondetails> {
), ),
child: Center( child: Center(
child: Text( child: Text(
"₹ ${details.amount ?? "-"}", " ${details.amount ?? "-"}",
maxLines: 2, maxLines: 2,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
fontFamily: "JakartaRegular", fontFamily: "JakartaRegular",
fontSize: 14, fontSize: 12.8,
color: color:
widget.type == "Credited" widget.type == "Credit"
? Color(0xFFEF3739) ? Color(0xFFEF3739)
: Color(0xFF0D9C00), : Color(0xFF0D9C00),
), ),
...@@ -359,6 +359,7 @@ class _TransactiondetailsState extends State<Transactiondetails> { ...@@ -359,6 +359,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
details details
.attachmentDirFilePath ?? .attachmentDirFilePath ??
"", "",
downloadEnable: false,
), ),
), ),
); );
......
...@@ -151,6 +151,11 @@ class _LeadlistbymodeState extends State<Leadlistbymode> { ...@@ -151,6 +151,11 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
InkResponse( InkResponse(
onTap: () async { onTap: () async {
HapticFeedback.selectionClick(); HapticFeedback.selectionClick();
final provider = Provider.of<Leadlistprovider>(context, listen: false);
// If lists are empty, fetch required data first (this will populate sources, teams, states, employees)
if (provider.sourcesList.isEmpty || provider.teamsList.isEmpty || provider.employeesList.isEmpty) {
await provider.crmLeadListViewAPIFunction(context, widget.mode);
}
_showFilterSheetNew(context); _showFilterSheetNew(context);
}, },
child: SvgPicture.asset( child: SvgPicture.asset(
...@@ -158,6 +163,7 @@ class _LeadlistbymodeState extends State<Leadlistbymode> { ...@@ -158,6 +163,7 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
height: 25, height: 25,
), ),
), ),
], ],
), ),
0xFFFFFFFF, 0xFFFFFFFF,
...@@ -206,7 +212,36 @@ class _LeadlistbymodeState extends State<Leadlistbymode> { ...@@ -206,7 +212,36 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
provider.crmLeadList[index].leadid, provider.crmLeadList[index].leadid,
), ),
), ),
); ).then((_) async {
final provider = Provider.of<Leadlistprovider>(context, listen: false);
provider.resetPagination();
if (widget.filter != null) {
provider.crmLeadListAPIFunction(
context,
widget.mode,
widget.filter!.status,
widget.filter!.openStatus,
"",
"",
"",
"",
"",
);
} else {
provider.crmLeadListAPIFunction(
context,
widget.mode,
"",
"",
"",
"",
"",
"",
"",
);
}
});
}, },
child: Container( child: Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
......
...@@ -291,7 +291,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -291,7 +291,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
provider.companyNameController, provider.companyNameController,
"Company Name", "Company Name",
"Enter Company Name", "Enter Company Name",
provider.onChangeCompanyName, (value) => provider.onChangeCompanyName(context, value),
TextInputType.name, TextInputType.name,
false, false,
null, null,
...@@ -301,21 +301,34 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -301,21 +301,34 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
), ),
errorWidget(context, provider.companynameError), errorWidget(context, provider.companynameError),
textControllerWidget( // textControllerWidget(
context, // context,
provider.contactPersonNameController, // provider.contactPersonNameController,
"Contact Person Name", // "Contact Person Name",
"Enter Name", // "Enter Name",
(value) => provider.onChangeContactPersonName(context, value), //
TextInputType.name, // TextInputType.name,
false, // false,
null, // null,
focusNodes[1], // focusNodes[1],
focusNodes[2], // focusNodes[2],
TextInputAction.next, // TextInputAction.next,
), // ),
errorWidget(context, provider.nameError), textControllerWidget(
context,
provider.contactPersonNameController,
"Contact Person Name",
"Enter Name",
provider.onChangeContactPersonName,
TextInputType.name,
false,
null,
focusNodes[1],
focusNodes[2],
TextInputAction.next
),
errorWidget(context, provider.nameError),
textControllerWidget( textControllerWidget(
context, context,
...@@ -980,7 +993,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -980,7 +993,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
), ),
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: 10, horizontal: 10,
vertical: 8, vertical: 6,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color(0xFFE6F6FF), color: Color(0xFFE6F6FF),
...@@ -1040,7 +1053,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -1040,7 +1053,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
color: AppColors.grey_semi, color: AppColors.grey_semi,
), ),
), ),
SizedBox(height: 5), SizedBox(height: 2),
DottedLine( DottedLine(
dashGapLength: 4, dashGapLength: 4,
dashGapColor: Colors.white, dashGapColor: Colors.white,
...@@ -1048,7 +1061,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -1048,7 +1061,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
dashLength: 2, dashLength: 2,
lineThickness: 0.5, lineThickness: 0.5,
), ),
SizedBox(height: 5), SizedBox(height: 2),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
...@@ -1062,7 +1075,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> { ...@@ -1062,7 +1075,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
), ),
], ],
), ),
SizedBox(height: 5), SizedBox(height: 2),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
......
...@@ -16,6 +16,7 @@ import 'package:generp/screens/crm/universalSearchScreen.dart'; ...@@ -16,6 +16,7 @@ import 'package:generp/screens/crm/universalSearchScreen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:generp/screens/screensExports.dart'; import 'package:generp/screens/screensExports.dart';
import '../../Notifiers/crmProvider/LeadListProvider.dart';
import '../../Notifiers/crmProvider/crmDashboardProvider.dart'; import '../../Notifiers/crmProvider/crmDashboardProvider.dart';
import '../../Utils/app_colors.dart'; import '../../Utils/app_colors.dart';
import '../../Utils/commonServices.dart'; import '../../Utils/commonServices.dart';
...@@ -272,19 +273,48 @@ class _CrmdashboardScreenState extends State<CrmdashboardScreen> { ...@@ -272,19 +273,48 @@ class _CrmdashboardScreenState extends State<CrmdashboardScreen> {
await Navigator.push( await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: builder: (context) => Leadlistbymode(
(context) => Leadlistbymode( pageTitleName: leadTitles[jndex],
pageTitleName: leadTitles[jndex], mode: provider.allLeads[jndex].filter!.mode,
mode: filter: provider.allLeads[jndex].filter!,
provider ),
.allLeads[jndex]
.filter!
.mode,
filter:
provider.allLeads[jndex].filter!,
),
), ),
); ).then((_) async {
// get the Leadlistprovider and reset filters + reload list
final leadProv = Provider.of<Leadlistprovider>(context, listen: false);
// Clear selected filters
leadProv.resetForm();
// Reset pagination and reload the list (same as your existing pattern)
leadProv.resetPagination();
if (provider.allLeads[jndex].filter != null) {
leadProv.crmLeadListAPIFunction(
context,
provider.allLeads[jndex].filter!.mode,
provider.allLeads[jndex].filter!.status,
provider.allLeads[jndex].filter!.openStatus,
"",
"",
"",
"",
"",
);
} else {
leadProv.crmLeadListAPIFunction(
context,
provider.allLeads[jndex].filter!.mode,
"",
"",
"",
"",
"",
"",
"",
);
}
});
} }
} }
if (leadTitles[jndex] == "Pending Tasks") { if (leadTitles[jndex] == "Pending Tasks") {
......
...@@ -179,49 +179,45 @@ class _EditAccountDetailsState extends State<EditAccountDetails> { ...@@ -179,49 +179,45 @@ class _EditAccountDetailsState extends State<EditAccountDetails> {
), ),
), ),
SizedBox(height: 25), SizedBox(height: 25),
InkWell( // Use ElevatedButton so we can easily disable it when invalid or loading
onTap: SizedBox(
provider.isLoading width: double.infinity,
? null child: ElevatedButton(
: () { onPressed: (provider.isLoading || !provider.isFormValid)
provider.isLoading = true; ? null
provider : () {
.crmLeadDetailsEditAccountSubmitAPIFunction( // DO NOT set provider.isLoading here — provider will manage it.
context, provider.crmLeadDetailsEditAccountSubmitAPIFunction(
widget.accountID, context,
provider.selectedSegmentId, widget.accountID,
provider.selectedTeamId, provider.selectedSegmentId,
); provider.selectedTeamId,
}, );
child: Container( },
alignment: Alignment.center, style: ElevatedButton.styleFrom(
height: 45, padding: EdgeInsets.symmetric(vertical: 12.0),
margin: EdgeInsets.only( shape: RoundedRectangleBorder(
left: 5.0, borderRadius: BorderRadius.circular(14.0),
right: 5.0, ),
top: 5.0, backgroundColor: AppColors.app_blue,
bottom: 5.0, disabledBackgroundColor: AppColors.app_blue.withOpacity(0.5),
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(14.0),
), ),
child: Center( child: provider.isLoading
child: ? SizedBox(
provider.isLoading height: 20,
? CircularProgressIndicator.adaptive( width: 20,
valueColor: AlwaysStoppedAnimation( child: CircularProgressIndicator.adaptive(
AppColors.white, valueColor: AlwaysStoppedAnimation(Colors.white),
), strokeWidth: 2,
) ),
: Text( )
"Submit", : Text(
textAlign: TextAlign.center, "Submit",
style: TextStyle(color: Colors.white), style: TextStyle(color: Colors.white),
),
), ),
), ),
), ),
], ],
), ),
), ),
......
This diff is collapsed.
...@@ -350,6 +350,7 @@ class _PaymentrequestionlistdetailsState ...@@ -350,6 +350,7 @@ class _PaymentrequestionlistdetailsState
reqDet reqDet
.attachmentDirFilePath ?? .attachmentDirFilePath ??
"", "",
downloadEnable: true,
), ),
), ),
); );
...@@ -920,7 +921,7 @@ class _PaymentrequestionlistdetailsState ...@@ -920,7 +921,7 @@ class _PaymentrequestionlistdetailsState
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontSize: 14, fontSize: 13,
color: getTextColor(reqDet.status), color: getTextColor(reqDet.status),
), ),
), ),
...@@ -1011,6 +1012,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1011,6 +1012,7 @@ class _PaymentrequestionlistdetailsState
reqDet reqDet
.attachmentDirFilePath ?? .attachmentDirFilePath ??
"", "",
downloadEnable: true,
), ),
), ),
); );
...@@ -1092,11 +1094,11 @@ class _PaymentrequestionlistdetailsState ...@@ -1092,11 +1094,11 @@ class _PaymentrequestionlistdetailsState
decoration: BoxDecoration(color: Colors.white), decoration: BoxDecoration(color: Colors.white),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10), padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
height: 80, height: 78,
child: Container( child: Container(
margin: EdgeInsets.only(bottom: 10), margin: EdgeInsets.only(bottom: 10),
alignment: Alignment.center, alignment: Alignment.center,
height: 45, height: 42,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
...@@ -1131,7 +1133,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1131,7 +1133,7 @@ class _PaymentrequestionlistdetailsState
"Reject", "Reject",
style: TextStyle( style: TextStyle(
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: 14, fontSize: 12,
), ),
), ),
), ),
...@@ -1140,7 +1142,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1140,7 +1142,7 @@ class _PaymentrequestionlistdetailsState
), ),
), ),
), ),
SizedBox(width: 6), SizedBox(width: 4),
if ([ if ([
"apr_lvl1", "apr_lvl1",
...@@ -1150,7 +1152,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1150,7 +1152,7 @@ class _PaymentrequestionlistdetailsState
SvgPicture.asset( SvgPicture.asset(
"assets/svg/crm/vertical_line_ic.svg", "assets/svg/crm/vertical_line_ic.svg",
), ),
SizedBox(width: 6), SizedBox(width: 4),
Expanded( Expanded(
child: InkResponse( child: InkResponse(
onTap: () { onTap: () {
...@@ -1186,7 +1188,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1186,7 +1188,7 @@ class _PaymentrequestionlistdetailsState
"Approve", "Approve",
style: TextStyle( style: TextStyle(
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: 14, fontSize: 12,
), ),
), ),
), ),
...@@ -1195,12 +1197,12 @@ class _PaymentrequestionlistdetailsState ...@@ -1195,12 +1197,12 @@ class _PaymentrequestionlistdetailsState
), ),
), ),
), ),
SizedBox(width: 6), SizedBox(width: 4),
] else if (widget.mode == "process") ...[ ] else if (widget.mode == "process") ...[
SvgPicture.asset( SvgPicture.asset(
"assets/svg/crm/vertical_line_ic.svg", "assets/svg/crm/vertical_line_ic.svg",
), ),
SizedBox(width: 6), SizedBox(width: 5),
Expanded( Expanded(
child: InkResponse( child: InkResponse(
onTap: () { onTap: () {
...@@ -1231,13 +1233,13 @@ class _PaymentrequestionlistdetailsState ...@@ -1231,13 +1233,13 @@ class _PaymentrequestionlistdetailsState
SvgPicture.asset( SvgPicture.asset(
"assets/svg/finance/level_add_payment_ic.svg", "assets/svg/finance/level_add_payment_ic.svg",
), ),
SizedBox(width: 5), SizedBox(width: 2),
Center( Center(
child: Text( child: Text(
"Add Payment", "Add Payment",
style: TextStyle( style: TextStyle(
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: 14, fontSize: 12,
), ),
), ),
), ),
...@@ -1280,7 +1282,7 @@ class _PaymentrequestionlistdetailsState ...@@ -1280,7 +1282,7 @@ class _PaymentrequestionlistdetailsState
"Edit Amount", "Edit Amount",
style: TextStyle( style: TextStyle(
color: AppColors.semi_black, color: AppColors.semi_black,
fontSize: 14, fontSize: 12,
), ),
), ),
), ),
......
...@@ -487,11 +487,11 @@ class _FinancedashboardState extends State<Financedashboard> { ...@@ -487,11 +487,11 @@ class _FinancedashboardState extends State<Financedashboard> {
}, },
child: Container( child: Container(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
vertical: 5, vertical: 4.6,
horizontal: 15, horizontal: 15,
), ),
margin: EdgeInsets.symmetric( margin: EdgeInsets.symmetric(
vertical: 7, vertical: 5,
horizontal: 5, horizontal: 5,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment