3824 lines
220 KiB
Dart
3824 lines
220 KiB
Dart
import 'dart:convert';
|
||
|
||
import 'package:dropdown_search/dropdown_search.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:google_fonts/google_fonts.dart';
|
||
import 'package:http/http.dart' as http;
|
||
|
||
import '../../config/apiUrl.dart';
|
||
import '../../services/apiService.dart';
|
||
import '../../utils/auth_utils.dart';
|
||
import '../../widgets/custom_text_field.dart';
|
||
import '../../widgets/custom_user_form.dart';
|
||
|
||
class PolicyCriteria extends StatefulWidget {
|
||
bool isDesktop;
|
||
String selectedService;
|
||
final ValueNotifier<String> selectedTabNotifier;
|
||
final ValueNotifier<String> selectedIdNotifier;
|
||
String? userId;
|
||
bool isClass = true;
|
||
bool isCost = true;
|
||
final List<int> serviceDBValueList;
|
||
|
||
final Function(List<Map<String, dynamic>>?) onPolicyDataChanged;
|
||
|
||
PolicyCriteria({
|
||
super.key,
|
||
required this.isDesktop,
|
||
required this.selectedService,
|
||
required this.selectedTabNotifier,
|
||
required this.selectedIdNotifier,
|
||
required this.userId,
|
||
required this.isClass,
|
||
required this.isCost,
|
||
required this.onPolicyDataChanged,
|
||
required this.serviceDBValueList,
|
||
});
|
||
@override
|
||
PolicyCriteriaState createState() => PolicyCriteriaState();
|
||
}
|
||
|
||
class PolicyCriteriaState extends State<PolicyCriteria> {
|
||
String? ServiceId; // = "1";
|
||
String? ServiceIndxId = "1";
|
||
|
||
String? orgId;
|
||
String? userId;
|
||
|
||
Map<String, dynamic>? apiDataForClass;
|
||
bool isLoading = true;
|
||
|
||
// final TextEditingController _costController = TextEditingController();
|
||
// final TextEditingController _classController = TextEditingController();
|
||
// String? FirstApproverAction;
|
||
// String? SecondApproverAction;
|
||
// String? ThirdApproverAction;
|
||
// String? SelectedParallelProcess = "3";
|
||
|
||
final ApiService apiService = ApiService();
|
||
|
||
Map<String, TextEditingController> costController = {};
|
||
// Map<String, TextEditingController> classController = {};
|
||
Map<String, String?> classAction = {};
|
||
Map<String, String?> FirstApproverAction = {};
|
||
Map<String, String?> SecondApproverAction = {};
|
||
Map<String, String?> ThirdApproverAction = {};
|
||
Map<String, String?> SelectedParallelProcess = {};
|
||
|
||
Map<String, String?> FirstExceptionalApproverAction = {};
|
||
Map<String, String?> SecondExceptionalApproverAction = {};
|
||
Map<String, String?> ThirdExceptionalApproverAction = {};
|
||
Map<String, String?> FourthExceptionalApproverAction = {};
|
||
Map<String, String?> SelectedParallelExceptionalProcess = {};
|
||
|
||
Map<String, String?> FirstAmendApproverAction = {};
|
||
Map<String, String?> SecondAmendApproverAction = {};
|
||
Map<String, String?> ThirdAmendApproverAction = {};
|
||
Map<String, String?> FourthAmendApproverAction = {};
|
||
Map<String, String?> SelectedParallelAmendProcess = {};
|
||
Map<String, String> policyDetailsIdMap = {}; // new
|
||
Map<String, String> policyIdMap = {}; // new
|
||
|
||
Map<String, String> validationErrors = {};
|
||
|
||
// bool isClass = true;
|
||
// bool isCost = true;
|
||
|
||
List<Map<String, dynamic>>? policyData = [];
|
||
|
||
// Map<String, dynamic> get policyServices {
|
||
// Map<String, dynamic> data = {
|
||
// "service_id": ServiceId,
|
||
// "cost": costController[ServiceId]?.text,
|
||
// "class": classController[ServiceId]?.text,
|
||
// "a1_action": FirstApproverAction[ServiceId],
|
||
// "a2_action": SecondApproverAction[ServiceId],
|
||
// "a3_action": ThirdApproverAction[ServiceId],
|
||
// "parallel_process_from": SelectedParallelProcess[ServiceId],
|
||
// "created_by": widget.userId
|
||
// };
|
||
// return data;
|
||
// }
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
fetchTrainFlightClass();
|
||
|
||
print("whole value here - ${widget.serviceDBValueList}");
|
||
print(widget.serviceDBValueList);
|
||
|
||
fieldForPolicy();
|
||
|
||
widget.selectedIdNotifier.addListener(() {
|
||
setState(() {
|
||
ServiceId = widget.selectedIdNotifier.value ?? "1";
|
||
print("new :) ${widget.selectedIdNotifier.value}");
|
||
print("ServiceIndxId changed: $ServiceId");
|
||
});
|
||
});
|
||
widget.selectedTabNotifier.addListener(() {
|
||
print("selectedTab changed: ${widget.selectedTabNotifier.value}");
|
||
setState(() {
|
||
ServiceIndxId = widget.selectedTabNotifier.value ?? "1";
|
||
// ServiceId = widget.selectedIdNotifier.value ?? "1";
|
||
print("ServiceIndxId changed: $ServiceIndxId");
|
||
});
|
||
|
||
fieldForPolicy();
|
||
// fetchTrainFlightClass(); // old here
|
||
});
|
||
}
|
||
|
||
void loadinitializeData() async {
|
||
orgId = await getOrgId();
|
||
userId = await getUserId();
|
||
}
|
||
|
||
// void saveCurrentPolicy(List<Map<String, dynamic>> services) {
|
||
// print("saveCurrentPolicy- $services");
|
||
// if (ServiceId != null) {
|
||
// print("Saving curremt Add or Update");
|
||
// addOrUpdatePolicy(ServiceId!);
|
||
// }
|
||
// }
|
||
|
||
void saveCurrentPolicy(List<Map<String, dynamic>> services) {
|
||
print("saveCurrentPolicy- $services");
|
||
|
||
// Step 1: Save currently selected policy first (if not already saved)
|
||
if (ServiceId != null) {
|
||
print("Saving current Add or Update");
|
||
addOrUpdatePolicy(ServiceId!);
|
||
}
|
||
|
||
// Step 2: Collect existing service_ids from policyData
|
||
final existingServiceIds =
|
||
policyData?.map((e) => e['service_id'].toString()).toSet();
|
||
|
||
// Step 3: Loop through all service definitions
|
||
for (var service in services) {
|
||
String id = service['service_id'].toString();
|
||
print("164 service == $id");
|
||
|
||
// Skip if already present
|
||
if (existingServiceIds!.contains(id)) continue;
|
||
|
||
// Step 4: Initialize any missing controllers or data
|
||
costController.putIfAbsent(id, () => TextEditingController());
|
||
classAction.putIfAbsent(id, () => "1"); // working fine
|
||
FirstApproverAction.putIfAbsent(id, () => "None");
|
||
SecondApproverAction.putIfAbsent(id, () => "None");
|
||
ThirdApproverAction.putIfAbsent(id, () => "None");
|
||
// SelectedParallelProcess.putIfAbsent(id, () => "0");
|
||
SelectedParallelProcess.putIfAbsent(id, () => "3");
|
||
|
||
FirstExceptionalApproverAction.putIfAbsent(id, () => "None");
|
||
SecondExceptionalApproverAction.putIfAbsent(id, () => "None");
|
||
ThirdExceptionalApproverAction.putIfAbsent(id, () => "None");
|
||
FourthExceptionalApproverAction.putIfAbsent(id, () => "None");
|
||
// SelectedParallelExceptionalProcess.putIfAbsent(id, () => "0");
|
||
SelectedParallelExceptionalProcess.putIfAbsent(id, () => "4");
|
||
|
||
FirstAmendApproverAction.putIfAbsent(id, () => "None");
|
||
SecondAmendApproverAction.putIfAbsent(id, () => "None");
|
||
ThirdAmendApproverAction.putIfAbsent(id, () => "None");
|
||
FourthAmendApproverAction.putIfAbsent(id, () => "None");
|
||
// SelectedParallelAmendProcess.putIfAbsent(id, () => "0");
|
||
SelectedParallelAmendProcess.putIfAbsent(id, () => "4");
|
||
|
||
// Step 5: Add default policy entry
|
||
policyData?.add({
|
||
"service_id": int.parse(id),
|
||
"cost": "",
|
||
"class": classAction[id], // working fine
|
||
"a1_action": FirstApproverAction[id],
|
||
"a2_action": SecondApproverAction[id],
|
||
"a3_action": ThirdApproverAction[id],
|
||
"parallel_process_from": SelectedParallelProcess[id],
|
||
"a1_exceptional_action": FirstExceptionalApproverAction[id],
|
||
"a2_exceptional_action": SecondExceptionalApproverAction[id],
|
||
"a3_exceptional_action": ThirdExceptionalApproverAction[id],
|
||
"a4_exceptional_action": FourthExceptionalApproverAction[id],
|
||
"exceptional_parallel_process_from":
|
||
SelectedParallelExceptionalProcess[id],
|
||
"a1_amendment_action": FirstAmendApproverAction[id],
|
||
"a2_amendment_action": SecondAmendApproverAction[id],
|
||
"a3_amendment_action": ThirdAmendApproverAction[id],
|
||
"a4_amendment_action": FourthAmendApproverAction[id],
|
||
"amendment_parallel_process_from": SelectedParallelAmendProcess[id],
|
||
"created_by": widget.userId,
|
||
});
|
||
}
|
||
|
||
// Step 6: Emit updated policy data
|
||
widget.onPolicyDataChanged(policyData);
|
||
}
|
||
|
||
// To set the data (update)
|
||
void loadPolicyDetails(List<Map<String, dynamic>> details) {
|
||
print("loadPolicyDetails");
|
||
for (var item in details) {
|
||
final serviceId = item['service_id'].toString();
|
||
|
||
costController[serviceId] = TextEditingController(
|
||
text: item['cost'] ?? '',
|
||
);
|
||
|
||
// classAction[serviceId] = classAction[serviceId]?.toString();
|
||
|
||
classAction[serviceId] = item['class']?.toString() ?? ''; // working fine
|
||
|
||
FirstApproverAction[serviceId] = item['a1_action']?.toString();
|
||
SecondApproverAction[serviceId] = item['a2_action']?.toString();
|
||
ThirdApproverAction[serviceId] = item['a3_action']?.toString();
|
||
SelectedParallelProcess[serviceId] =
|
||
item['parallel_process_from']?.toString() ?? "3";
|
||
|
||
FirstExceptionalApproverAction[serviceId] =
|
||
item['a1_exceptional_action']?.toString();
|
||
SecondExceptionalApproverAction[serviceId] =
|
||
item['a2_exceptional_action']?.toString();
|
||
ThirdExceptionalApproverAction[serviceId] =
|
||
item['a3_exceptional_action']?.toString();
|
||
FourthExceptionalApproverAction[serviceId] =
|
||
item['a4_exceptional_action']?.toString();
|
||
SelectedParallelExceptionalProcess[serviceId] =
|
||
item['exceptional_parallel_process_from']?.toString() ?? "3";
|
||
|
||
FirstAmendApproverAction[serviceId] =
|
||
item['a1_amendment_action']?.toString();
|
||
SecondAmendApproverAction[serviceId] =
|
||
item['a2_amendment_action']?.toString();
|
||
ThirdAmendApproverAction[serviceId] =
|
||
item['a3_amendment_action']?.toString();
|
||
FourthAmendApproverAction[serviceId] =
|
||
item['a4_amendment_action']?.toString();
|
||
SelectedParallelAmendProcess[serviceId] =
|
||
item['amendment_parallel_process_from']?.toString() ?? "4";
|
||
|
||
if (item['policy_details_id'] != null) {
|
||
policyDetailsIdMap[serviceId] = item['policy_details_id'].toString();
|
||
}
|
||
if (item['policy_id'] != null) {
|
||
policyIdMap[serviceId] = item['policy_id'].toString();
|
||
}
|
||
}
|
||
|
||
policyData = details;
|
||
widget.onPolicyDataChanged(policyData);
|
||
|
||
if (details.isNotEmpty) {
|
||
final firstServiceId = details.first['service_id'].toString();
|
||
print('First Service ID is: $firstServiceId');
|
||
// firstServiceId == "1"
|
||
// ? fetchTrainFlightClass(1)
|
||
// : fetchTrainFlightClass(2);
|
||
}
|
||
setState(() {});
|
||
|
||
print("detailsdetails- $details");
|
||
}
|
||
|
||
void addOrUpdatePolicy(String serviceId) {
|
||
print("addOrUpdatePolicyserviceId - $serviceId");
|
||
// 1. First, find existing item if any
|
||
final existingIndex = policyData!.indexWhere(
|
||
(item) => item["service_id"] == serviceId,
|
||
);
|
||
|
||
print(FirstApproverAction);
|
||
Map<String, dynamic> data = {
|
||
"service_id": serviceId,
|
||
"cost": costController[serviceId]?.text,
|
||
// "class": classController[serviceId]?.text,
|
||
"class": classAction[serviceId] ?? "", // working fine
|
||
"a1_action": FirstApproverAction[serviceId],
|
||
"a2_action": SecondApproverAction[serviceId],
|
||
"a3_action": ThirdApproverAction[serviceId],
|
||
"parallel_process_from": SelectedParallelProcess[serviceId],
|
||
"a1_exceptional_action": FirstExceptionalApproverAction[serviceId],
|
||
"a2_exceptional_action": SecondExceptionalApproverAction[serviceId],
|
||
"a3_exceptional_action": ThirdExceptionalApproverAction[serviceId],
|
||
"a4_exceptional_action": FourthExceptionalApproverAction[serviceId],
|
||
"exceptional_parallel_process_from":
|
||
SelectedParallelExceptionalProcess[serviceId],
|
||
"a1_amendment_action": FirstAmendApproverAction[serviceId],
|
||
"a2_amendment_action": SecondAmendApproverAction[serviceId],
|
||
"a3_amendment_action": ThirdAmendApproverAction[serviceId],
|
||
"a4_amendment_action": FourthAmendApproverAction[serviceId],
|
||
"amendment_parallel_process_from":
|
||
SelectedParallelAmendProcess[serviceId],
|
||
"created_by": widget.userId,
|
||
};
|
||
|
||
final cost = costController[serviceId]?.text ?? "";
|
||
|
||
// final travelClass = classController[serviceId]?.text ?? "";
|
||
final travelClass = classAction[serviceId]; // working fine
|
||
final a1 = FirstApproverAction[serviceId];
|
||
final a2 = SecondApproverAction[serviceId];
|
||
final a3 = ThirdApproverAction[serviceId];
|
||
|
||
final ae1 = FirstExceptionalApproverAction[serviceId];
|
||
final ae2 = SecondExceptionalApproverAction[serviceId];
|
||
final ae3 = ThirdExceptionalApproverAction[serviceId];
|
||
final ae4 = FourthExceptionalApproverAction[serviceId];
|
||
|
||
final aa1 = FirstAmendApproverAction[serviceId];
|
||
final aa2 = SecondAmendApproverAction[serviceId];
|
||
final aa3 = ThirdAmendApproverAction[serviceId];
|
||
final aa4 = FourthAmendApproverAction[serviceId];
|
||
// bool hasValue = cost.trim().isNotEmpty;
|
||
// bool hasValue = cost.trim().isNotEmpty || travelClass!.isNotEmpty;
|
||
bool hasValue =
|
||
cost.trim().isNotEmpty || (travelClass?.isNotEmpty ?? false);
|
||
|
||
bool allActionsNull = a1 == null && a2 == null && a3 == null;
|
||
bool someActionsMissing =
|
||
[a1, a2, a3].where((a) => a != null).length > 0 &&
|
||
[a1, a2, a3].where((a) => a == null).length > 0;
|
||
|
||
bool allExceptionalActionsNull =
|
||
ae1 == null && ae2 == null && ae3 == null && ae4 == null;
|
||
bool someExceptionalActionsMissing =
|
||
[ae1, ae2, ae3, ae4].where((a) => a != null).length > 0 &&
|
||
[ae1, ae2, ae3, ae4].where((a) => a == null).length > 0;
|
||
|
||
bool allAmendActionsNull =
|
||
aa1 == null && aa2 == null && aa3 == null && aa4 == null;
|
||
bool someAmendActionsMissing =
|
||
[aa1, aa2, aa3, aa4].where((a) => a != null).length > 0 &&
|
||
[aa1, aa2, aa3, aa4].where((a) => a == null).length > 0;
|
||
|
||
if (someActionsMissing) {
|
||
validationErrors[serviceId] = "All 3 approver actions must be selected.";
|
||
return;
|
||
}
|
||
if (someExceptionalActionsMissing) {
|
||
validationErrors[serviceId] =
|
||
"All 4 exceptional approver actions must be selected.";
|
||
return;
|
||
}
|
||
if (someAmendActionsMissing) {
|
||
validationErrors[serviceId] =
|
||
"All 4 amendment approver actions must be selected.";
|
||
return;
|
||
}
|
||
|
||
if (hasValue &&
|
||
allActionsNull &&
|
||
allExceptionalActionsNull &&
|
||
allAmendActionsNull) {
|
||
validationErrors[serviceId] = "Please select all actions.";
|
||
return;
|
||
} else {
|
||
print("HAS VAlue");
|
||
}
|
||
|
||
validationErrors.remove(serviceId);
|
||
|
||
// 2. ⚡ If updating an existing item, also **keep its IDs**
|
||
if (existingIndex != -1) {
|
||
final existingItem = policyData![existingIndex];
|
||
|
||
if (existingItem.containsKey("policy_details_id")) {
|
||
data["policy_details_id"] = existingItem["policy_details_id"];
|
||
}
|
||
if (existingItem.containsKey("policy_id")) {
|
||
data["policy_id"] = existingItem["policy_id"];
|
||
}
|
||
|
||
// 3. Now update it
|
||
policyData![existingIndex] = data;
|
||
print("🔁 Updated policy for ServiceId: $serviceId");
|
||
} else {
|
||
// 4. Else add as new
|
||
policyData!.add(data);
|
||
print("➕ Added policy for ServiceId: $serviceId");
|
||
}
|
||
|
||
// int index =
|
||
// policyData!.indexWhere((item) => item["service_id"] == serviceId);
|
||
// if (index != -1) {
|
||
// policyData![index] = data; // Replace existing entry
|
||
// print("🔁 Updated policy for ServiceId: $serviceId");
|
||
// } else {
|
||
// policyData!.add(data); // Add new entry
|
||
// print("➕ Added policy for ServiceId: $serviceId");
|
||
// }
|
||
|
||
print("📋 policyData - $policyData");
|
||
}
|
||
|
||
Future<void> fetchTrainFlightClass() async {
|
||
print("ftech api");
|
||
try {
|
||
final data = await apiService.fetchMasterDropdown(context);
|
||
|
||
print("fetchTrainFlightClass - $data");
|
||
|
||
if (data is! Map) {
|
||
throw Exception("Invalid response format: expected a Map");
|
||
}
|
||
|
||
setState(() {
|
||
apiDataForClass = data; // Store API response in state
|
||
isLoading = false;
|
||
});
|
||
} catch (e) {
|
||
print('Error fetching role list: $e');
|
||
}
|
||
}
|
||
|
||
void fieldForPolicy() {
|
||
print("fieldForPolicy - ${widget.selectedTabNotifier.value}");
|
||
|
||
// Save current input to policyData before switching
|
||
if (ServiceId != null) {
|
||
print("Calling addOrUpdatePolicy");
|
||
addOrUpdatePolicy(
|
||
ServiceId!,
|
||
); // 👈 Save current values for existing service
|
||
}
|
||
setState(() {
|
||
// ServiceId = widget.selectedTabNotifier.value ?? "1";
|
||
final String tabIndexStr = widget.selectedTabNotifier.value;
|
||
print(" fns - $ServiceId");
|
||
// Safely convert tab index to int
|
||
final int? tabIndex = int.tryParse(tabIndexStr);
|
||
print(" tb inx - $tabIndex");
|
||
print(" db - ${widget.serviceDBValueList.length}");
|
||
print(" db list - ${widget.serviceDBValueList}");
|
||
|
||
if (tabIndex != null &&
|
||
tabIndex >= 0 &&
|
||
tabIndex <= widget.serviceDBValueList.length) {
|
||
ServiceId = widget.serviceDBValueList[tabIndex - 1].toString();
|
||
print('✅ 484 Selected ServiceId: $ServiceId');
|
||
} else {
|
||
print('❌ Invalid tab index or out of range');
|
||
}
|
||
print("502 ServiceId $ServiceId");
|
||
// Initialize controllers and variables if not present
|
||
costController.putIfAbsent(ServiceId!, () => TextEditingController());
|
||
classAction.putIfAbsent((ServiceId!), () => "1");
|
||
// classController.putIfAbsent(ServiceId!, () => TextEditingController());
|
||
|
||
FirstApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
SecondApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
ThirdApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
// SelectedParallelProcess.putIfAbsent(ServiceId!, () => "0");
|
||
SelectedParallelProcess.putIfAbsent(ServiceId!, () => "3");
|
||
|
||
FirstExceptionalApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
SecondExceptionalApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
ThirdExceptionalApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
FourthExceptionalApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
SelectedParallelExceptionalProcess.putIfAbsent(ServiceId!, () => "0");
|
||
// SelectedParallelExceptionalProcess.putIfAbsent(ServiceId!, () => "4");
|
||
|
||
FirstAmendApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
SecondAmendApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
ThirdAmendApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
FourthAmendApproverAction.putIfAbsent(ServiceId!, () => "None");
|
||
SelectedParallelAmendProcess.putIfAbsent(ServiceId!, () => "0");
|
||
// SelectedParallelAmendProcess.putIfAbsent(ServiceId!, () => "4");
|
||
});
|
||
|
||
widget.onPolicyDataChanged(policyData);
|
||
}
|
||
|
||
void printData() {
|
||
// print("policyServices - $policyServices");
|
||
}
|
||
|
||
Widget build(BuildContext context) {
|
||
return Column(
|
||
mainAxisAlignment: MainAxisAlignment.start,
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
// widget.isDesktop ? SizedBox(height: 10) : SizedBox(height: 5),
|
||
// Row(
|
||
// mainAxisAlignment: MainAxisAlignment.start,
|
||
// children: [
|
||
// Padding(
|
||
// padding: widget.isDesktop
|
||
// ? const EdgeInsets.only(left: 28.0)
|
||
// : const EdgeInsets.only(left: 0),
|
||
// child: Text(
|
||
// " Policy Criteria For ${widget.selectedService} ",
|
||
// style: GoogleFonts.poppins(
|
||
// fontSize: 13,
|
||
// color: Color(0xFF9E9DBD),
|
||
// fontWeight: FontWeight.bold),
|
||
// ),
|
||
// )
|
||
// ],
|
||
// ),
|
||
if (widget.isClass!)
|
||
widget.isDesktop ? SizedBox(height: 1) : SizedBox(height: 1),
|
||
Padding(
|
||
padding:
|
||
widget.isDesktop
|
||
? const EdgeInsets.only(left: 0.0)
|
||
: const EdgeInsets.only(left: 0),
|
||
child: Row(
|
||
children: [
|
||
Container(
|
||
// color: Colors.grey,
|
||
padding: const EdgeInsets.only(
|
||
top: 2,
|
||
bottom: 2,
|
||
left: 5,
|
||
right: 5,
|
||
),
|
||
child:
|
||
widget.isDesktop
|
||
? Row(
|
||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
if (widget.isClass)
|
||
buildClassWidget(widget.isDesktop),
|
||
SizedBox(width: 45),
|
||
if (widget.isCost!)
|
||
buildCostWidget(widget.isDesktop),
|
||
],
|
||
)
|
||
: Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
if (widget.isClass!)
|
||
buildClassWidget(widget.isDesktop),
|
||
SizedBox(height: 10),
|
||
if (widget.isCost!)
|
||
buildCostWidget(widget.isDesktop),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
if (widget.isCost!) SizedBox(height: 5),
|
||
if (validationErrors[ServiceId] != null)
|
||
Row(
|
||
children: [
|
||
Text(
|
||
validationErrors[ServiceId]!,
|
||
style: GoogleFonts.poppins(
|
||
color: Colors.red,
|
||
fontSize: 10,
|
||
fontWeight: FontWeight.bold,
|
||
),
|
||
),
|
||
],
|
||
),
|
||
if (validationErrors[ServiceId] != null) SizedBox(height: 5),
|
||
Container(
|
||
decoration: BoxDecoration(
|
||
border: null,
|
||
// border: Border.all(
|
||
// color: Color(0xFFEBEBF7),
|
||
// ),
|
||
borderRadius: BorderRadius.circular(8),
|
||
// color: Colors.brown.shade200,
|
||
),
|
||
child: Container(
|
||
child: Row(
|
||
children: [
|
||
Column(
|
||
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||
children: [
|
||
Container(
|
||
// color: Colors.yellow,
|
||
width:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.width * 0.18
|
||
: 600,
|
||
height:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.height * 0.56
|
||
: null,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
margin: const EdgeInsets.only(right: 0),
|
||
decoration: BoxDecoration(
|
||
// color: Colors.grey.shade100,
|
||
// border: Border.all(
|
||
// color: Colors.grey.shade100,
|
||
// ),
|
||
),
|
||
padding: const EdgeInsets.only(
|
||
top: 10,
|
||
bottom: 0,
|
||
left: 0,
|
||
right: 35,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment:
|
||
widget.isDesktop
|
||
? MainAxisAlignment.spaceAround
|
||
: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
Expanded(
|
||
flex: 3,
|
||
child: Align(
|
||
alignment: Alignment.center,
|
||
child: Text(
|
||
"Normal Approval",
|
||
style: GoogleFonts.poppins(
|
||
color: Color(0xFF9E9DBD),
|
||
fontWeight: FontWeight.bold,
|
||
fontSize: 12,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
// Expanded(
|
||
// flex: 2,
|
||
// child: Text(
|
||
// "Actions",
|
||
// style: GoogleFonts.poppins(
|
||
// color: Color(0xFF9E9DBD),
|
||
// fontWeight: FontWeight.bold,
|
||
// fontSize: 12),
|
||
// ),
|
||
// ),
|
||
// Text(
|
||
// "Parallel Action",
|
||
// style: GoogleFonts.poppins(
|
||
// color: Color(0xFF9E9DBD),
|
||
// fontWeight: FontWeight.bold,
|
||
// fontSize: 12),
|
||
// )
|
||
],
|
||
),
|
||
),
|
||
Divider(thickness: 0.2, color: Colors.grey),
|
||
SizedBox(
|
||
// height: 180,
|
||
|
||
// scrollDirection: Axis.vertical,
|
||
child: Container(
|
||
// height: MediaQuery.of(context).size.height * 3,
|
||
// color: Colors.grey,
|
||
decoration: BoxDecoration(
|
||
border: Border(
|
||
right: BorderSide(
|
||
color:
|
||
Colors
|
||
.blueGrey
|
||
.shade50, // Change this to your desired color
|
||
width:
|
||
1.0, // Change this to your desired width
|
||
),
|
||
),
|
||
),
|
||
|
||
margin: const EdgeInsets.only(right: 5, left: 0),
|
||
// color: Colors.grey.shade100,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
padding: const EdgeInsets.all(10),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 1",
|
||
"A1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelProcess[ServiceId!] ==
|
||
"1") {
|
||
if (FirstApproverAction[ServiceId!] !=
|
||
"None") {
|
||
if (SecondApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"2";
|
||
} else {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"3";
|
||
}
|
||
}
|
||
} else {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"1";
|
||
|
||
if ((FirstApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${FirstApproverAction[ServiceId!]}",
|
||
);
|
||
FirstApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${FirstApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelProcess - $SelectedParallelProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
((SelectedParallelProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
((SelectedParallelProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((FirstApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelProcess[ServiceId] ==
|
||
"2" ||
|
||
SelectedParallelProcess[ServiceId] ==
|
||
"3")))
|
||
? 'S'
|
||
: '',
|
||
|
||
semanticsLabel: "NPP1",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
((SelectedParallelProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelProcess[ServiceId] ==
|
||
// "1") &&
|
||
// (FirstApproverAction[ServiceId!] !=
|
||
// "None"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
|
||
// child: Container(
|
||
// height: 25,
|
||
// width: 25,
|
||
// // decoration: BoxDecoration(
|
||
// // shape: BoxShape.circle,
|
||
// // border: Border.all(
|
||
// // color:
|
||
// // (SelectedParallelProcess[ServiceId] ==
|
||
// // "1")
|
||
// // ? Colors.green
|
||
// // : Colors.grey,
|
||
// // width: 2,
|
||
// // ),
|
||
// // ),
|
||
// child: Icon(
|
||
// Icons.circle,
|
||
// size: 20,
|
||
// color:
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "1")
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// // color: Colors.grey,
|
||
// ),
|
||
// ),
|
||
),
|
||
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
FirstApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "NA1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "NA1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
FirstApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
(SelectedParallelProcess[ServiceId!] ==
|
||
"1")) {
|
||
setState(() {
|
||
if (SecondApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"2";
|
||
} else {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"3";
|
||
}
|
||
});
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
padding: const EdgeInsets.all(10),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 2",
|
||
"A2",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelProcess[ServiceId!] ==
|
||
"2") {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"2";
|
||
if ((SecondApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${SecondApproverAction[ServiceId!]}",
|
||
);
|
||
SecondApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${SecondApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelProcess - $SelectedParallelProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((SecondApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelProcess[ServiceId] ==
|
||
"1" ||
|
||
SelectedParallelProcess[ServiceId] ==
|
||
"3")))
|
||
? 'S'
|
||
: '',
|
||
|
||
semanticsLabel: "NPP2",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
// color:
|
||
// (((SelectedParallelProcess[ServiceId] ==
|
||
// "11") ||
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "2")) &&
|
||
// (FirstApproverAction[ServiceId!] !=
|
||
// "None"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelProcess[ServiceId] ==
|
||
// "11") ||
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "2"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
SecondApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "NA2",
|
||
style: TextStyle(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
semanticsLabel: "NA2",
|
||
selectedItem ?? "Select",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
SecondApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
((SelectedParallelProcess[ServiceId!] ==
|
||
"2"))) {
|
||
setState(() {
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"3";
|
||
});
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
padding: const EdgeInsets.all(10),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
"A3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
// if (SelectedParallelProcess[ServiceId!] !=
|
||
// null &&
|
||
// (SelectedParallelProcess[ServiceId!] ==
|
||
// "1" ||
|
||
// SelectedParallelProcess[ServiceId!] ==
|
||
// "2" ||
|
||
// SelectedParallelProcess[ServiceId!] ==
|
||
// "3")) {
|
||
// SelectedParallelProcess[ServiceId!] =
|
||
// "0";
|
||
// } else if ((SelectedParallelProcess[ServiceId!] ==
|
||
// null) &&
|
||
// (SecondApproverAction[ServiceId!] ==
|
||
// "None")) {
|
||
// SelectedParallelProcess[ServiceId!] =
|
||
// "0";} else {
|
||
// SelectedParallelProcess[ServiceId!] =
|
||
// "3";
|
||
// if ((ThirdApproverAction[ServiceId!] ==
|
||
// "None")) {
|
||
// print(
|
||
// " ThirDAPPACTO - ${ThirdApproverAction[ServiceId!]}",
|
||
// );
|
||
// ThirdApproverAction[ServiceId!] =
|
||
// "Notification";
|
||
// print(
|
||
// " ThirDAPPACTO2 - ${ThirdApproverAction[ServiceId!]}",
|
||
// );
|
||
// }
|
||
// }
|
||
|
||
SelectedParallelProcess[ServiceId!] =
|
||
"3";
|
||
|
||
if ((ThirdApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${ThirdApproverAction[ServiceId!]}",
|
||
);
|
||
ThirdApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${ThirdApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
});
|
||
print(
|
||
" SelectedParallelProcess - $SelectedParallelProcess[ServiceId]",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Top lin
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")
|
||
// ||
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "3")
|
||
) &&
|
||
(ThirdApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")
|
||
// ||
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "3")
|
||
) &&
|
||
(ThirdApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((ThirdApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"3"))
|
||
? 'S'
|
||
: '',
|
||
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelProcess[ServiceId] ==
|
||
"2")
|
||
// ||
|
||
// (SelectedParallelProcess[ServiceId] ==
|
||
// "3")
|
||
) &&
|
||
(ThirdApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
semanticsLabel: "NPP3",
|
||
|
||
// size: 15,
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
ThirdApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "NA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(context, selectedItem) =>
|
||
// Center-align selected item
|
||
Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "NA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
ThirdApproverAction[ServiceId!] =
|
||
newValue;
|
||
print(
|
||
"selecPP - ${SelectedParallelProcess[ServiceId]}",
|
||
);
|
||
if (newValue == "None" &&
|
||
SelectedParallelProcess[ServiceId!] ==
|
||
"3") {
|
||
setState(() {
|
||
// SelectedParallelProcess[ServiceId!] =
|
||
// "0";
|
||
});
|
||
}
|
||
print(
|
||
"selectedUserType - $newValue",
|
||
);
|
||
print(
|
||
"selecPP - ${SelectedParallelProcess[ServiceId]}",
|
||
);
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
|
||
Column(
|
||
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||
children: [
|
||
Container(
|
||
width:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.width * 0.18
|
||
: 600,
|
||
height:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.height * 0.56
|
||
: null,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
margin: const EdgeInsets.only(right: 0),
|
||
decoration: BoxDecoration(
|
||
// color: Colors.grey.shade100,
|
||
// border: Border.all(
|
||
// color: Colors.grey.shade100,
|
||
// ),
|
||
),
|
||
padding: const EdgeInsets.only(
|
||
top: 10,
|
||
bottom: 0,
|
||
left: 0,
|
||
right: 35,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment:
|
||
widget.isDesktop
|
||
? MainAxisAlignment.spaceAround
|
||
: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
Expanded(
|
||
flex: 3,
|
||
child: Align(
|
||
alignment: Alignment.center,
|
||
child: Text(
|
||
"Exceptional Approval",
|
||
style: GoogleFonts.poppins(
|
||
color: Color(0xFF9E9DBD),
|
||
fontWeight: FontWeight.bold,
|
||
fontSize: 12,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Divider(thickness: 0.2, color: Colors.grey),
|
||
SizedBox(
|
||
// height: 180,
|
||
|
||
// scrollDirection: Axis.vertical,
|
||
child: Container(
|
||
// height: MediaQuery.of(context).size.height * 3,
|
||
// color: Colors.grey,
|
||
decoration: BoxDecoration(
|
||
border: Border(
|
||
right: BorderSide(
|
||
color:
|
||
Colors
|
||
.blueGrey
|
||
.shade50, // Change this to your desired color
|
||
width:
|
||
1.0, // Change this to your desired width
|
||
),
|
||
),
|
||
),
|
||
margin: const EdgeInsets.only(right: 5, left: 0),
|
||
// color: Colors.grey.shade100,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 1",
|
||
"A1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") {
|
||
if (SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"2";
|
||
} else if (ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"1";
|
||
|
||
if ((FirstExceptionalApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTOE - ${FirstExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
FirstExceptionalApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2E - ${FirstExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelExceptionalProcess - $SelectedParallelExceptionalProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((FirstExceptionalApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"2" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "EPP1",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
|
||
// color:
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1")
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1")
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
FirstExceptionalApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "EA1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
selectedItem ?? "Select",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
FirstExceptionalApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1")) {
|
||
setState(() {
|
||
if (SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"2";
|
||
} else if (ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
});
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 2",
|
||
"A2",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") {
|
||
if (ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"2";
|
||
|
||
if ((SecondExceptionalApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${SecondExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
SecondExceptionalApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${SecondExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelExceptionalProcess - $SelectedParallelExceptionalProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"1" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "EPP2",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
|
||
// color:
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
SecondExceptionalApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "EA2",
|
||
style: TextStyle(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "EA2",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
SecondExceptionalApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2"))) {
|
||
setState(() {
|
||
if (ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
});
|
||
}
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
"A3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"3") {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
} else {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"3";
|
||
|
||
if ((ThirdExceptionalApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${ThirdExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
ThirdExceptionalApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${ThirdExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
print(
|
||
"SelectedParallelExceptionalProcess - $SelectedParallelExceptionalProcess[ServiceId]",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"1" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "EPP3",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
|
||
// color:
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "3"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "3"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
ThirdExceptionalApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "EA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(context, selectedItem) =>
|
||
// Center-align selected item
|
||
Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "EA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
ThirdExceptionalApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"3"))) {
|
||
setState(() {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
});
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
"A4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
SelectedParallelExceptionalProcess[ServiceId!] =
|
||
"4";
|
||
|
||
if ((FourthExceptionalApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${FourthExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
FourthExceptionalApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${FourthExceptionalApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
});
|
||
print(
|
||
"SelectedParallelExceptionalProcess - $SelectedParallelExceptionalProcess[ServiceId]",
|
||
);
|
||
},
|
||
child: Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((FourthExceptionalApproverAction[ServiceId!] !=
|
||
"None")
|
||
// &&
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1" ||
|
||
// SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2" ||
|
||
// SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "3" ||
|
||
// SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "4"))
|
||
)
|
||
? 'S'
|
||
: '',
|
||
|
||
semanticsLabel: "EPP4",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight: FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"1") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"2") ||
|
||
(SelectedParallelExceptionalProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthExceptionalApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
|
||
// color:
|
||
// ((SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "2") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "3") ||
|
||
// (SelectedParallelExceptionalProcess[ServiceId] ==
|
||
// "4"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// color: Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
FourthExceptionalApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "EA4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(context, selectedItem) =>
|
||
// Center-align selected item
|
||
Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "EA4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
FourthExceptionalApproverAction[ServiceId!] =
|
||
newValue;
|
||
// SelectedParallelExceptionalProcess[ServiceId!] =
|
||
// "4";
|
||
if (newValue == "None" &&
|
||
((SelectedParallelExceptionalProcess[ServiceId!] ==
|
||
"4"))) {
|
||
// SelectedParallelExceptionalProcess[ServiceId!] =
|
||
// "4";
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
Column(
|
||
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||
children: [
|
||
Container(
|
||
//color: Colors.grey.shade100,
|
||
width:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.width * 0.18
|
||
: 600,
|
||
height:
|
||
widget.isDesktop
|
||
? MediaQuery.of(context).size.height * 0.56
|
||
: null,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
margin: const EdgeInsets.only(right: 0),
|
||
decoration: BoxDecoration(
|
||
// color: Colors.grey.shade100,
|
||
// border: Border.all(
|
||
// color: Colors.grey.shade100,
|
||
// ),
|
||
),
|
||
padding: const EdgeInsets.only(
|
||
top: 10,
|
||
bottom: 0,
|
||
left: 0,
|
||
right: 35,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment:
|
||
widget.isDesktop
|
||
? MainAxisAlignment.spaceAround
|
||
: MainAxisAlignment.spaceBetween,
|
||
children: [
|
||
Expanded(
|
||
flex: 3,
|
||
child: Align(
|
||
alignment: Alignment.center,
|
||
child: Text(
|
||
"Amendment Approval",
|
||
style: GoogleFonts.poppins(
|
||
color: Color(0xFF9E9DBD),
|
||
fontWeight: FontWeight.bold,
|
||
fontSize: 12,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Divider(thickness: 0.2, color: Colors.grey),
|
||
SizedBox(
|
||
// height: 180,
|
||
|
||
// scrollDirection: Axis.vertical,
|
||
child: Container(
|
||
// height: MediaQuery.of(context).size.height * 3,
|
||
// color: Colors.grey,
|
||
margin: const EdgeInsets.only(right: 5, left: 0),
|
||
// color: Colors.grey.shade100,
|
||
child: Column(
|
||
children: [
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 1",
|
||
"A1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelAmendProcess[ServiceId!] ==
|
||
"1") {
|
||
if (SecondAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"2";
|
||
} else if (ThirdAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"1";
|
||
if ((FirstAmendApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTOE - ${FirstAmendApproverAction[ServiceId!]}",
|
||
);
|
||
FirstAmendApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2E - ${FirstAmendApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelAmendProcess - $SelectedParallelAmendProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((FirstAmendApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"2" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "AAPP1",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") &&
|
||
(FirstAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
// color:
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1")
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1")
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
FirstAmendApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "AA1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "AA1",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
FirstAmendApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
(SelectedParallelAmendProcess[ServiceId!] ==
|
||
"1")) {
|
||
// SelectedParallelAmendProcess[ServiceId!] =
|
||
// "0";
|
||
|
||
if (SecondAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"2";
|
||
} else if (ThirdAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
// "Approver 2",
|
||
"A2",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelAmendProcess[ServiceId!] ==
|
||
"2") {
|
||
if (ThirdAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"2";
|
||
|
||
if ((SecondAmendApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${SecondAmendApproverAction[ServiceId!]}",
|
||
);
|
||
SecondAmendApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${SecondAmendApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
|
||
print(
|
||
"SelectedParallelAmendProcess - $SelectedParallelAmendProcess",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((SecondAmendApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"1" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "AAPP2",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2")) &&
|
||
(SecondAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
|
||
// color:
|
||
// ((SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "2"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "2"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
SecondAmendApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "AA2",
|
||
style: TextStyle(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(
|
||
context,
|
||
selectedItem,
|
||
) => Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "AA2",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
SecondAmendApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
((SelectedParallelAmendProcess[ServiceId!] ==
|
||
"2"))) {
|
||
if (ThirdAmendApproverAction[ServiceId!] !=
|
||
"None") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"3";
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
}
|
||
}
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
"A3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
if (SelectedParallelAmendProcess[ServiceId!] ==
|
||
"3") {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
} else {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"3";
|
||
if ((ThirdAmendApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${ThirdAmendApproverAction[ServiceId!]}",
|
||
);
|
||
ThirdAmendApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${ThirdAmendApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
}
|
||
});
|
||
print(
|
||
"SelectedParallelAmendProcess - $SelectedParallelAmendProcess[ServiceId]",
|
||
);
|
||
},
|
||
child: Column(
|
||
mainAxisSize: MainAxisSize.min,
|
||
children: [
|
||
// Circle icon
|
||
Container(
|
||
height: 20,
|
||
width: 20,
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((ThirdAmendApproverAction[ServiceId!] !=
|
||
"None") &&
|
||
((SelectedParallelAmendProcess[ServiceId] ==
|
||
"0" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"1" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"3" ||
|
||
SelectedParallelAmendProcess[ServiceId] ==
|
||
"4")))
|
||
? 'S'
|
||
: '',
|
||
semanticsLabel: "AAPP3",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight:
|
||
FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")) &&
|
||
(ThirdAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
// color:
|
||
// ((SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "2") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "3"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
// Icon(
|
||
// Icons.arrow_downward_sharp,
|
||
// size: 16,
|
||
// color:
|
||
// ((SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "2") ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "3"))
|
||
// ? Colors.green
|
||
// : Colors.grey,
|
||
// ),
|
||
|
||
// Bottom line
|
||
],
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
ThirdAmendApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "AA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(context, selectedItem) =>
|
||
// Center-align selected item
|
||
Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "AA3",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
ThirdAmendApproverAction[ServiceId!] =
|
||
newValue;
|
||
|
||
if (newValue == "None" &&
|
||
((SelectedParallelAmendProcess[ServiceId!] ==
|
||
"3"))) {
|
||
setState(() {
|
||
SelectedParallelAmendProcess[ServiceId!] =
|
||
"4";
|
||
});
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
Container(
|
||
// padding: const EdgeInsets.all(10),
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 4.0,
|
||
vertical: 4.0,
|
||
),
|
||
child: Row(
|
||
mainAxisAlignment: MainAxisAlignment.end,
|
||
children: [
|
||
Text(
|
||
"A4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 13,
|
||
),
|
||
),
|
||
Spacer(),
|
||
GestureDetector(
|
||
onTap: () {
|
||
setState(() {
|
||
// SelectedParallelAmendProcess[ServiceId!] =
|
||
// "4";
|
||
|
||
if ((FourthAmendApproverAction[ServiceId!] ==
|
||
"None")) {
|
||
print(
|
||
" ThirDAPPACTO - ${FourthAmendApproverAction[ServiceId!]}",
|
||
);
|
||
FourthAmendApproverAction[ServiceId!] =
|
||
"Notification";
|
||
print(
|
||
" ThirDAPPACTO2 - ${FourthAmendApproverAction[ServiceId!]}",
|
||
);
|
||
}
|
||
});
|
||
print(
|
||
"SelectedParallelAmendProcess - $SelectedParallelAmendProcess[ServiceId]",
|
||
);
|
||
},
|
||
child: Container(
|
||
height: 20,
|
||
width: 20,
|
||
|
||
decoration: BoxDecoration(
|
||
shape: BoxShape.circle,
|
||
border: Border.all(
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
width: 2,
|
||
),
|
||
),
|
||
child: Center(
|
||
child: Text(
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? "P"
|
||
: ((FourthAmendApproverAction[ServiceId!] !=
|
||
"None")
|
||
// &&
|
||
// ((SelectedParallelAmendProcess[ServiceId] ==
|
||
// "1" ||
|
||
// SelectedParallelAmendProcess[ServiceId] ==
|
||
// "2" ||
|
||
// SelectedParallelAmendProcess[ServiceId] ==
|
||
// "3" ||
|
||
// SelectedParallelAmendProcess[ServiceId] ==
|
||
// "4"))
|
||
)
|
||
? 'S'
|
||
: '',
|
||
|
||
semanticsLabel: "AAPP4",
|
||
style: TextStyle(
|
||
fontSize: 10,
|
||
fontWeight: FontWeight.w800,
|
||
color:
|
||
(((SelectedParallelAmendProcess[ServiceId] ==
|
||
"1") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"2") ||
|
||
(SelectedParallelAmendProcess[ServiceId] ==
|
||
"3")
|
||
// ||
|
||
// (SelectedParallelAmendProcess[ServiceId] ==
|
||
// "4")
|
||
) &&
|
||
(FourthAmendApproverAction[ServiceId!] !=
|
||
"None"))
|
||
? Colors.green
|
||
: Colors.grey,
|
||
),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
Spacer(),
|
||
CustomTextFieldUserWrapper(
|
||
width:
|
||
MediaQuery.of(
|
||
context,
|
||
).size.width *
|
||
0.12,
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 35,
|
||
child: DropdownSearch<String>(
|
||
selectedItem:
|
||
FourthAmendApproverAction[ServiceId],
|
||
// enabled: !isViewMode,
|
||
popupProps: PopupProps.menu(
|
||
// showSearchBox: true,
|
||
fit:
|
||
FlexFit
|
||
.loose, // Allows flexible height
|
||
constraints: BoxConstraints(
|
||
maxHeight: 250,
|
||
),
|
||
itemBuilder:
|
||
(
|
||
context,
|
||
item,
|
||
isSelected,
|
||
) => Padding(
|
||
padding:
|
||
const EdgeInsets.symmetric(
|
||
horizontal: 16.0,
|
||
vertical: 8.0,
|
||
),
|
||
child: Text(
|
||
item,
|
||
semanticsLabel: "AA4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize:
|
||
12, // 👈 Smaller text size here
|
||
color:
|
||
Colors
|
||
.black, // You can customize this
|
||
),
|
||
),
|
||
),
|
||
),
|
||
items: [
|
||
"Approval",
|
||
"Notification",
|
||
"None",
|
||
],
|
||
dropdownDecoratorProps:
|
||
DropDownDecoratorProps(
|
||
dropdownSearchDecoration:
|
||
InputDecoration(
|
||
border:
|
||
InputBorder.none,
|
||
contentPadding:
|
||
EdgeInsets.symmetric(
|
||
horizontal: 1,
|
||
vertical: 5,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder:
|
||
(context, selectedItem) =>
|
||
// Center-align selected item
|
||
Text(
|
||
selectedItem ?? "Select",
|
||
semanticsLabel: "AA4",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Color(0xFF114D8B),
|
||
),
|
||
),
|
||
|
||
onChanged: (String? newValue) {
|
||
setState(() {
|
||
// Find the country_code based on selected country_name
|
||
FourthAmendApproverAction[ServiceId!] =
|
||
newValue;
|
||
// SelectedParallelAmendProcess[ServiceId!] =
|
||
// "4";
|
||
if (newValue == "None" &&
|
||
((SelectedParallelAmendProcess[ServiceId!] ==
|
||
"4"))) {
|
||
// SelectedParallelAmendProcess[ServiceId!] =
|
||
// "4";
|
||
}
|
||
|
||
// print("selectedUserType - $selectedUserType");
|
||
|
||
// if (selectedCountry!.isNotEmpty) {
|
||
// errorMessages.remove("country_code");
|
||
// }
|
||
});
|
||
},
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
],
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
],
|
||
);
|
||
}
|
||
|
||
Widget buildClassWidget(isDesktop) {
|
||
List<dynamic> purposeList = [];
|
||
String textLabel = "Class";
|
||
// if (ServiceId != null) {
|
||
// purposeList = (ServiceId == "1")
|
||
// ? (apiDataForClass?['flight_class'] ?? [])
|
||
// : (apiDataForClass?['train_class'] ?? []);
|
||
// }
|
||
|
||
if (ServiceId != null) {
|
||
// ServiceId = '1';
|
||
print("sid $ServiceId");
|
||
switch (ServiceId) {
|
||
case "1":
|
||
textLabel = "Class";
|
||
purposeList = apiDataForClass?['flight_class'] ?? [];
|
||
break;
|
||
|
||
case "5":
|
||
textLabel = "Category";
|
||
purposeList = apiDataForClass?['hotel_class'] ?? [];
|
||
break;
|
||
|
||
case "2":
|
||
textLabel = "Class";
|
||
purposeList = apiDataForClass?['train_class'] ?? [];
|
||
break;
|
||
|
||
default:
|
||
textLabel = "Class";
|
||
purposeList = [];
|
||
}
|
||
}
|
||
|
||
print("CLASS-ServiceId- $ServiceId");
|
||
print("CLASS-ServiceIndxId- $ServiceIndxId");
|
||
print("CLASS-purposeList - $purposeList");
|
||
print("CLASS-Action - ${classAction[ServiceId]}");
|
||
|
||
// ✅ Sort by dropdown_key
|
||
purposeList.sort((a, b) {
|
||
int aKey = int.tryParse(a['dropdown_key'].toString()) ?? 0;
|
||
int bKey = int.tryParse(b['dropdown_key'].toString()) ?? 0;
|
||
return aKey.compareTo(bKey);
|
||
});
|
||
|
||
List<DropdownMenuItem<String>> dropdownItems =
|
||
purposeList
|
||
.map(
|
||
(item) => DropdownMenuItem<String>(
|
||
value: item['dropdown_key'],
|
||
child: Text(item['dropdown_value']),
|
||
),
|
||
)
|
||
.toList();
|
||
|
||
if (dropdownItems.isEmpty) {
|
||
dropdownItems.add(
|
||
DropdownMenuItem<String>(
|
||
value: null,
|
||
child: Text(
|
||
"No options available",
|
||
style: GoogleFonts.poppins(color: Colors.grey),
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
// if (ServiceId != null) {
|
||
// if (classAction[ServiceId!] == null && dropdownItems.isNotEmpty) {
|
||
// classAction[ServiceId!] = dropdownItems.first.value!;
|
||
// }
|
||
// }
|
||
|
||
// if (ServiceId != null &&
|
||
// classAction[ServiceId!] == null &&
|
||
// dropdownItems.isNotEmpty) {
|
||
// classAction[ServiceId!] = dropdownItems.first.value!;
|
||
// }
|
||
|
||
// 1. First, when dropdownItems are ready, assign default value:
|
||
if ((ServiceId) != null &&
|
||
classAction[ServiceId] == null &&
|
||
dropdownItems.isNotEmpty) {
|
||
// Important to wrap inside setState if async
|
||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
setState(() {
|
||
classAction[ServiceId!] = dropdownItems.first.value!;
|
||
});
|
||
});
|
||
}
|
||
|
||
return Row(
|
||
children: [
|
||
Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
Text(
|
||
textLabel,
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
// fontWeight: FontWeight.w200,
|
||
color: Colors.black,
|
||
),
|
||
),
|
||
SizedBox(height: 5),
|
||
|
||
// CustomTextFieldUserWrapper(
|
||
// isFocused: false,
|
||
// isDesktop: widget.isDesktop,
|
||
//
|
||
// child: SizedBox(
|
||
// height: 40,
|
||
// child: ServiceId != null && (isLoading || dropdownItems.isEmpty)
|
||
// ? const Center(child: CircularProgressIndicator())
|
||
// : DropdownButtonFormField<String>(
|
||
// // Assign the correct focus node
|
||
// // controller: _hotelNameController,
|
||
// value: classAction[ServiceId],
|
||
//
|
||
// style: GoogleFonts.poppins(fontSize: 12),
|
||
// decoration: InputDecoration(
|
||
// hintText: "Select",
|
||
// hintStyle: GoogleFonts.poppins(fontSize: 12),
|
||
// border: InputBorder.none,
|
||
// contentPadding: EdgeInsets.symmetric(
|
||
// horizontal: 10), // Proper padding
|
||
// ),
|
||
// onChanged: (newValue) {
|
||
// if (ServiceId != null && newValue != null) {
|
||
// setState(() {
|
||
// classAction[ServiceId!] = newValue;
|
||
// });
|
||
// }
|
||
// },
|
||
//
|
||
// items: dropdownItems,
|
||
// ),
|
||
// ),
|
||
// ),
|
||
CustomTextFieldUserWrapper(
|
||
isFocused: false,
|
||
isDesktop: isDesktop,
|
||
child: SizedBox(
|
||
height: 40,
|
||
width: double.infinity,
|
||
child:
|
||
(ServiceId!) != null && (isLoading || dropdownItems.isEmpty)
|
||
? const Center(child: CircularProgressIndicator())
|
||
: DropdownSearch<Map<String, dynamic>>(
|
||
// key:
|
||
// classAction[(ServiceId!)] == null
|
||
// ? UniqueKey()
|
||
// : ValueKey(classAction[(ServiceId!)]),
|
||
items: purposeList.cast<Map<String, dynamic>>(),
|
||
|
||
// selectedItem: purposeList.firstWhere(
|
||
// (item) => item['dropdown_key'] == selectedClass,
|
||
// orElse: () => {},
|
||
// ),
|
||
selectedItem:
|
||
classAction[(ServiceId!)] != null
|
||
? purposeList.firstWhere(
|
||
(item) =>
|
||
item['dropdown_key'] ==
|
||
classAction[(ServiceId!)],
|
||
orElse: () => {},
|
||
)
|
||
: null,
|
||
itemAsString: (item) => item['dropdown_value'] ?? '',
|
||
popupProps: PopupProps.menu(
|
||
showSearchBox: false,
|
||
fit: FlexFit.loose,
|
||
menuProps: const MenuProps(
|
||
backgroundColor: Colors.white,
|
||
),
|
||
itemBuilder: (context, item, isSelected) {
|
||
final bool isNotAllowed =
|
||
item['is_allowed'] == 'No';
|
||
return Padding(
|
||
padding: const EdgeInsets.symmetric(
|
||
horizontal: 10,
|
||
vertical: 5,
|
||
),
|
||
child: Text(
|
||
item['dropdown_value'] ?? '',
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color:
|
||
isNotAllowed
|
||
? Colors.redAccent
|
||
: Colors.black,
|
||
),
|
||
),
|
||
);
|
||
},
|
||
),
|
||
dropdownDecoratorProps: const DropDownDecoratorProps(
|
||
dropdownSearchDecoration: InputDecoration(
|
||
border: InputBorder.none,
|
||
contentPadding: EdgeInsets.symmetric(
|
||
horizontal: 10,
|
||
vertical: 10,
|
||
),
|
||
),
|
||
),
|
||
dropdownBuilder: (context, selectedItem) {
|
||
if (selectedItem == null || selectedItem.isEmpty) {
|
||
return Text(
|
||
"Select ",
|
||
style: GoogleFonts.poppins(
|
||
color: Colors.grey,
|
||
fontSize: 13,
|
||
),
|
||
);
|
||
}
|
||
return Text(
|
||
selectedItem['dropdown_value'] ?? '',
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Colors.black,
|
||
),
|
||
);
|
||
},
|
||
onChanged:
|
||
purposeList.isNotEmpty
|
||
? (Map<String, dynamic>? newValue) async {
|
||
setState(() {
|
||
classAction[(ServiceId!)] =
|
||
newValue?['dropdown_key'];
|
||
print(
|
||
"Selected Purpose: ${classAction[(ServiceId!)]}",
|
||
);
|
||
});
|
||
}
|
||
: null,
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
],
|
||
);
|
||
}
|
||
|
||
Widget buildCostWidget(isDesktop) {
|
||
return Row(
|
||
children: [
|
||
Column(
|
||
crossAxisAlignment: CrossAxisAlignment.start,
|
||
children: [
|
||
Text(
|
||
"Cost",
|
||
style: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
// fontWeight: FontWeight.w200,
|
||
color: Colors.black,
|
||
),
|
||
),
|
||
SizedBox(height: 5),
|
||
CustomTextFieldUserWrapper(
|
||
isFocused: false,
|
||
isDesktop: widget.isDesktop,
|
||
child: SizedBox(
|
||
height: 40,
|
||
child: TextField(
|
||
style: GoogleFonts.poppins(fontSize: 12),
|
||
controller: costController[ServiceId],
|
||
// enabled: !isViewMode,
|
||
onChanged: (value) {
|
||
printData();
|
||
},
|
||
decoration: InputDecoration(
|
||
labelText: "Cost",
|
||
labelStyle: GoogleFonts.poppins(
|
||
fontSize: 12,
|
||
color: Colors.grey,
|
||
),
|
||
floatingLabelBehavior: FloatingLabelBehavior.never,
|
||
border: InputBorder.none,
|
||
contentPadding: EdgeInsets.symmetric(vertical: 16),
|
||
),
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
],
|
||
);
|
||
}
|
||
}
|