ui changes group,policy
This commit is contained in:
parent
ceb6aece50
commit
d59aaf90bc
@ -199,13 +199,38 @@ class _ApprovalListState extends State<ApprovalList> {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
Future<Map<String, dynamic>> getViewPlan(String planId) async {
|
||||||
|
final String apiUrldata = '$apiUrl/api/plans/find/$planId';
|
||||||
|
print("API URL: $apiUrldata");
|
||||||
|
// final token = await getToken();
|
||||||
|
|
||||||
|
if (token == null) {
|
||||||
|
throw Exception('Token not found. Please log in.');
|
||||||
|
}
|
||||||
|
|
||||||
|
final response = await http.put(
|
||||||
|
Uri.parse(apiUrldata),
|
||||||
|
headers: {
|
||||||
|
'Authorization': 'Bearer $token', // Add token here
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
final Map<String, dynamic>? resData = json.decode(response.body);
|
||||||
|
|
||||||
|
return resData?["data"];
|
||||||
|
} else {
|
||||||
|
throw Exception('Failed to load plans');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void viewPlanforApprover(String planId,
|
void viewPlanforApprover(String planId,
|
||||||
{bool isViewMode = false, bool isApprover = true}) async {
|
{bool isViewMode = false, bool isApprover = true}) async {
|
||||||
try {
|
try {
|
||||||
Map<String, dynamic> planData =
|
Map<String, dynamic> planData = await getViewPlan(planId);
|
||||||
await apiService.getViewPlan(planId, plansJson);
|
|
||||||
print("ViewAAA - $planData");
|
|
||||||
|
|
||||||
|
print("ViewAAA - $planData");
|
||||||
context.go('/createPlan', extra: {
|
context.go('/createPlan', extra: {
|
||||||
'planData': planData,
|
'planData': planData,
|
||||||
'isViewMode': isViewMode,
|
'isViewMode': isViewMode,
|
||||||
@ -216,6 +241,18 @@ class _ApprovalListState extends State<ApprovalList> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// void viewPlan(String planId, {bool isViewMode = false}) async {
|
||||||
|
// try {
|
||||||
|
// Map<String, dynamic> planData = await getViewPlan(planId);
|
||||||
|
// print("ViewAAA - $planData");
|
||||||
|
//
|
||||||
|
// context.go('/createPlan',
|
||||||
|
// extra: {'planData': planData, 'isViewMode': isViewMode});
|
||||||
|
// } catch (e) {
|
||||||
|
// print("Error fetching plan: $e");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ResponsiveBuilder(builder: (context, sizingInfo) {
|
return ResponsiveBuilder(builder: (context, sizingInfo) {
|
||||||
bool isDesktop = sizingInfo.deviceScreenType == DeviceScreenType.desktop;
|
bool isDesktop = sizingInfo.deviceScreenType == DeviceScreenType.desktop;
|
||||||
@ -227,18 +264,46 @@ class _ApprovalListState extends State<ApprovalList> {
|
|||||||
body: Row(
|
body: Row(
|
||||||
children: [
|
children: [
|
||||||
if (isDesktop) CustomDrawer(isDesktop: true),
|
if (isDesktop) CustomDrawer(isDesktop: true),
|
||||||
Expanded(child: buildTableLayout(isDesktop))
|
Expanded(child: buildGroupListLayout(isDesktop))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildGroupListLayout(bool isDesktop) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
// color: Colors.amber,
|
||||||
|
color: bodyColor,
|
||||||
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
|
child: buildTableLayout(isDesktop),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildTableLayout(isDesktop) {
|
Widget buildTableLayout(isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
color: Colors.white,
|
||||||
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(1.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(10.0),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
|
|||||||
@ -193,22 +193,30 @@ class _groupState extends State<Group> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> postGroupData(Map<String, dynamic> groupData) async {
|
Future<void> postGroupData(Map<String, dynamic> groupData) async {
|
||||||
// final String apiUrldata = '$apiUrl/api/groups/create';
|
|
||||||
|
|
||||||
final token = await getToken(); // Fetch token
|
final token = await getToken(); // Fetch token
|
||||||
|
|
||||||
|
final bool isEdit = widget.group != null && widget.group!.isNotEmpty;
|
||||||
|
print("isEdit: $isEdit");
|
||||||
print("postGroupData- ${widget.group?['group_id']}");
|
print("postGroupData- ${widget.group?['group_id']}");
|
||||||
|
|
||||||
// Determine whether it's create or update
|
String apiUrlData;
|
||||||
final bool isEdit = widget.group != null && widget.group!.isNotEmpty;
|
|
||||||
final int? groupId = int.tryParse(selectedGroupId!);
|
|
||||||
|
|
||||||
print("postGroupData1 - $selectedGroupId");
|
if (isEdit) {
|
||||||
|
if (selectedGroupId == null) {
|
||||||
|
print("selectedGroupId is null. Cannot proceed.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Build correct API URL
|
final int? groupId = int.tryParse(selectedGroupId!);
|
||||||
final String apiUrlData = isEdit
|
if (groupId == null) {
|
||||||
? '$apiUrl/api/groups/update/$groupId' // Update API
|
print("groupId is invalid. selectedGroupId = $selectedGroupId");
|
||||||
: '$apiUrl/api/groups/create';
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
apiUrlData = '$apiUrl/api/groups/update/$groupId';
|
||||||
|
} else {
|
||||||
|
apiUrlData = '$apiUrl/api/groups/create';
|
||||||
|
}
|
||||||
|
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
throw Exception('Token not found. Please log in.');
|
throw Exception('Token not found. Please log in.');
|
||||||
@ -217,7 +225,6 @@ class _groupState extends State<Group> {
|
|||||||
try {
|
try {
|
||||||
final response = await (isEdit
|
final response = await (isEdit
|
||||||
? http.put(
|
? http.put(
|
||||||
// <-- Use PUT for update
|
|
||||||
Uri.parse(apiUrlData),
|
Uri.parse(apiUrlData),
|
||||||
headers: {
|
headers: {
|
||||||
'Authorization': 'Bearer $token',
|
'Authorization': 'Bearer $token',
|
||||||
@ -231,23 +238,86 @@ class _groupState extends State<Group> {
|
|||||||
'Authorization': 'Bearer $token',
|
'Authorization': 'Bearer $token',
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
body: jsonEncode(groupData), // Convert map to JSON
|
body: jsonEncode(groupData),
|
||||||
));
|
));
|
||||||
|
|
||||||
if (response.statusCode == 200 || response.statusCode == 201) {
|
if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
print("Plan submitted successfully!");
|
print("Group submitted successfully!");
|
||||||
print("Response: ${response.body}");
|
print("Response: ${response.body}");
|
||||||
|
|
||||||
context.go('/group');
|
context.go('/group');
|
||||||
} else {
|
} else {
|
||||||
print("Failed to submit plan. Status: ${response.statusCode}");
|
print("Failed to submit group. Status: ${response.statusCode}");
|
||||||
print("Error: ${response.body}");
|
print("Error: ${response.body}");
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(" Error submitting plan: $e");
|
print("Error submitting group: $e");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Future<void> postGroupData(Map<String, dynamic> groupData) async {
|
||||||
|
// // final String apiUrldata = '$apiUrl/api/groups/create';
|
||||||
|
//
|
||||||
|
// final token = await getToken(); // Fetch token
|
||||||
|
//
|
||||||
|
// print("postGroupData- ${widget.group?['group_id']}");
|
||||||
|
//
|
||||||
|
// if (selectedGroupId == null) {
|
||||||
|
// print("selectedGroupId is null. Cannot proceed.");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// final int? groupId = int.tryParse(selectedGroupId!);
|
||||||
|
// if (groupId == null) {
|
||||||
|
// print("groupId is invalid. selectedGroupId = $selectedGroupId");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// final bool isEdit = widget.group != null && widget.group!.isNotEmpty;
|
||||||
|
// print("postGroupData1 - $selectedGroupId");
|
||||||
|
//
|
||||||
|
// // Build correct API URL
|
||||||
|
// final String apiUrlData = isEdit
|
||||||
|
// ? '$apiUrl/api/groups/update/$groupId' // Update API
|
||||||
|
// : '$apiUrl/api/groups/create';
|
||||||
|
//
|
||||||
|
// if (token == null) {
|
||||||
|
// throw Exception('Token not found. Please log in.');
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// final response = await (isEdit
|
||||||
|
// ? http.put(
|
||||||
|
// // <-- Use PUT for update
|
||||||
|
// Uri.parse(apiUrlData),
|
||||||
|
// headers: {
|
||||||
|
// 'Authorization': 'Bearer $token',
|
||||||
|
// 'Content-Type': 'application/json',
|
||||||
|
// },
|
||||||
|
// body: jsonEncode(groupData),
|
||||||
|
// )
|
||||||
|
// : http.post(
|
||||||
|
// Uri.parse(apiUrlData),
|
||||||
|
// headers: {
|
||||||
|
// 'Authorization': 'Bearer $token',
|
||||||
|
// 'Content-Type': 'application/json',
|
||||||
|
// },
|
||||||
|
// body: jsonEncode(groupData), // Convert map to JSON
|
||||||
|
// ));
|
||||||
|
//
|
||||||
|
// if (response.statusCode == 200 || response.statusCode == 201) {
|
||||||
|
// print("Plan submitted successfully!");
|
||||||
|
// print("Response: ${response.body}");
|
||||||
|
//
|
||||||
|
// context.go('/group');
|
||||||
|
// } else {
|
||||||
|
// print("Failed to submit plan. Status: ${response.statusCode}");
|
||||||
|
// print("Error: ${response.body}");
|
||||||
|
// }
|
||||||
|
// } catch (e) {
|
||||||
|
// print(" Error submitting plan: $e");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return ResponsiveBuilder(builder: (context, sizingInfo) {
|
return ResponsiveBuilder(builder: (context, sizingInfo) {
|
||||||
@ -260,114 +330,146 @@ class _groupState extends State<Group> {
|
|||||||
body: Row(
|
body: Row(
|
||||||
children: [
|
children: [
|
||||||
if (isDesktop) CustomDrawer(isDesktop: true),
|
if (isDesktop) CustomDrawer(isDesktop: true),
|
||||||
Expanded(child: buildOrganizationLayout(isDesktop))
|
Expanded(child: buildData(isDesktop, context))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildData(bool isDesktop, context) {
|
||||||
|
return Container(
|
||||||
|
// margin: const EdgeInsets.only(left: 10.0, right: 15.0, top: 10.0, bottom: 10.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
// color: Colors.amber,
|
||||||
|
color: bodyColor,
|
||||||
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Container(
|
||||||
|
color: bodyColor,
|
||||||
|
child: buildOrganizationLayout(isDesktop),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
color: Colors.white,
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: isDesktop
|
||||||
|
? Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: _buildSubmit(isDesktop),
|
||||||
|
)
|
||||||
|
: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: _buildSubmit(isDesktop),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildOrganizationLayout(isDesktop) {
|
Widget buildOrganizationLayout(isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
margin: isDesktop
|
||||||
// color: Colors.white,
|
? EdgeInsets.all(10.0)
|
||||||
width: double.infinity,
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
height: MediaQuery.of(context).size.height,
|
height: isDesktop
|
||||||
margin: const EdgeInsets.all(8),
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
child: SingleChildScrollView(
|
: MediaQuery.of(context).size.height,
|
||||||
scrollDirection: Axis.vertical,
|
decoration: BoxDecoration(
|
||||||
child: Column(
|
border: isDesktop
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
? Border.all(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
width: 2,
|
||||||
children: [
|
color: Color(0xFFF7F7FB),
|
||||||
Container(
|
)
|
||||||
// color: Colors.white,
|
: null,
|
||||||
padding: const EdgeInsets.all(10),
|
color: Colors.white,
|
||||||
child: Row(
|
// color: Color(0xFFF7F7FB),
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
// color: Colors.amber,
|
||||||
Text(
|
),
|
||||||
"Create Group",
|
child: Column(
|
||||||
style: TextStyle(fontSize: 18),
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
),
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
Container(
|
children: [
|
||||||
color: Color(0xFFE9EBF6),
|
Container(
|
||||||
child: IconButton(
|
// color: Colors.white,
|
||||||
icon: Icon(
|
padding: const EdgeInsets.all(10),
|
||||||
Icons.close,
|
child: Row(
|
||||||
),
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
onPressed: () {
|
children: [
|
||||||
context.go('/group');
|
Text(
|
||||||
},
|
"Create Group",
|
||||||
),
|
style: TextStyle(fontSize: 18),
|
||||||
)
|
),
|
||||||
],
|
// Container(
|
||||||
),
|
// color: Color(0xFFE9EBF6),
|
||||||
|
// child: IconButton(
|
||||||
|
// icon: Icon(
|
||||||
|
// Icons.close,
|
||||||
|
// ),
|
||||||
|
// onPressed: () {
|
||||||
|
// context.go('/group');
|
||||||
|
// },
|
||||||
|
// ),
|
||||||
|
// )
|
||||||
|
],
|
||||||
),
|
),
|
||||||
// SizedBox(
|
),
|
||||||
// height: 5,
|
// SizedBox(
|
||||||
// ),
|
// height: 5,
|
||||||
Container(
|
// ),
|
||||||
margin: const EdgeInsets.all(10),
|
Container(
|
||||||
padding: const EdgeInsets.all(20),
|
margin: const EdgeInsets.all(10),
|
||||||
color: Colors.white,
|
padding: const EdgeInsets.all(20),
|
||||||
height: MediaQuery.of(context).size.height * 0.8,
|
color: Colors.white,
|
||||||
child: Column(
|
height: MediaQuery.of(context).size.height * 0.6,
|
||||||
children: [
|
child: Column(
|
||||||
// Row(
|
children: [
|
||||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
// Row(
|
||||||
// children: [
|
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
// Text(
|
// children: [
|
||||||
// "Mail Settings",
|
// Text(
|
||||||
// style: TextStyle(color: Colors.blueAccent),
|
// "Mail Settings",
|
||||||
// ),
|
// style: TextStyle(color: Colors.blueAccent),
|
||||||
// Icon(
|
// ),
|
||||||
// Icons.keyboard_arrow_down_outlined,
|
// Icon(
|
||||||
// color: Colors.blueAccent,
|
// Icons.keyboard_arrow_down_outlined,
|
||||||
// size: 30,
|
// color: Colors.blueAccent,
|
||||||
// ),
|
// size: 30,
|
||||||
// ],
|
// ),
|
||||||
// ),
|
// ],
|
||||||
isDesktop
|
// ),
|
||||||
? Row(
|
isDesktop
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
? Row(
|
||||||
children: _buildFirstRow(isDesktop),
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
)
|
children: _buildFirstRow(isDesktop),
|
||||||
: Column(
|
)
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
: Column(
|
||||||
children: _buildFirstRow(isDesktop),
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
),
|
children: _buildFirstRow(isDesktop),
|
||||||
|
),
|
||||||
|
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 10,
|
height: 10,
|
||||||
),
|
),
|
||||||
|
|
||||||
isDesktop
|
isDesktop
|
||||||
? Row(
|
? Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: _buildSecondRow(isDesktop),
|
children: _buildSecondRow(isDesktop),
|
||||||
)
|
)
|
||||||
: Column(
|
: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: _buildSecondRow(isDesktop),
|
children: _buildSecondRow(isDesktop),
|
||||||
),
|
),
|
||||||
|
|
||||||
// SizedBox(height: 15),
|
// SizedBox(height: 15),
|
||||||
|
],
|
||||||
Spacer(),
|
)),
|
||||||
isDesktop
|
],
|
||||||
? Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
|
||||||
children: _buildSubmit(isDesktop),
|
|
||||||
)
|
|
||||||
: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: _buildSubmit(isDesktop),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -146,12 +146,41 @@ class _GroupListState extends State<GroupList> {
|
|||||||
|
|
||||||
Widget buildGroupListLayout(bool isDesktop) {
|
Widget buildGroupListLayout(bool isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
decoration: BoxDecoration(
|
||||||
// color: Colors.white,
|
// color: Colors.amber,
|
||||||
width: double.infinity,
|
color: bodyColor,
|
||||||
height: MediaQuery.of(context).size.height,
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
// margin: const EdgeInsets.all(8),
|
child: buildGroupData(isDesktop),
|
||||||
padding: const EdgeInsets.all(8),
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Widget buildGroupListView(bool isDesktop) {
|
||||||
|
// return Container(
|
||||||
|
// child: Text("DAta"),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
Widget buildGroupData(isDesktop) {
|
||||||
|
return Container(
|
||||||
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
color: Colors.white,
|
||||||
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
@ -171,7 +200,7 @@ class _GroupListState extends State<GroupList> {
|
|||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
backgroundColor: layoutColor,
|
backgroundColor: Color(0xFF114D8B),
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
// side: BorderSide(color: , width: 1),
|
// side: BorderSide(color: , width: 1),
|
||||||
@ -204,7 +233,7 @@ class _GroupListState extends State<GroupList> {
|
|||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: MediaQuery.of(context).size.height * 0.899,
|
// height: MediaQuery.of(context).size.height * 0.89,
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
// margin: const EdgeInsets.only(bottom: 10),
|
// margin: const EdgeInsets.only(bottom: 10),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
@ -226,12 +255,6 @@ class _GroupListState extends State<GroupList> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Widget buildGroupListView(bool isDesktop) {
|
|
||||||
// return Container(
|
|
||||||
// child: Text("DAta"),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
Widget buildGroupListView(bool isDesktop) {
|
Widget buildGroupListView(bool isDesktop) {
|
||||||
if (apiAllGroups == null || apiAllGroups!.isEmpty) {
|
if (apiAllGroups == null || apiAllGroups!.isEmpty) {
|
||||||
return Center(child: Text("No groups found."));
|
return Center(child: Text("No groups found."));
|
||||||
@ -253,13 +276,26 @@ class _GroupListState extends State<GroupList> {
|
|||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text("Group Name: ${group['name']}",
|
Row(
|
||||||
style:
|
children: [
|
||||||
TextStyle(fontSize: 13, fontWeight: FontWeight.bold)),
|
Expanded(
|
||||||
|
child: Text("Group Name: ${group['name']}",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 13, fontWeight: FontWeight.bold)),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
SizedBox(height: 4),
|
SizedBox(height: 4),
|
||||||
Text("Description: ${group['description'] ?? 'N/A'}"),
|
Row(
|
||||||
Text("Policy: ${group['domestic_policy_id']}"),
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
Text("Created By : ${group['created_by']}"),
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
"Policy: ${group['domestic_policy_name'] ?? group['international_policy_name']}")),
|
||||||
|
Expanded(child: Text("${group['description'] ?? 'N/A'}")),
|
||||||
|
Expanded(child: Text(" ${group['created_by']}")),
|
||||||
|
],
|
||||||
|
),
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@ -558,7 +558,7 @@ class _OrgSetUpState extends State<OrgSetUp> {
|
|||||||
// if (showMail)
|
// if (showMail)
|
||||||
|
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 3,
|
height: 10,
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
// width: double.infinity,
|
// width: double.infinity,
|
||||||
@ -595,7 +595,7 @@ class _OrgSetUpState extends State<OrgSetUp> {
|
|||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 5,
|
height: 15,
|
||||||
),
|
),
|
||||||
|
|
||||||
Text(
|
Text(
|
||||||
@ -607,7 +607,7 @@ class _OrgSetUpState extends State<OrgSetUp> {
|
|||||||
color: Color(0xFF212121)),
|
color: Color(0xFF212121)),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 5,
|
height: 10,
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -634,11 +634,11 @@ class _OrgSetUpState extends State<OrgSetUp> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 5,
|
height: 15,
|
||||||
),
|
),
|
||||||
|
|
||||||
Row(
|
Column(
|
||||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
"Choose Theme",
|
"Choose Theme",
|
||||||
|
|||||||
@ -126,16 +126,31 @@ class _CreatePlansState extends State<CreatePlan> {
|
|||||||
// ),
|
// ),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
margin: const EdgeInsets.all(8),
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(
|
||||||
|
left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
borderRadius: BorderRadius.circular(12), // rounds all corners
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
),
|
),
|
||||||
|
|
||||||
// color: bodyColor,
|
// color: bodyColor,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.all(20.0),
|
padding: EdgeInsets.all(10.0),
|
||||||
child: CreateNewPlan(
|
child: CreateNewPlan(
|
||||||
key: _createPlanKey,
|
key: _createPlanKey,
|
||||||
bodyColor: bodyColor,
|
bodyColor: bodyColor,
|
||||||
@ -920,6 +935,9 @@ class CreateNewPlansState extends State<CreateNewPlan> {
|
|||||||
)),
|
)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
if (widget.isApprover)
|
if (widget.isApprover)
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
@ -1570,7 +1588,7 @@ class CreateNewPlansState extends State<CreateNewPlan> {
|
|||||||
? Colors.white
|
? Colors.white
|
||||||
: Colors.black,
|
: Colors.black,
|
||||||
fontWeight: _selectedOption == option["value"]
|
fontWeight: _selectedOption == option["value"]
|
||||||
? FontWeight.w600
|
? FontWeight.w500
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -1652,7 +1670,7 @@ class CreateNewPlansState extends State<CreateNewPlan> {
|
|||||||
color:
|
color:
|
||||||
_selectedTripType == "1" ? Colors.white : Colors.black,
|
_selectedTripType == "1" ? Colors.white : Colors.black,
|
||||||
fontWeight:
|
fontWeight:
|
||||||
_selectedTripType == "1" ? FontWeight.w600 : null,
|
_selectedTripType == "1" ? FontWeight.w500 : null,
|
||||||
fontSize: 13),
|
fontSize: 13),
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -1683,6 +1701,7 @@ class CreateNewPlansState extends State<CreateNewPlan> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
width: 15,
|
width: 15,
|
||||||
height: 15,
|
height: 15,
|
||||||
|
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
shape: BoxShape.rectangle,
|
shape: BoxShape.rectangle,
|
||||||
// color: _selectedOption == option["value"]
|
// color: _selectedOption == option["value"]
|
||||||
@ -1724,7 +1743,7 @@ class CreateNewPlansState extends State<CreateNewPlan> {
|
|||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
color: _selectedTripType == "2" ? Colors.white : Colors.black,
|
color: _selectedTripType == "2" ? Colors.white : Colors.black,
|
||||||
fontWeight: _selectedTripType == "2" ? FontWeight.w600 : null,
|
fontWeight: _selectedTripType == "2" ? FontWeight.w500 : null,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
GestureDetector(
|
GestureDetector(
|
||||||
|
|||||||
@ -187,18 +187,46 @@ class _ListPlansState extends State<ListPlans> {
|
|||||||
body: Row(
|
body: Row(
|
||||||
children: [
|
children: [
|
||||||
if (isDesktop) CustomDrawer(isDesktop: true),
|
if (isDesktop) CustomDrawer(isDesktop: true),
|
||||||
Expanded(child: buildTableLayout(isDesktop))
|
Expanded(child: buildGroupListLayout(isDesktop))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildGroupListLayout(bool isDesktop) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
// color: Colors.amber,
|
||||||
|
color: bodyColor,
|
||||||
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
|
child: buildTableLayout(isDesktop),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildTableLayout(isDesktop) {
|
Widget buildTableLayout(isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
color: Colors.white,
|
||||||
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(1.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(10.0),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
|
|||||||
@ -286,7 +286,7 @@ class PolicyCriteriaState extends State<PolicyCriteria> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
flex: 2,
|
flex: 2,
|
||||||
child: Text(
|
child: Text(
|
||||||
"Approver Name",
|
"Approver",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0xFF9E9DBD),
|
color: Color(0xFF9E9DBD),
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
@ -296,7 +296,7 @@ class PolicyCriteriaState extends State<PolicyCriteria> {
|
|||||||
Expanded(
|
Expanded(
|
||||||
flex: 2,
|
flex: 2,
|
||||||
child: Text(
|
child: Text(
|
||||||
"Notification",
|
"Actions",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0xFF9E9DBD),
|
color: Color(0xFF9E9DBD),
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
@ -304,7 +304,7 @@ class PolicyCriteriaState extends State<PolicyCriteria> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
"Select",
|
"Parallel Action",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Color(0xFF9E9DBD),
|
color: Color(0xFF9E9DBD),
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
|
|||||||
@ -145,21 +145,44 @@ class _PolicyListState extends State<PolicyList> {
|
|||||||
body: Row(
|
body: Row(
|
||||||
children: [
|
children: [
|
||||||
if (isDesktop) CustomDrawer(isDesktop: true),
|
if (isDesktop) CustomDrawer(isDesktop: true),
|
||||||
Expanded(child: buildGroupListLayout(isDesktop))
|
Expanded(child: buildGroupList(isDesktop))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildGroupList(bool isDesktop) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
// color: Colors.amber,
|
||||||
|
color: bodyColor,
|
||||||
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
|
child: buildGroupListLayout(isDesktop),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildGroupListLayout(bool isDesktop) {
|
Widget buildGroupListLayout(bool isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
margin: isDesktop
|
||||||
// color: Colors.white,
|
? EdgeInsets.all(10.0)
|
||||||
width: double.infinity,
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
height: MediaQuery.of(context).size.height,
|
padding: const EdgeInsets.all(10),
|
||||||
// margin: const EdgeInsets.all(8),
|
height: isDesktop
|
||||||
padding: const EdgeInsets.all(8),
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
color: Colors.white,
|
||||||
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
@ -179,7 +202,7 @@ class _PolicyListState extends State<PolicyList> {
|
|||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
backgroundColor: layoutColor,
|
backgroundColor: Color(0xFF114D8B),
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
// side: BorderSide(color: , width: 1),
|
// side: BorderSide(color: , width: 1),
|
||||||
@ -212,7 +235,7 @@ class _PolicyListState extends State<PolicyList> {
|
|||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: MediaQuery.of(context).size.height * 0.899,
|
height: MediaQuery.of(context).size.height * 0.8,
|
||||||
padding: const EdgeInsets.all(10),
|
padding: const EdgeInsets.all(10),
|
||||||
// margin: const EdgeInsets.only(bottom: 10),
|
// margin: const EdgeInsets.only(bottom: 10),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
|
|||||||
@ -695,16 +695,30 @@ class _CreateUserFormState extends State<CreateUserForm> {
|
|||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Container(
|
child: Container(
|
||||||
margin: const EdgeInsets.all(8),
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(
|
||||||
|
left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
borderRadius: BorderRadius.circular(12), // rounds all corners
|
// color: Color(0xFFF7F7FB),
|
||||||
),
|
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
// color: bodyColor,
|
// color: bodyColor,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.all(20.0),
|
padding: EdgeInsets.all(0.0),
|
||||||
child: _buildUserDetails(isDesktop),
|
child: _buildUserDetails(isDesktop),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -253,7 +253,7 @@ class _UserListScreenState extends State<UserListScreen> {
|
|||||||
children: [
|
children: [
|
||||||
if (isDesktop) CustomDrawer(isDesktop: true),
|
if (isDesktop) CustomDrawer(isDesktop: true),
|
||||||
// const Expanded(child: Center(child: Text("User Page Content"))),
|
// const Expanded(child: Center(child: Text("User Page Content"))),
|
||||||
Expanded(child: buildUserTable(isDesktop)),
|
Expanded(child: buildGroupList(isDesktop)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -261,9 +261,37 @@ class _UserListScreenState extends State<UserListScreen> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget buildGroupList(bool isDesktop) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
// color: Colors.amber,
|
||||||
|
color: bodyColor,
|
||||||
|
border: Border.all(color: Color(0xFFF7F7FB), width: 3.5)),
|
||||||
|
child: buildUserTable(isDesktop),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget buildUserTable(bool isDesktop) {
|
Widget buildUserTable(bool isDesktop) {
|
||||||
return Container(
|
return Container(
|
||||||
color: bodyColor,
|
margin: isDesktop
|
||||||
|
? EdgeInsets.all(10.0)
|
||||||
|
: EdgeInsets.only(left: 20.0, bottom: 20.0, top: 10.0, right: 20.0),
|
||||||
|
// padding: const EdgeInsets.all(10),
|
||||||
|
height: isDesktop
|
||||||
|
? MediaQuery.of(context).size.height * 0.98
|
||||||
|
: MediaQuery.of(context).size.height,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: isDesktop
|
||||||
|
? Border.all(
|
||||||
|
width: 2,
|
||||||
|
color: Color(0xFFF7F7FB),
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
color: Colors.white,
|
||||||
|
// color: Color(0xFFF7F7FB),
|
||||||
|
|
||||||
|
// color: Colors.amber,
|
||||||
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(10.0),
|
padding: const EdgeInsets.all(10.0),
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|||||||
@ -136,14 +136,15 @@ class _CustomDrawerState extends State<CustomDrawer> {
|
|||||||
children: [
|
children: [
|
||||||
Row(
|
Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
selectedOrg?['logo'] != null
|
selectedOrg?['logo'] != null
|
||||||
? ClipOval(
|
? ClipRect(
|
||||||
child: Image.network(
|
child: Image.network(
|
||||||
selectedOrg!['logo'],
|
selectedOrg!['logo'],
|
||||||
width: 50,
|
width: 150,
|
||||||
height: 50,
|
height: 50,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.fitWidth,
|
||||||
errorBuilder: (context, error, stackTrace) {
|
errorBuilder: (context, error, stackTrace) {
|
||||||
return const CircleAvatar(
|
return const CircleAvatar(
|
||||||
radius: 20,
|
radius: 20,
|
||||||
@ -155,8 +156,12 @@ class _CustomDrawerState extends State<CustomDrawer> {
|
|||||||
)
|
)
|
||||||
: const CircleAvatar(
|
: const CircleAvatar(
|
||||||
radius: 20,
|
radius: 20,
|
||||||
backgroundColor: Colors.amber,
|
backgroundColor: Colors.white,
|
||||||
child: Icon(Icons.add_a_photo, size: 10),
|
child: Icon(
|
||||||
|
Icons.add_a_photo,
|
||||||
|
size: 10,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user