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 {
String? error;
String? message;
String? qrCode;
String? qrId;
int? sessionExists;
CommonResponse({this.error, this.message, this.sessionExists});
CommonResponse.fromJson(Map<String, dynamic> json) {
error = json['error'];
qrCode = json['qr_code'];
qrId = json['razorpay_order_id'];
message = json['message'];
sessionExists = json['session_exists'];
}
......@@ -15,6 +18,8 @@ class CommonResponse {
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['error'] = error;
data['qr_code'] = qrCode;
data['razorpay_order_id'] = qrId;
data['message'] = message;
data['session_exists'] = sessionExists;
return data;
......
......@@ -208,6 +208,7 @@ class Paymentdetailsprovider extends ChangeNotifier {
_imageName = null;
_image_picked = 0;
resetErrors();
notifyListeners();
} else {}
} else {
......@@ -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() {
Amountcontroller.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 {
notifyListeners();
}
onChangeCompanyName(value) {
companynameError = "";
// onChangeCompanyName(value) {
// companynameError = "";
// notifyListeners();
// }
onChangeContactPersonName(value) {
nameError = "";
notifyListeners();
}
onChangeAlternatemobile(value) {
AlternatemobileError = "";
notifyListeners();
......@@ -775,22 +778,22 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
notifyListeners();
}
Future<void> onChangeContactPersonName(BuildContext context, String value) async {
nameError = "";
Future<void> onChangeCompanyName(BuildContext context, String value) async {
companynameError = "";
if (value.isEmpty) {
nameError = "Name cannot be empty";
companynameError = "Company Name cannot be empty";
} else if (value.length < 3) {
nameError = "Name must be at least 3 characters";
companynameError = "Company Name must be at least 3 characters";
} else {
final exists = await checkAccountFieldExistence(
context,
type: "name",
type: "company",
typeValue: value,
);
if (!exists) {
nameError = "Name already exists";
companynameError = "Company Name already exists";
} else {
nameError = null;
companynameError = null;
}
}
notifyListeners();
......@@ -997,7 +1000,7 @@ class Addnewleadsandprospectsprovider extends ChangeNotifier {
isValid = false;
}
if(nameError == "Name already exists"){
if(companynameError == "Company Name already exists"){
isValid = false;
}
......
......@@ -34,16 +34,26 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
List<Teams> get teamsList => _teamsList;
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;
String? get selectedTeamId => _selectedTeamId;
String? get selectedTeamValue => _selectedTeamValue;
String? get selectedSegmentId => _selectedSegmentId;
String? get selectedSegmentValue => _selectedSegmentValue;
set isLoading(bool value) {
......@@ -68,15 +78,25 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
set selectedTeams(Teams? value) {
_selectedTeams = value;
_selectedTeamId = value!.id!;
_selectedTeamValue = value.name;
if (value != null) {
_selectedTeamId = value.id;
_selectedTeamValue = value.name;
} else {
_selectedTeamId = null;
_selectedTeamValue = null;
}
notifyListeners();
}
set selectedSegments(Segments? value) {
_selectedSegments = value;
_selectedSegmentId = value!.id!;
_selectedSegmentValue = value.name;
if (value != null) {
_selectedSegmentId = value.id;
_selectedSegmentValue = value.name;
} else {
_selectedSegmentId = null;
_selectedSegmentValue = null;
}
notifyListeners();
}
......@@ -101,10 +121,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
}
Future<void> crmLeadDetailsEditAccountAPIFunction(
context,
leadID,
mode,
) async {
context,
leadID,
mode,
) async {
try {
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsEditAccountViewAPI(
......@@ -117,8 +137,21 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
notifyListeners();
if (data != null) {
if (data.error == "0") {
_teamsList = data.teams!;
_accountDetails = data.accountDetails!;
_teamsList = data.teams ?? [];
_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;
notifyListeners();
} else {
......@@ -136,10 +169,10 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
}
Future<void> crmLeadListSegmentOnTeamAPIFunction(
context,
mode,
teamID,
) async {
context,
mode,
teamID,
) async {
try {
var prov = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadListSegmentOnTeamAPI(
......@@ -149,23 +182,43 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
);
if (data != null) {
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();
}
}
} 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(
context,
accountId,
segmentId,
teamId,
) async {
context,
accountId,
segmentId,
teamId,
) async {
try {
if (!validateForm(context)) {
return;
}
_isLoading = true;
notifyListeners();
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmLeadDetailsEditAccountSubmitAPI(
HomeProv.empId,
......@@ -175,8 +228,7 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
teamId,
editCompanyNameController.text,
);
_isLoading = true;
notifyListeners();
if (data != null) {
if (data.error == "0") {
Navigator.pop(context, true);
......@@ -200,19 +252,24 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
bool validateForm(BuildContext context) {
// Reset all errors
_companyNameError = null;
_selectedTeamError = null;
_selectedSegmentError = null;
bool isValid = true;
if (_selectedTeams == null || _selectedTeamId!.isEmpty) {
_selectedTeamError = "Please select an account";
// Team checks
if (_selectedTeams == null || _selectedTeamId == null || _selectedTeamId!.isEmpty) {
_selectedTeamError = "Please select a team";
isValid = false;
}
if (_selectedSegments == null || _selectedSegmentId!.isEmpty) {
_selectedSegmentError = "Please select an account";
// Segment checks
if (_selectedSegments == null || _selectedSegmentId == null || _selectedSegmentId!.isEmpty) {
_selectedSegmentError = "Please select a segment";
isValid = false;
}
// Company name check
if (editCompanyNameController.text.trim().isEmpty) {
_companyNameError = "Please enter Company name";
isValid = false;
......@@ -223,7 +280,12 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
}
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();
}
......@@ -236,11 +298,13 @@ class Editcrmaccountdetailsprovider extends ChangeNotifier {
_selectedSegmentId = null;
_selectedTeamValue = null;
_selectedSegmentValue = null;
_selectedTeamError = null;
_selectedSegmentError = null;
_companyNameError = null;
}
void checkDropDownValues() {
if (!_segmentsList.contains(_selectedSegments) &&
_selectedSegments != null) {
if (!_segmentsList.contains(_selectedSegments) && _selectedSegments != null) {
_selectedTeamId = null;
_selectedTeamValue = null;
}
......
......@@ -10,6 +10,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
import 'package:generp/Models/hrmModels/leaveApplicationLIstResponse.dart';
import 'package:generp/Notifiers/QrProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/screens/AttendanceScreen.dart';
import 'package:generp/screens/HomeScreen.dart';
......@@ -426,6 +427,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => AdvanceListProvider()),
ChangeNotifierProvider(create: (_) => CasualLeaveHistoryProvider()),
ChangeNotifierProvider(create: (_) => ContactProvider()),
ChangeNotifierProvider(create: (_) => QrProvider()),
],
child: Builder(
......
This diff is collapsed.
......@@ -103,7 +103,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
),
),
),
SizedBox(width: 10),
SizedBox(width: 8),
Expanded(
flex: 3,
child: Container(
......@@ -117,15 +117,15 @@ class _TransactiondetailsState extends State<Transactiondetails> {
),
child: Center(
child: Text(
"₹ ${details.amount ?? "-"}",
" ${details.amount ?? "-"}",
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontFamily: "JakartaRegular",
fontSize: 14,
fontSize: 12.8,
color:
widget.type == "Credited"
widget.type == "Credit"
? Color(0xFFEF3739)
: Color(0xFF0D9C00),
),
......@@ -359,6 +359,7 @@ class _TransactiondetailsState extends State<Transactiondetails> {
details
.attachmentDirFilePath ??
"",
downloadEnable: false,
),
),
);
......
......@@ -151,6 +151,11 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
InkResponse(
onTap: () async {
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);
},
child: SvgPicture.asset(
......@@ -158,6 +163,7 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
height: 25,
),
),
],
),
0xFFFFFFFF,
......@@ -206,7 +212,36 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
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(
padding: EdgeInsets.symmetric(
......
......@@ -291,7 +291,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
provider.companyNameController,
"Company Name",
"Enter Company Name",
provider.onChangeCompanyName,
(value) => provider.onChangeCompanyName(context, value),
TextInputType.name,
false,
null,
......@@ -301,21 +301,34 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
),
errorWidget(context, provider.companynameError),
textControllerWidget(
context,
provider.contactPersonNameController,
"Contact Person Name",
"Enter Name",
(value) => provider.onChangeContactPersonName(context, value),
TextInputType.name,
false,
null,
focusNodes[1],
focusNodes[2],
TextInputAction.next,
),
// textControllerWidget(
// context,
// provider.contactPersonNameController,
// "Contact Person Name",
// "Enter Name",
//
// TextInputType.name,
// false,
// null,
// focusNodes[1],
// focusNodes[2],
// 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(
context,
......@@ -980,7 +993,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
),
padding: EdgeInsets.symmetric(
horizontal: 10,
vertical: 8,
vertical: 6,
),
decoration: BoxDecoration(
color: Color(0xFFE6F6FF),
......@@ -1040,7 +1053,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
color: AppColors.grey_semi,
),
),
SizedBox(height: 5),
SizedBox(height: 2),
DottedLine(
dashGapLength: 4,
dashGapColor: Colors.white,
......@@ -1048,7 +1061,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
dashLength: 2,
lineThickness: 0.5,
),
SizedBox(height: 5),
SizedBox(height: 2),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
......@@ -1062,7 +1075,7 @@ class _AddleadsprospectsscreenState extends State<Addleadsprospectsscreen> {
),
],
),
SizedBox(height: 5),
SizedBox(height: 2),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
......
......@@ -16,6 +16,7 @@ import 'package:generp/screens/crm/universalSearchScreen.dart';
import 'package:provider/provider.dart';
import 'package:generp/screens/screensExports.dart';
import '../../Notifiers/crmProvider/LeadListProvider.dart';
import '../../Notifiers/crmProvider/crmDashboardProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonServices.dart';
......@@ -272,19 +273,48 @@ class _CrmdashboardScreenState extends State<CrmdashboardScreen> {
await Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => Leadlistbymode(
pageTitleName: leadTitles[jndex],
mode:
provider
.allLeads[jndex]
.filter!
.mode,
filter:
provider.allLeads[jndex].filter!,
),
builder: (context) => Leadlistbymode(
pageTitleName: leadTitles[jndex],
mode: 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") {
......
......@@ -179,49 +179,45 @@ class _EditAccountDetailsState extends State<EditAccountDetails> {
),
),
SizedBox(height: 25),
InkWell(
onTap:
provider.isLoading
? null
: () {
provider.isLoading = true;
provider
.crmLeadDetailsEditAccountSubmitAPIFunction(
context,
widget.accountID,
provider.selectedSegmentId,
provider.selectedTeamId,
);
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 5.0,
right: 5.0,
top: 5.0,
bottom: 5.0,
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(14.0),
// Use ElevatedButton so we can easily disable it when invalid or loading
SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: (provider.isLoading || !provider.isFormValid)
? null
: () {
// DO NOT set provider.isLoading here — provider will manage it.
provider.crmLeadDetailsEditAccountSubmitAPIFunction(
context,
widget.accountID,
provider.selectedSegmentId,
provider.selectedTeamId,
);
},
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 12.0),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14.0),
),
backgroundColor: AppColors.app_blue,
disabledBackgroundColor: AppColors.app_blue.withOpacity(0.5),
),
child: Center(
child:
provider.isLoading
? CircularProgressIndicator.adaptive(
valueColor: AlwaysStoppedAnimation(
AppColors.white,
),
)
: Text(
"Submit",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
child: provider.isLoading
? SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator.adaptive(
valueColor: AlwaysStoppedAnimation(Colors.white),
strokeWidth: 2,
),
)
: Text(
"Submit",
style: TextStyle(color: Colors.white),
),
),
),
],
),
),
......
This diff is collapsed.
......@@ -350,6 +350,7 @@ class _PaymentrequestionlistdetailsState
reqDet
.attachmentDirFilePath ??
"",
downloadEnable: true,
),
),
);
......@@ -920,7 +921,7 @@ class _PaymentrequestionlistdetailsState
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
fontSize: 13,
color: getTextColor(reqDet.status),
),
),
......@@ -1011,6 +1012,7 @@ class _PaymentrequestionlistdetailsState
reqDet
.attachmentDirFilePath ??
"",
downloadEnable: true,
),
),
);
......@@ -1092,11 +1094,11 @@ class _PaymentrequestionlistdetailsState
decoration: BoxDecoration(color: Colors.white),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
alignment: Alignment.bottomCenter,
height: 80,
height: 78,
child: Container(
margin: EdgeInsets.only(bottom: 10),
alignment: Alignment.center,
height: 45,
height: 42,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
......@@ -1131,7 +1133,7 @@ class _PaymentrequestionlistdetailsState
"Reject",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 14,
fontSize: 12,
),
),
),
......@@ -1140,7 +1142,7 @@ class _PaymentrequestionlistdetailsState
),
),
),
SizedBox(width: 6),
SizedBox(width: 4),
if ([
"apr_lvl1",
......@@ -1150,7 +1152,7 @@ class _PaymentrequestionlistdetailsState
SvgPicture.asset(
"assets/svg/crm/vertical_line_ic.svg",
),
SizedBox(width: 6),
SizedBox(width: 4),
Expanded(
child: InkResponse(
onTap: () {
......@@ -1186,7 +1188,7 @@ class _PaymentrequestionlistdetailsState
"Approve",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 14,
fontSize: 12,
),
),
),
......@@ -1195,12 +1197,12 @@ class _PaymentrequestionlistdetailsState
),
),
),
SizedBox(width: 6),
SizedBox(width: 4),
] else if (widget.mode == "process") ...[
SvgPicture.asset(
"assets/svg/crm/vertical_line_ic.svg",
),
SizedBox(width: 6),
SizedBox(width: 5),
Expanded(
child: InkResponse(
onTap: () {
......@@ -1231,13 +1233,13 @@ class _PaymentrequestionlistdetailsState
SvgPicture.asset(
"assets/svg/finance/level_add_payment_ic.svg",
),
SizedBox(width: 5),
SizedBox(width: 2),
Center(
child: Text(
"Add Payment",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 14,
fontSize: 12,
),
),
),
......@@ -1280,7 +1282,7 @@ class _PaymentrequestionlistdetailsState
"Edit Amount",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 14,
fontSize: 12,
),
),
),
......
......@@ -487,11 +487,11 @@ class _FinancedashboardState extends State<Financedashboard> {
},
child: Container(
padding: EdgeInsets.symmetric(
vertical: 5,
vertical: 4.6,
horizontal: 15,
),
margin: EdgeInsets.symmetric(
vertical: 7,
vertical: 5,
horizontal: 5,
),
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