This commit is contained in:
Hamza-Ayed
2024-11-03 13:39:16 +02:00
parent 3e88059166
commit 5919554eaa
20 changed files with 1188 additions and 24 deletions

View File

@@ -8,6 +8,7 @@ import 'package:sefer_admin1/controller/admin/static_controller.dart';
import 'package:sefer_admin1/controller/notification_controller.dart';
import 'package:sefer_admin1/views/admin/captain/drivers_cant_registe.dart';
import 'package:sefer_admin1/views/admin/captain/register_captain.dart';
import 'package:sefer_admin1/views/admin/employee/employee_page.dart';
import 'package:sefer_admin1/views/widgets/elevated_btn.dart';
import 'package:sefer_admin1/views/widgets/my_textField.dart';
import 'package:sefer_admin1/views/widgets/mycircular.dart';
@@ -19,6 +20,8 @@ import '../../controller/functions/gemeni.dart';
import '../../print.dart';
import '../widgets/my_scafold.dart';
import 'captain/captain.dart';
import 'drivers/driver_the_best.dart';
import 'packages.dart';
import 'passenger/passenger.dart';
import 'rides/rides.dart';
import 'static/static.dart';
@@ -410,7 +413,25 @@ class AdminHomePage extends StatelessWidget {
onPressed: () async {
await Get.put(RegisterCaptainController())
.getDriverNotCompleteRegistration();
Get.to(() => DriversCantRegister());
Get.to(() => const DriversCantRegister());
},
),
AdminWidgetsDashBoard(
title: 'update packages'.tr,
onPressed: () async {
Get.to(() => PackageUpdateScreen());
},
),
AdminWidgetsDashBoard(
title: 'Employee'.tr,
onPressed: () async {
Get.to(() => EmployeePage());
},
),
AdminWidgetsDashBoard(
title: 'Drivers the best'.tr,
onPressed: () async {
Get.to(() => DriverTheBest());
},
),

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sefer_admin1/controller/functions/wallet.dart';
import 'package:sefer_admin1/views/admin/wallet/wallet.dart';
import 'package:sefer_admin1/views/widgets/my_scafold.dart';
import '../../../controller/drivers/driverthebest.dart';
class DriverTheBest extends StatelessWidget {
const DriverTheBest({super.key});
@override
Widget build(BuildContext context) {
Get.put(Driverthebest());
return MyScafolld(
title: 'Best Drivers'.tr,
body: [
GetBuilder<Driverthebest>(builder: (driverthebest) {
return driverthebest.driver.isNotEmpty
? ListView.builder(
itemCount: driverthebest.driver.length,
itemBuilder: (context, index) {
final driver = driverthebest.driver[index];
return ListTile(
leading: CircleAvatar(
child: Text(
((driver['driver_count'] * 5) / 3600)
.toStringAsFixed(0),
),
),
title: Text(driver['name_arabic'] ?? 'Unknown Name'),
subtitle: Text('Phone: ${driver['phone'] ?? 'N/A'}'),
trailing: IconButton(
onPressed: () async {
Get.defaultDialog(
title:
'are you sure to pay to this driver gift'.tr,
middleText: '',
onConfirm: () async {
final wallet = Get.put(WalletController());
await wallet.addPaymentToDriver('200',
driver['id'].toString(), driver['token']);
await wallet.addSeferWallet(
'200', driver['id'].toString());
},
onCancel: () => Get.back());
},
icon: const Icon(Icons.wallet_giftcard_rounded),
),
);
},
)
: const Center(
child: Text('No drivers available.'),
);
})
],
isleading: true,
);
}
}

View File

@@ -0,0 +1,185 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sefer_admin1/constant/colors.dart';
import 'package:sefer_admin1/constant/style.dart';
import 'package:sefer_admin1/controller/employee_controller/employee_controller.dart';
import 'package:sefer_admin1/controller/functions/launch.dart';
import 'package:sefer_admin1/views/widgets/elevated_btn.dart';
import 'package:sefer_admin1/views/widgets/my_scafold.dart';
import 'package:sefer_admin1/views/widgets/my_textField.dart';
import '../../../constant/links.dart';
import '../../../controller/functions/upload_image copy.dart';
class EmployeePage extends StatelessWidget {
const EmployeePage({super.key});
@override
Widget build(BuildContext context) {
Get.put(EmployeeController());
return GetBuilder<EmployeeController>(builder: (employeeController) {
return Scaffold(
appBar: AppBar(
title: Text('Employee Page'.tr),
),
body: ListView.builder(
itemCount: employeeController
.employee.length, // Set the item count based on the employee list
itemBuilder: (context, index) {
// Get the employee data for the current index
var employee = employeeController.employee[index];
// Return a widget to display the employee information
return Padding(
padding: const EdgeInsets.all(3.0),
child: Container(
decoration: AppStyle.boxDecoration1,
child: ListTile(
trailing: IconButton(
onPressed: () {
Get.to(() => EmployeeDetails(
index: index,
));
},
icon: Icon(
Icons.shop_two,
color: employee['status'].toString().contains('ممتاز')
? AppColor.greenColor
: AppColor.accentColor,
),
),
title: Column(
children: [
Text(employee['name']),
Text(
'Phone: ${employee['phone']}\nEducation: ${employee['education']}'),
Text('Status: ${employee['status']}'),
],
), // Display employee name
onTap: () {
// Add any action you want when the employee is tapped
},
leading: IconButton(
onPressed: () {
makePhoneCall(employee['phone'].toString());
// launchCommunication(
// 'phone', employee['phone'].toString(), '');
},
icon: const Icon(Icons.phone),
),
),
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
employeeController.id = employeeController.generateRandomId(8);
Get.to(
employeeFields(employeeController),
);
}, // Icon to display
backgroundColor: Colors.blue, // Button color (optional)
tooltip: 'Add Employee',
child: const Icon(Icons.add), // Tooltip text when long-pressed
),
);
});
}
Scaffold employeeFields(EmployeeController employeeController) {
return Scaffold(
appBar: AppBar(),
body: Form(
key: employeeController.formKey,
child: SizedBox(
height: 500,
child: ListView(
children: [
MyElevatedButton(
title: 'front id',
onPressed: () async {
await ImageController().choosImage(AppLink.uploadEgypt,
'idFrontEmployee', employeeController.id);
}),
MyElevatedButton(
title: 'back id',
onPressed: () async {
await ImageController().choosImage(AppLink.uploadEgypt,
'idbackEmployee', employeeController.id);
}),
MyTextForm(
controller: employeeController.name,
label: 'name',
hint: 'name',
type: TextInputType.name),
MyTextForm(
controller: employeeController.education,
label: 'education',
hint: 'education',
type: TextInputType.name),
MyTextForm(
controller: employeeController.site,
label: 'site',
hint: 'site',
type: TextInputType.name),
MyTextForm(
controller: employeeController.phone,
label: 'phone',
hint: 'phone',
type: TextInputType.phone),
MyTextForm(
controller: employeeController.status,
label: 'status',
hint: 'status',
type: TextInputType.name),
],
),
),
),
bottomNavigationBar: MyElevatedButton(
title: 'upload',
onPressed: () async {
if (employeeController.formKey.currentState!.validate()) {
await employeeController.addEmployee();
}
},
),
);
}
}
class EmployeeDetails extends StatelessWidget {
const EmployeeDetails({super.key, required this.index});
final int index;
@override
Widget build(BuildContext context) {
return MyScafolld(
title: 'Details',
isleading: true,
body: [
GetBuilder<EmployeeController>(builder: (employeeController) {
return Column(
children: [
SizedBox(
height: 200,
width: 400,
child: Image.network(
'https://sefer.click/sefer/card_image/idFrontEmployee-${employeeController.employee[index]['id']}.jpg'),
),
const SizedBox(
height: 10,
),
SizedBox(
height: 200,
width: 400,
child: Image.network(
'https://sefer.click/sefer/card_image/idFrontEmployee-${employeeController.employee[index]['id']}.jpg'),
)
],
);
})
],
);
}
}

View File

@@ -0,0 +1,107 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:sefer_admin1/constant/links.dart';
import 'package:sefer_admin1/controller/functions/crud.dart';
import 'package:sefer_admin1/views/widgets/my_textField.dart';
import '../../print.dart';
class PackageUpdateScreen extends StatelessWidget {
final PackageController packageController = Get.put(PackageController());
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Package Update'),
),
body: GetBuilder<PackageController>(builder: (packageController) {
return Center(
child: ListView.builder(
itemCount: packageController.packages.length,
itemBuilder: (context, index) {
var package = packageController.packages[index];
return ListTile(
title: Text(package['appName']),
subtitle: Text(
'Platform: ${package['platform']} \nVersion: ${package['version']}'),
trailing: const Icon(Icons.update),
onTap: () {
Get.defaultDialog(
title: 'Update',
middleText: '',
content: Column(
children: [
Text(package['appName']),
Text(package['platform']),
Text(package['version']),
MyTextForm(
controller: packageController.versionController,
label: package['version'].toString(),
hint: package['version'].toString(),
type: const TextInputType.numberWithOptions(
decimal: true),
),
],
),
onConfirm: () async {
await packageController.updatePackages(
package['id'].toString(),
packageController.versionController.text.toString(),
);
},
onCancel: () {},
);
},
);
},
),
);
}),
);
}
}
class PackageController extends GetxController {
List packages = []; // Observable list to hold package info
var isLoading = false.obs;
final versionController = TextEditingController();
final formKey = GlobalKey<FormState>();
@override
void onInit() {
super.onInit();
fetchPackages();
}
// Method to fetch package data from API
fetchPackages() async {
var response = await CRUD().get(link: AppLink.getPackages, payload: {});
if (response != 'failure') {
var jsonData = jsonDecode(response);
packages = jsonData['message'];
update();
Log.print('jsonData: ${jsonData}');
}
}
updatePackages(String id, version) async {
var response = await CRUD().post(
link: AppLink.updatePackages,
payload: {
"id": id,
"version": version,
},
);
Log.print('response: ${response}');
if (response != 'failure') {
Get.back();
fetchPackages();
} else {
Get.snackbar('error', 'message');
}
}
}

View File

@@ -354,6 +354,18 @@ class StaticDash extends StatelessWidget {
show: true,
color: Colors.green.withOpacity(0.3)),
),
LineChartBarData(
spots: staticController
.chartDataEmployeeSefer4,
isCurved: true,
color:
Colors.yellow, // Custom color for Mena
barWidth: 3,
dotData: const FlDotData(show: true),
belowBarData: BarAreaData(
show: true,
color: Colors.yellow.withOpacity(0.3)),
),
],
titlesData: const FlTitlesData(
bottomTitles: AxisTitles(

View File

@@ -51,7 +51,7 @@ class MyTextForm extends StatelessWidget {
return 'Please enter a valid email.'.tr;
}
} else if (type == TextInputType.phone) {
if (value.length != 10) {
if (value.length != 11) {
return 'Please enter a valid phone number.'.tr;
}
}