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

07-05-2025 By Sai Srinivas

Second Commit
Inventory Module and Attendance related screens
parent b76cf1af
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" /> <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application <application
android:label="Gen ERP" android:label="Gen ERP"
android:name="${applicationName}" android:name="${applicationName}"
......
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
kotlin.jvm.target.validation.mode = IGNORE
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/services/api_calling.dart';
import 'package:intl/intl.dart';
class Atteendacehistorynotifier with ChangeNotifier {
// Private State
DateTime _month = DateTime.now();
late int _monthNo;
late DateTime _presentMonth = DateTime.now();
int _presentDays = 0;
int _absentDays = 0;
int _holidays = 0;
int _latePenalties = 0;
String _date = "";
String _intime = "";
String _outtime = "";
String _inlocation = "";
String _outlocation = "";
String _penalties = "";
String _selectedDate = "";
int? _selectedIndex;
int? _currentDayIndex;
bool _initialRenderDone = true;
bool _isLoading = true;
List<Map<String, dynamic>> _dateArrayList = [];
List<Map<String, dynamic>> _penaltyArrayList = [];
String? _empId;
String? _sessionId;
String _year = "";
String? _firstKey;
dynamic _firstValue;
int _startingIndex = 0;
// Public Getters
DateTime get month => _month;
int get presentDays => _presentDays;
int get absentDays => _absentDays;
int get holidays => _holidays;
int get latePenalties => _latePenalties;
String get date => _date;
String get intime => _intime;
String get outtime => _outtime;
String get inlocation => _inlocation;
String get outlocation => _outlocation;
String get penalties => _penalties;
String get selectedDate => _selectedDate;
int? get selectedIndex => _selectedIndex;
int? get currentDayIndex => _currentDayIndex;
bool get initialRenderDone => _initialRenderDone;
bool get isLoading => _isLoading;
List<Map<String, dynamic>> get dateArrayList => _dateArrayList;
List<Map<String, dynamic>> get penaltyArrayList => _penaltyArrayList;
int get startingIndex => _startingIndex;
AttendanceProvider() {
_init();
}
Future<void> _init() async {
_month = DateTime.now();
_presentMonth = _month;
await _getMonth(DateFormat('MMMM').format(_month));
await dateWiseAttendance(DateFormat('yyyy-MM-dd').format(DateTime.now()));
notifyListeners();
}
Future<void> refresh() async {
_isLoading = true;
_dateArrayList = [];
_penaltyArrayList = [];
_initialRenderDone = true;
_month = DateTime.now();
_presentMonth = _month;
await _getMonth(DateFormat('MMMM').format(_month));
await dateWiseAttendance(DateFormat('yyyy-MM-dd').format(DateTime.now()));
notifyListeners();
}
void setPreviousMonth() async {
_month = DateTime(_month.year, _month.month - 1);
_resetForNewMonth();
if (DateFormat('MMMM yyyy').format(_presentMonth) ==
DateFormat('MMMM yyyy').format(_month)) {
_initialRenderDone = true;
_month = _presentMonth;
}
await _getMonth(DateFormat('MMMM').format(_month));
}
void setNextMonth() async {
_month = DateTime(_month.year, _month.month + 1);
_resetForNewMonth();
if (DateFormat('MMMM yyyy').format(_presentMonth) ==
DateFormat('MMMM yyyy').format(_month)) {
_initialRenderDone = true;
_month = _presentMonth;
}
await _getMonth(DateFormat('MMMM').format(_month));
}
void _resetForNewMonth() {
_dateArrayList = [];
_penaltyArrayList = [];
_selectedIndex = 0;
_currentDayIndex = 0;
_isLoading = true;
_date = _intime = _outtime = _inlocation = _outlocation = _penalties = "";
notifyListeners();
}
Future<void> _getMonth(String monthName) async {
_empId = await SharedpreferencesService().getString("UserId");
_sessionId = await SharedpreferencesService().getString("Session_id");
_monthNo = DateFormat('MMMM').parse(monthName).month;
_year = DateFormat('yyyy').format(_month);
await _loadAttendanceDetails();
}
Future<void> _loadAttendanceDetails() async {
try {
final data = await ApiCalling.LoadAttendanceDetails(_empId, _sessionId, _monthNo, _year);
if (data != null) {
final decoded = jsonDecode(data);
_presentDays = decoded['present_days'] ?? 0;
_absentDays = decoded['absent_days'] ?? 0;
_holidays = decoded['holidays'] ?? 0;
_latePenalties = decoded['late_penalties'] ?? 0;
Map<String, dynamic>? dateArray = decoded['date_array'];
Map<String, dynamic>? penaltyArray = decoded['late_penalty_array'];
if (dateArray != null) {
_firstKey = dateArray.keys.first;
_firstValue = dateArray[_firstKey];
_dateArrayList = dateArray.entries.map((e) {
final parts = e.key.split("-");
final date = parts[2];
return {date: e.value};
}).toList();
if (_firstKey != null) {
final parsedDate = DateTime.tryParse(_firstKey!);
if (parsedDate != null) {
List<String> weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
final dayOfWeek = DateFormat('EEEE').format(parsedDate);
_startingIndex = weekdays.indexOf(dayOfWeek);
}
}
}
if (penaltyArray != null) {
_penaltyArrayList = penaltyArray.entries.map((e) => {e.key: e.value}).toList();
}
_isLoading = false;
notifyListeners();
}
} catch (e) {
print("Error loading attendance: $e");
}
}
Future<void> dateWiseAttendance(String selected) async {
_empId = await SharedpreferencesService().getString("UserId");
_sessionId = await SharedpreferencesService().getString("Session_id");
try {
final data = await ApiCalling.DateWiseAttendanceApi(_empId, _sessionId, selected);
if (data != null) {
_date = data.date!;
_intime = data.intime!;
_outtime = data.outtime!;
_inlocation = data.inlocation!;
_outlocation = data.outlocation!;
_penalties = data.latePenalties!;
notifyListeners();
}
} catch (e) {
print("DateWiseAttendance error: $e");
}
}
void selectDate(int index, String selected, String? penaltyKey) {
_selectedIndex = index;
_initialRenderDone = false;
_selectedDate = selected;
if (penaltyKey != null) {
dateWiseAttendance(penaltyKey);
}
notifyListeners();
}
}
import 'dart:convert';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/screens/LoginScreen.dart';
import 'package:generp/services/api_calling.dart';
import 'package:intl/intl.dart';
import '../Models/AttendanceListResponse.dart';
import '../Utils/commonServices.dart';
class AttendanceNotifier extends ChangeNotifier {
List<AttHistory> _attHistory = [];
int _attendanceStatus = 0;
bool _isLoading = false;
String _date = "";
String _intime = "";
String _outtime = "";
String _inlocation = "";
String _outlocation = "";
String _penalties = "";
String _selectedDate = "";
DateTime _month = DateTime.now();
late int _monthNo;
DateTime _present_month = DateTime.now();
String _year = "";
dynamic _presentDays = 0;
dynamic _absentDays = 0;
dynamic _holidays = 0;
dynamic _latePenalties = 0;
int? _selectedIndex;
int? _currentDayIndex;
bool _initialRenderDone = true;
String? _dateColor;
List<Map<String, dynamic>> _dateArrayList = [];
List<Map<String, dynamic>> _penalityArrayList = [];
List<AttHistory> get attendanceHistory => _attHistory;
int get attendanceStatus => _attendanceStatus;
bool get isLoading => _isLoading;
String get date => _date;
String get intime => _intime;
String get outtime => _outtime;
String get inlocation => _inlocation;
String get outlocation => _outlocation;
String get penalties => _penalties;
String get selectedDate => _selectedDate;
dynamic get presentDays => _presentDays;
dynamic get absentDays => _absentDays;
dynamic get holidays => _holidays;
dynamic get latePenalties => _latePenalties;
DateTime get month => _month;
DateTime get present_month => _present_month;
String get year => _year;
int get monthNo => _monthNo;
String? get dateColor => _dateColor;
int? get selectedIndex => _selectedIndex;
int? get currentDayIndex => _currentDayIndex;
bool get initialRenderDone => _initialRenderDone;
List<Map<String, dynamic>> get dateArrayList => _dateArrayList;
List<Map<String, dynamic>> get penalityArrayList => _penalityArrayList;
set currentDayIndex(int? value) {
_currentDayIndex = value;
}
set selectedDate(value) {
_selectedDate = value;
}
Future<void> init(homeprov, context) async {
_month = DateTime.now();
_present_month = _month;
await getMonth(DateFormat('MMMM').format(_month), homeprov, context);
String formattedDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
dateWiseAttendance(homeprov, formattedDate, context);
}
Future<void> getAttendanceList(homeprov, BuildContext context) async {
try {
final data = await ApiCalling.AttendanceListApi(homeprov.empId, homeprov.session);
if (data != null) {
if (data.sessionExists == 1) {
_attHistory = data.attHistory!;
_attendanceStatus = data.attStatus!;
_isLoading = false;
notifyListeners();
} else {
_isLoading = true;
SharedpreferencesService().clearPreferences();
Navigator.push(context, MaterialPageRoute(builder: (context) => LoginScreen()));
}
} else {
toast(context, "Something went wrong, Please try again.");
}
} on Exception catch (e) {
print("$e");
}
}
Future<void> dateWiseAttendance(homeprov, Selecteddate, BuildContext context) async {
try {
final data = await ApiCalling.DateWiseAttendanceApi(homeprov.empId, homeprov.session, Selecteddate);
if (data != null) {
_date = data.date ?? "";
_intime = data.intime ?? "";
_outtime = data.outtime ?? "";
_inlocation = data.inlocation ?? "";
_outlocation = data.outlocation ?? "";
_penalties = data.latePenalties ?? "";
notifyListeners();
} else {
toast(context, "Something went wrong, Please try again.");
}
} on Exception catch (e) {
print("$e");
}
}
Future<void> loadAttendanceDetails(homeprov, BuildContext context) async {
try {
final data = await ApiCalling.LoadAttendanceDetails(homeprov.empId, homeprov.session, monthNo, year);
if (data != null) {
final decodedResponse = jsonDecode(data);
_presentDays = decodedResponse['present_days'] ?? 0;
_absentDays = decodedResponse['absent_days'] ?? 0;
_holidays = decodedResponse['holidays'] ?? 0;
_latePenalties = decodedResponse['late_penalties'] ?? 0;
Map<String, dynamic>? dateArray = decodedResponse['date_array'];
Map<String, dynamic>? latePenaltyArray = decodedResponse['late_penalty_array'];
_dateArrayList = [];
_penalityArrayList = [];
// Calculate the date range: 26th of previous month to 25th of current month
DateTime startDate = DateTime(_month.year, _month.month - 1, 26);
DateTime endDate = DateTime(_month.year, _month.month, 25);
// Generate date and penalty arrays
for (DateTime date = startDate; date.isBefore(endDate.add(Duration(days: 1))); date = date.add(Duration(days: 1))) {
String dayStr = date.day.toString();
String dateKey = DateFormat('yyyy-MM-dd').format(date);
String color = dateArray != null && dateArray.containsKey(dateKey) ? dateArray[dateKey] : '';
_dateArrayList.add({dayStr: color});
int penalty = latePenaltyArray != null && latePenaltyArray.containsKey(dateKey) ? latePenaltyArray[dateKey] : 0;
_penalityArrayList.add({dateKey: penalty});
}
_isLoading = false;
notifyListeners();
} else {
toast(context, "Null response from server.");
}
} catch (e) {
print("Exception: $e");
toast(context, "Error loading attendance details.");
}
}
Future<void> getMonth(String monthName, homeprov, context) async {
switch (monthName) {
case "January":
_monthNo = 1;
break;
case "February":
_monthNo = 2;
break;
case "March":
_monthNo = 3;
break;
case "April":
_monthNo = 4;
break;
case "May":
_monthNo = 5;
break;
case "June":
_monthNo = 6;
break;
case "July":
_monthNo = 7;
break;
case "August":
_monthNo = 8;
break;
case "September":
_monthNo = 9;
break;
case "October":
_monthNo = 10;
break;
case "November":
_monthNo = 11;
break;
case "December":
_monthNo = 12;
break;
default:
_monthNo = 1;
break;
}
_year = DateFormat('yyyy').format(month);
notifyListeners();
await loadAttendanceDetails(homeprov, context);
}
Future<void> refresh(homeprov, context) async {
await Future.delayed(const Duration(seconds: 2));
_isLoading = true;
_dateArrayList = [];
_penalityArrayList = [];
_initialRenderDone = true;
_month = DateTime.now();
await getMonth(DateFormat('MMMM').format(_month), homeprov, context);
String formattedDate = DateFormat('yyyy-MM-dd').format(DateTime.now());
dateWiseAttendance(homeprov, formattedDate, context);
_present_month = month;
notifyListeners();
}
void setPreviousMonth(homeprov, context) {
_month = DateTime(month.year, month.month - 1);
resetForNewMonth();
if (DateFormat('MMMM').format(_present_month) == DateFormat('MMMM').format(_month) &&
DateFormat('yyyy').format(_present_month) == DateFormat('yyyy').format(_month)) {
_initialRenderDone = true;
_month = present_month;
}
getMonth(DateFormat('MMMM').format(_month), homeprov, context);
}
class AttendanceNotifier extends ChangeNotifier{ void setNextMonth(homeprov, context) {
_month = DateTime(month.year, month.month + 1);
resetForNewMonth();
if (DateFormat('MMMM').format(_present_month) == DateFormat('MMMM').format(_month) &&
DateFormat('yyyy').format(_present_month) == DateFormat('yyyy').format(_month)) {
_initialRenderDone = true;
_month = present_month;
}
getMonth(DateFormat('MMMM').format(_month), homeprov, context);
}
void resetForNewMonth() {
_dateArrayList = [];
_penalityArrayList = [];
_selectedIndex = 0;
_currentDayIndex = 0;
_isLoading = true;
_initialRenderDone = false;
_date = _intime = _outtime = _inlocation = _outlocation = _penalties = "";
notifyListeners();
}
} }
\ No newline at end of file
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geolocator/geolocator.dart' as geo_location;
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:image_picker/image_picker.dart';
import 'package:location/location.dart' as Location;
import 'package:provider/provider.dart';
import '../Utils/SharedpreferencesService.dart';
import '../Utils/background_service.dart';
import '../Utils/commonServices.dart';
import '../services/api_calling.dart';
class CheckInOutProvider with ChangeNotifier {
final ImagePicker _picker = ImagePicker();
TextEditingController locationController = TextEditingController();
GoogleMapController? mapController;
LatLng startLocation = const LatLng(17.439112226708446, 78.43292499146135);
LatLng? currentLocationLatLng;
String latlongs = "";
Set<Marker> markers = {};
Location.LocationData? currentLocation;
bool isLocationEnabled = false;
bool hasLocationPermission = false;
Timer? _timer;
File? _image;
int imagePicked = 0;
bool isLoading = true;
String? validateLocation;
String? empId;
String? sessionId;
File? get image => _image;
set image(value){
_image = value;
}
Future<void> getCurrentLocation() async {
try {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: geo_location.LocationAccuracy.high);
currentLocationLatLng = LatLng(position.latitude, position.longitude);
notifyListeners();
} catch (e) {
print("Error getting current location: $e");
}
}
Future<void> getLocationPermission(BuildContext context) async {
isLocationEnabled = await Geolocator.isLocationServiceEnabled();
LocationPermission permission = await Geolocator.checkPermission();
hasLocationPermission = permission == LocationPermission.always ||
permission == LocationPermission.whileInUse;
final Location.Location location = Location.Location();
bool serviceEnabled = await location.serviceEnabled();
if (!serviceEnabled) {
serviceEnabled = await location.requestService();
if (!serviceEnabled) {
return;
}
}
if (!isLocationEnabled || !hasLocationPermission) {
permission = await Geolocator.requestPermission();
if (permission != LocationPermission.always &&
permission != LocationPermission.whileInUse) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Location Permission Required'),
content: Text(
'Please allow the app to access your location for core functionality.'),
actions: <Widget>[
TextButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
overlayColor: MaterialStateProperty.all(Colors.white),
),
onPressed: () async {
// await openAppSettings();
// Navigator.of(context).pop();
// Navigator.pushReplacement(
// context,
// MaterialPageRoute(builder: (context) => Attendance()),
// );
},
child: Text('OK'),
),
],
);
},
);
return;
}
}
final Location.LocationData locData = await location.getLocation();
if (locData != null) {
currentLocation = locData;
currentLocationLatLng = LatLng(locData.latitude!, locData.longitude!);
isLoading = false;
markers.clear();
markers.add(Marker(
markerId: MarkerId('current_location'),
position: LatLng(locData.latitude!, locData.longitude!),
infoWindow: InfoWindow(title: 'Current Location'),
icon: BitmapDescriptor.defaultMarker,
));
latlongs = '${locData.latitude},${locData.longitude}';
mapController?.animateCamera(
CameraUpdate.newLatLng(LatLng(locData.latitude!, locData.longitude!)),
);
notifyListeners();
}
}
void onCameraMove(CameraPosition position,context) {
_timer?.cancel();
_timer = Timer(Duration(seconds: 1), () {
getLocationPermission(context);
});
}
Future<void> imgFromCamera(BuildContext context,attendanceStatus) async {
if (locationController.text.isEmpty) {
validateLocation = "Please Enter location";
notifyListeners();
return;
}
validateLocation = "";
try {
final XFile? galleryImage = await _picker.pickImage(
source: ImageSource.camera,
imageQuality: 50,
preferredCameraDevice: CameraDevice.front,
);
if (galleryImage != null) {
_image = File(galleryImage.path);
imagePicked = 1;
var file = await FlutterImageCompress.compressWithFile(galleryImage.path);
if (file != null) {
if(attendanceStatus==0){
checkIn(context);
}else if(attendanceStatus==1){
checkOut(context);
}
}
}
notifyListeners();
} catch (e) {
debugPrint("Error capturing image: ${e.toString()}");
}
}
Future<void> checkIn(BuildContext context) async {
empId = await SharedpreferencesService().getString("UserId");
sessionId = await SharedpreferencesService().getString("Session_id");
if (kDebugMode) {
print(empId);
print(sessionId);
print(locationController.text);
print(latlongs);
print(_image);
}
try {
isLoading = true;
notifyListeners();
final data = await ApiCalling.CheckInApi(
empId, sessionId, locationController.text, latlongs, _image);
if (data != null) {
if (data.error == 0) {
toast(context, "CheckedIn Successfully");
BackgroundLocation.startLocationService();
Navigator.pop(context, true);
} else {
toast(context, "CheckedIn UnSuccessfull");
print(data.error.toString());
}
} else {
toast(context, "Something went wrong, Please try again.");
}
} catch (e) {
print("Error during check-in: $e");
toast(context, "Error during check-in.");
} finally {
isLoading = false;
notifyListeners();
}
}
Future<void> checkOut(BuildContext context) async {
empId = await SharedpreferencesService().getString("UserId");
sessionId = await SharedpreferencesService().getString("Session_id");
try {
isLoading = true;
notifyListeners();
final data = await ApiCalling.CheckOutApi(
empId, sessionId, locationController.text, latlongs, _image);
if (data != null) {
if (data.error == 0) {
toast(context, "CheckedIn Successfully");
BackgroundLocation.startLocationService();
Navigator.pop(context, true);
} else {
toast(context, "CheckedIn UnSuccessfull");
print(data.error.toString());
}
} else {
toast(context, "Something went wrong, Please try again.");
}
} catch (e) {
print("Error during check-in: $e");
toast(context, "Error during check-in.");
} finally {
isLoading = false;
notifyListeners();
}
}
void dispose() {
locationController.dispose();
_timer?.cancel();
}
}
...@@ -20,10 +20,9 @@ class HomescreenNotifier extends ChangeNotifier { ...@@ -20,10 +20,9 @@ class HomescreenNotifier extends ChangeNotifier {
String _whizzdomPageUrl = ""; String _whizzdomPageUrl = "";
String _roleStatus = ""; String _roleStatus = "";
int _att_status = 0; int _att_status = 0;
int _loginStatus = 0;
bool _isLoading = true; bool _isLoading = true;
var _Sessionid; var _Sessionid;
var _onlineStatus; String? _onlineStatus = "Offline";
String get username => _username; String get username => _username;
String get email => _email; String get email => _email;
...@@ -34,9 +33,8 @@ class HomescreenNotifier extends ChangeNotifier { ...@@ -34,9 +33,8 @@ class HomescreenNotifier extends ChangeNotifier {
String get whizzdomPageUrl => _whizzdomPageUrl; String get whizzdomPageUrl => _whizzdomPageUrl;
String get roleStatus => _roleStatus; String get roleStatus => _roleStatus;
int get att_status => _att_status; int get att_status => _att_status;
int get loginStatus => _loginStatus;
get Sessionid => _Sessionid; get Sessionid => _Sessionid;
get onlineStatus => _onlineStatus; String? get onlineStatus => _onlineStatus;
...@@ -57,7 +55,6 @@ class HomescreenNotifier extends ChangeNotifier { ...@@ -57,7 +55,6 @@ class HomescreenNotifier extends ChangeNotifier {
Future<void> DashboardApiFunction(context) async { Future<void> DashboardApiFunction(context) async {
try { try {
_loginStatus = await SharedpreferencesService().getInt("loginStatus") ?? 0;
_empId = await SharedpreferencesService().getString("UserId") ?? ""; _empId = await SharedpreferencesService().getString("UserId") ?? "";
_username = await SharedpreferencesService().getString("UserName") ?? ""; _username = await SharedpreferencesService().getString("UserName") ?? "";
_email = await SharedpreferencesService().getString("UserEmail") ?? ""; _email = await SharedpreferencesService().getString("UserEmail") ?? "";
...@@ -98,14 +95,14 @@ class HomescreenNotifier extends ChangeNotifier { ...@@ -98,14 +95,14 @@ class HomescreenNotifier extends ChangeNotifier {
_att_status = data.attStatus ?? 0; _att_status = data.attStatus ?? 0;
// BatteryOptimisation(); // BatteryOptimisation();
// checkOptimisation(), // checkOptimisation(),
if (att_status == 0) { if (_att_status == 0) {
webSocketManager.close(); webSocketManager.close();
BackgroundLocation.stopLocationService(); BackgroundLocation.stopLocationService();
_onlineStatus = "Offline"; _onlineStatus = "Offline";
// print("setstatus:$setstatus"); // print("setstatus:$setstatus");
} else if (att_status == 1) { } else if (_att_status == 1) {
// print("att_status:$att_status"); // print("att_status:$att_status");
DateTime Date1; DateTime Date1;
DateTime Date2; DateTime Date2;
...@@ -141,7 +138,7 @@ class HomescreenNotifier extends ChangeNotifier { ...@@ -141,7 +138,7 @@ class HomescreenNotifier extends ChangeNotifier {
} }
BackgroundLocation.startLocationService(); BackgroundLocation.startLocationService();
// print("setstatus:$setstatus"); // print("setstatus:$setstatus");
} else if (att_status == 2) { } else if (_att_status == 2) {
// print("att_status:$att_status"); // print("att_status:$att_status");
webSocketManager.close(); webSocketManager.close();
BackgroundLocation.stopLocationService(); BackgroundLocation.stopLocationService();
......
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/Utils/commonServices.dart';
import 'package:generp/screens/inventory/GeneratorPartDetailsScreen.dart';
import 'package:generp/services/api_calling.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';
import '../Models/Inventory_Part_details_response.dart';
class InventoryProvider extends ChangeNotifier {
PermissionStatus _cameraPermissionStatus = PermissionStatus.denied;
final GlobalKey scannerKey = GlobalKey(debugLabel: 'QR');
PartData _partData = PartData();
bool _hasPermission = false;
QRViewController? _qrViewController;
String? _partID = "";
String _description = '';
String _quantity = '';
String _quantityError = '';
String _descriptionError = '';
String _issuetype = "";
String get issuetype => _issuetype;
set issuetype(value){
_issuetype = value;
}
String get quantityError => _quantityError;
String get descriptionError => _descriptionError;
bool get isButtonEnabled =>
_quantity.isNotEmpty &&
_description.isNotEmpty;
String? get partID => _partID;
PartData get partData => _partData;
bool get hasPermission => _hasPermission;
QRViewController? get qrViewController => _qrViewController;
Future<void> checkPermission1() async {
// Check camera permissions
var status = await Permission.camera.status;
try {
if (status.isGranted) {
_hasPermission = true;
} else if (status.isDenied || status.isRestricted) {
// Request camera permissions if denied or restricted
await Permission.camera.request();
status = await Permission.camera.request();
if (status.isGranted) {
_hasPermission = true;
} else {
_hasPermission = false;
}
}
} catch (e, s) {}
}
Future<void> requestCameraPermission() async {
PermissionStatus status = await Permission.camera.request();
_cameraPermissionStatus = status;
// print(_cameraPermissionStatus);
try {
if (_cameraPermissionStatus.isGranted) {
_hasPermission = true;
} else if (_cameraPermissionStatus.isDenied ||
_cameraPermissionStatus.isRestricted ||
_cameraPermissionStatus.isPermanentlyDenied) {
_hasPermission = false;
await Permission.camera.request();
}
} catch (e, s) {}
}
void onQRViewCreated(QRViewController controller, from, context) {
// print("QRVIEW");
this._qrViewController = controller;
controller.scannedDataStream.listen((scanData) {
controller!.pauseCamera();
if (from == "inventory") {
_partID = scanData.code;
notifyListeners();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => GeneratorPartDetailsScreen()),
);
}
});
}
Future<void> LoadPartDetailsApifunction(
homeProvider,
BuildContext context,
from,
partId,
) async {
try {
final data = await ApiCalling.LoadPartDetailsAPI(
homeProvider.empId,
homeProvider.session,
partId,
);
if (data != null) {
if (data.error == 0) {
_partData = data.partData!;
_partID = partId;
notifyListeners();
if (from == "inventory") {
this._qrViewController!.pauseCamera();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GeneratorPartDetailsScreen(),
),
);
}
notifyListeners();
} else if (data.error == 1) {
toast(context, "Enter Correct ID");
} else {}
if (from == "inventory") {
this._qrViewController!.pauseCamera();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GeneratorPartDetailsScreen(),
),
);
}
notifyListeners();
}
} on Error catch (e) {
print(e.toString());
}
}
void updateQuantity(String issueQuantity) {
_quantity = issueQuantity;
_quantityError = '';
notifyListeners();
}
void updateDescription(String issueDescription) {
_description = issueDescription;
_descriptionError = '';
notifyListeners();
}
bool _validate(String issueQuantity, String issueDescription) {
_quantityError = '';
_descriptionError = '';
if (issueQuantity.isEmpty) {
_quantityError = "Please enter a valid email address";
}
if (issueDescription.isEmpty) {
_descriptionError = "Please enter your password";
}
notifyListeners();
return _quantityError.isEmpty && _descriptionError.isEmpty;
}
Future<void> StockRecieveIssueAPI(homeProvider,context,issueQuantity,issueDescription,partID,type) async {
try {
if (!_validate(issueQuantity, issueDescription)) return;
final data = await ApiCalling.InventoryUpdateStockAPI( homeProvider.empId,
homeProvider.session, issueQuantity,
issueDescription, partID, type);
if (data != null)
{
if (data.error == 0) {
toast(context, "Updated Successfully!");
Navigator.pop(context);
LoadPartDetailsApifunction(homeProvider,context,"",partID);
} else {
toast(context, "Updated Failed!");
}
notifyListeners();
}
} on Error catch (e) {
print(e.toString());
}
}
}
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
...@@ -32,6 +33,7 @@ class SplashVersionNotifier extends ChangeNotifier { ...@@ -32,6 +33,7 @@ class SplashVersionNotifier extends ChangeNotifier {
Future<void> handleVersionCheck(context) async { Future<void> handleVersionCheck(context) async {
var loginStatus = await SharedpreferencesService().getInt("loginstatus"); var loginStatus = await SharedpreferencesService().getInt("loginstatus");
print("login status: ${loginStatus}");
try { try {
final data = await ApiCalling.checkAppVersionApi(); final data = await ApiCalling.checkAppVersionApi();
......
...@@ -6,8 +6,11 @@ import 'package:flutter/foundation.dart'; ...@@ -6,8 +6,11 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:flutter_ringtone_player/flutter_ringtone_player.dart'; import 'package:flutter_ringtone_player/flutter_ringtone_player.dart';
import 'package:generp/Notifiers/AttendanceNotifier.dart';
import 'package:generp/Notifiers/CheckInProvider.dart';
import 'package:generp/Notifiers/Counter.dart'; import 'package:generp/Notifiers/Counter.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart'; import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Notifiers/InventoryProvider.dart';
import 'package:generp/Notifiers/LogoutNotifier.dart'; import 'package:generp/Notifiers/LogoutNotifier.dart';
import 'package:generp/Notifiers/ProfileNotifier.dart'; import 'package:generp/Notifiers/ProfileNotifier.dart';
import 'package:generp/Notifiers/loginNotifier.dart'; import 'package:generp/Notifiers/loginNotifier.dart';
...@@ -174,6 +177,9 @@ class MyApp extends StatelessWidget { ...@@ -174,6 +177,9 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_)=>HomescreenNotifier()), ChangeNotifierProvider(create: (_)=>HomescreenNotifier()),
ChangeNotifierProvider(create: (_)=>ProfileNotifer()), ChangeNotifierProvider(create: (_)=>ProfileNotifer()),
ChangeNotifierProvider(create: (_)=>LogoutNotifier()), ChangeNotifierProvider(create: (_)=>LogoutNotifier()),
ChangeNotifierProvider(create: (_)=>AttendanceNotifier()),
ChangeNotifierProvider(create: (_)=>CheckInOutProvider()),
ChangeNotifierProvider(create: (_)=>InventoryProvider()),
], ],
child: Builder( child: Builder(
builder: (BuildContext context){ builder: (BuildContext context){
......
This diff is collapsed.
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:generp/Utils/SharedpreferencesService.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/services/api_calling.dart';
import 'package:geolocator/geolocator.dart';
import 'package:geolocator_platform_interface/src/enums/location_accuracy.dart' as geo_location;
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:image_picker/image_picker.dart';
import 'package:location/location.dart' as Location;
import 'package:provider/provider.dart';
import '../Notifiers/CheckInProvider.dart';
import '../Utils/background_service.dart';
import '../Utils/commonServices.dart';
import 'FrontCameraCapture.dart';
class CheckInOutScreen extends StatefulWidget {
final int getAttendanceStatus;
const CheckInOutScreen({super.key,required this.getAttendanceStatus});
@override
State<CheckInOutScreen> createState() => _CheckInOutScreenState();
}
class _CheckInOutScreenState extends State<CheckInOutScreen> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
var prov = Provider.of<CheckInOutProvider>(context, listen: false);
prov.getLocationPermission(context);
prov.getCurrentLocation();
});
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
double screenWidth = MediaQuery.of(context).size.width;
return Consumer<CheckInOutProvider>(
builder: (context, provider, child) {
return Scaffold(
body:Container(
child: SafeArea(
child: Column(
children: [
Container(
alignment: Alignment.topCenter,
height: 50,
child: Row(
children: [
Padding(padding: EdgeInsets.only(left: 20)),
InkWell(
onTap: () {
Navigator.pop(context, true);
},
child: SvgPicture.asset(
"assets/back_icon.svg",
height: 29,
width: 29,
),
),
SizedBox(width: 20),
Center(
child: Text(
widget.getAttendanceStatus==0? "Check In":"Check Out",
style: TextStyle(
fontWeight: FontWeight.w500,
color: Colors.white,
),
),
),
],
),
),
Expanded(
child: ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.0),
topRight: Radius.circular(30.0),
),
child: Stack(
children: [
GoogleMap(
myLocationEnabled: true,
zoomGesturesEnabled: true,
initialCameraPosition: CameraPosition(
target: provider.currentLocationLatLng ??
provider.startLocation,
zoom: 20.0,
),
markers: provider.markers.toSet(),
mapType: MapType.normal,
onMapCreated: (controller) {
provider.mapController = controller;
provider.getCurrentLocation();
provider.getLocationPermission(context);
},
onCameraMove: (position) {
provider.onCameraMove(position,context);
},
),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: Container(
height: size.height * 0.3,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.0),
topRight: Radius.circular(30.0),
),
),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
SizedBox(height: 25),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0),
child: Text(
"Location",
style: TextStyle(
fontWeight: FontWeight.w400,
color: Colors.grey,
),
),
),
SizedBox(height: 5),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0),
child: Container(
height: 50,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
borderRadius:
BorderRadius.circular(25),
),
child: Padding(
padding:
const EdgeInsets.fromLTRB(
10.0, 0.0, 10, 0),
child: TextFormField(
controller:
provider.locationController,
keyboardType:
TextInputType.text,
decoration: InputDecoration(
hintText:
"Enter Check ${widget.getAttendanceStatus==0?"In":"Out"} Location",
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
fontSize: 14
),
enabledBorder:
InputBorder.none,
focusedBorder:
InputBorder.none,
),
),
),
),
),
if (provider.validateLocation != null)
Padding(
padding:
const EdgeInsets.symmetric(
horizontal: 20.0),
child: Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(
top: 2.5,
bottom: 2.5,
left: 25),
child: Text(
provider.validateLocation!,
textAlign: TextAlign.start,
style: TextStyle(
color: Colors.red,
),
),
),
)
else
SizedBox(height: 5.0),
SizedBox(height: 20),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20.0),
child: InkWell(
onTap: () async {
if (provider
.locationController
.text
.isEmpty) {
provider.validateLocation =
"Please Enter location";
provider.notifyListeners();
} else {
provider.validateLocation = "";
provider.imgFromCamera(
context,widget.getAttendanceStatus);
}
},
child: Container(
alignment: Alignment.center,
height: 45,
width: screenWidth,
decoration: BoxDecoration(
color: AppColors.app_blue,
borderRadius:
BorderRadius.circular(30.0),
),
child: Text(
widget.getAttendanceStatus==0? "Check In":"Check Out",
style: TextStyle(
fontWeight: FontWeight.w500,
color: Colors.white
),
),
),
),
),
],
),
),
),
],
),
),
),
],
),
),
),
);
},
);
}
}
import 'dart:async';
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import '../Utils/commonServices.dart';
class FrontCameraCapture extends StatefulWidget {
const FrontCameraCapture({Key? key}) : super(key: key);
@override
State<FrontCameraCapture> createState() => _CheckOutScreenState();
}
class _CheckOutScreenState extends State<FrontCameraCapture> {
late List<CameraDescription> _cameras;
late CameraController cam_controller;
File? _image;
var image_picked = 0;
bool isLoading = true;
@override
void initState() {
super.initState();
initCameraSetup();
}
Future<void> initCameraSetup() async {
await requestCameraPermission();
await _getavailableCameras();
}
Future<void> requestCameraPermission() async {
var status = await Permission.camera.status;
if (!status.isGranted) {
status = await Permission.camera.request();
}
if (!status.isGranted) {
toast(context, "Camera permission denied");
Navigator.pop(context);
}
}
Future<void> _getavailableCameras() async {
try {
_cameras = await availableCameras();
final frontCamera = _cameras.firstWhere(
(camera) => camera.lensDirection == CameraLensDirection.front,
);
cam_controller = CameraController(frontCamera, ResolutionPreset.max);
await cam_controller.initialize();
if (!mounted) return;
setState(() {
isLoading = false;
});
} catch (e) {
toast(context, "Failed to initialize camera");
Navigator.pop(context);
}
}
@override
void dispose() {
cam_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
),
body: SafeArea(
child: isLoading
? Center(child: CircularProgressIndicator())
: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
height: size.height * 0.8,
child: cam_controller.value.isInitialized
? CameraPreview(cam_controller)
: Center(child: Text("Camera not ready")),
),
Container(
height: size.height * 0.1,
padding: EdgeInsets.all(10),
child: Center(
child: TextButton(
style: ButtonStyle(
backgroundColor: MaterialStatePropertyAll(Colors.white70),
overlayColor: MaterialStatePropertyAll(Colors.white70),
),
onPressed: () async {
if (!cam_controller.value.isInitialized) return;
final image = await cam_controller.takePicture();
_image = File(image.path);
Navigator.pop(context, _image);
},
child: Icon(
CupertinoIcons.camera_circle_fill,
size: 50,
color: Colors.black,
),
),
),
),
],
),
),
);
}
}
...@@ -13,6 +13,8 @@ import 'package:generp/screens/WebWhizzdomScreen.dart'; ...@@ -13,6 +13,8 @@ import 'package:generp/screens/WebWhizzdomScreen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../Utils/app_colors.dart'; import '../Utils/app_colors.dart';
import 'AttendanceScreen.dart';
import 'inventory/InventoryScreen.dart';
class MyHomePage extends StatefulWidget { class MyHomePage extends StatefulWidget {
const MyHomePage({super.key}); const MyHomePage({super.key});
...@@ -35,6 +37,7 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -35,6 +37,7 @@ class _MyHomePageState extends State<MyHomePage> {
Future.delayed(Duration(milliseconds: 600), () { Future.delayed(Duration(milliseconds: 600), () {
prof_prov.ProfileApiFunction(prov, context); prof_prov.ProfileApiFunction(prov, context);
prof_prov.VersionApiFunction(); prof_prov.VersionApiFunction();
}); });
super.initState(); super.initState();
} }
...@@ -83,11 +86,11 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -83,11 +86,11 @@ class _MyHomePageState extends State<MyHomePage> {
children: [ children: [
CircleAvatar( CircleAvatar(
radius: 33, radius: 32.5, // 65 / 2
foregroundImage: NetworkImage( backgroundImage: NetworkImage(profile.profileImage),
profile.profileImage, backgroundColor: Colors.transparent,
),
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
...@@ -212,7 +215,7 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -212,7 +215,7 @@ class _MyHomePageState extends State<MyHomePage> {
onTap: () { onTap: () {
switch (names[index]) { switch (names[index]) {
case "Attendance": case "Attendance":
// Navigator.push(context,MaterialPageRoute(builder: (context) => AttendanceScreen())); Navigator.push(context,MaterialPageRoute(builder: (context) => AttendanceScreen()));
break; break;
case "ERP": case "ERP":
Navigator.push(context,MaterialPageRoute(builder: (context) => WebErpScreen(erp_url: homescreen.webPageUrl))); Navigator.push(context,MaterialPageRoute(builder: (context) => WebErpScreen(erp_url: homescreen.webPageUrl)));
...@@ -227,7 +230,7 @@ class _MyHomePageState extends State<MyHomePage> { ...@@ -227,7 +230,7 @@ class _MyHomePageState extends State<MyHomePage> {
// Navigator.push(context, MaterialPageRoute(builder: (context)=>NearByGeneratorsScreen())); // Navigator.push(context, MaterialPageRoute(builder: (context)=>NearByGeneratorsScreen()));
break; break;
case "Inventory": case "Inventory":
// Navigator.push(context, MaterialPageRoute(builder: (context)=>InventoryScreen())); Navigator.push(context, MaterialPageRoute(builder: (context)=>InventoryScreen()));
break; break;
case "Whizzdom": case "Whizzdom":
Navigator.push(context, MaterialPageRoute(builder: (context)=>WebWhizzdomScreen( Navigator.push(context, MaterialPageRoute(builder: (context)=>WebWhizzdomScreen(
......
import 'package:flutter/material.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Notifiers/InventoryProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:provider/provider.dart';
class GeneratorPartDetailsScreen extends StatefulWidget {
const GeneratorPartDetailsScreen({super.key});
@override
State<GeneratorPartDetailsScreen> createState() => _GeneratorPartDetailsScreenState();
}
class _GeneratorPartDetailsScreenState extends State<GeneratorPartDetailsScreen> {
FocusNode descriptionFocusNode =FocusNode();
FocusNode quantityFocusNode = FocusNode();
TextEditingController descriptioncontroller = TextEditingController();
TextEditingController quantitycontroller = TextEditingController();
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
var homeProvider = Provider.of<HomescreenNotifier>(context,listen: false);
initialiseFunction(context, homeProvider);
});
}
void initialiseFunction(BuildContext context,homeProvider) async {
var inventoryProvider = Provider.of<InventoryProvider>(context,listen: false);
inventoryProvider.LoadPartDetailsApifunction(homeProvider, context, "", inventoryProvider.partID);
}
@override
Widget build(BuildContext context) {
return Consumer<InventoryProvider>(
builder: (context,provider,child) {
return Scaffold(
backgroundColor: AppColors.scaffold_bg_color,
appBar: AppBar(
automaticallyImplyLeading: false,
),
body: Container(
child: SingleChildScrollView(
child: Column(
children: [
Container(
margin: EdgeInsets.only(top: 15, bottom: 15),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
Container(
padding: EdgeInsets.only(
left: 10,
right: 10,
top: 15,
),
child: Row(
children: [
Expanded(child: Text("${provider.partData.prodName}")),
],
),
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 10,
vertical: 15,
),
margin: EdgeInsets.symmetric(
horizontal: 10,
vertical: 15,
),
decoration: BoxDecoration(
color: Color(0xFFFFEFEF),
borderRadius: BorderRadius.circular(16),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(
child: SizedBox(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
RichText(
text: TextSpan(
children: [
TextSpan(
text: "${provider.partData.remainingQuantity}",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 18,
),
),
],
),
),
Text("Remaining Quantity"),
],
),
),
),
],
),
),
],
),
),
Text("Product Details"),
Container(
padding: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
margin: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16)
),
child: Column(
children: List.generate(9, (index) {
final headings = [
"Product Name",
"Product ID",
"Project",
"Description",
"Sub Group",
"Vendor 1",
"Vendor 2",
"Units",
"MSL"];
final values = [
provider.partData.prodName,
provider.partData.id,
provider.partData.project,
provider.partData.prodDesc,
provider.partData.subGroup,
provider.partData.vendor1,
provider.partData.vendor2,
provider.partData.units,
provider.partData.msl,
];
return Container(
padding: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text("${headings[index]}"),
Text("${values[index]}"),
Divider(thickness: 0.5,color: index==8?Colors.white:Color(0xFFD7D7D7),)
],
),
);
},),
),
),
SizedBox(height: 150,)
],
),
),
),
bottomSheet: Container(
padding: EdgeInsets.symmetric(horizontal: 15,vertical: 15),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(child: InkResponse(
onTap: () {
_showStockIssueBottomSheet(context,"Recieve");
},
child: Container(
height: 45,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: AppColors.app_blue,width: 0.5),
borderRadius: BorderRadius.circular(12)
),
child: Center(child: Text("Recieve",
style: TextStyle(
color: AppColors.app_blue
),)),),
)),
SizedBox(width: 10,),
Expanded(child: InkResponse(
onTap: () {
_showStockIssueBottomSheet(context,"Issue");
},
child: Container(
height: 45,
decoration: BoxDecoration(
color: AppColors.app_blue,
border: Border.all(color: AppColors.app_blue,width: 0.5),
borderRadius: BorderRadius.circular(12)
),
child: Center(child: Text("Issue",
style: TextStyle(
color: Colors.white
),)),),
)),
],
),
),
);
}
);
}
Future<void> _showStockIssueBottomSheet(BuildContext context,type) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
useRootNavigator: true,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Padding(
padding: EdgeInsets.only(
bottom:
MediaQuery.of(
context,
).viewInsets.bottom, // This handles keyboard
),
child: Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 30,
),
child: Consumer2<InventoryProvider, HomescreenNotifier>(
builder: (context, provider, homeProvider, child) {
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text("Inventory ${type}"),
Container(
alignment: Alignment.topLeft,
child: Text(
"Quantity",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 12,
),
),
),
Container(
height: 48,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
borderRadius: BorderRadius.circular(20),
border:
quantityFocusNode.hasFocus
? Border.all(
color: AppColors.app_blue,
width: 0.5,
)
: null,
),
// alignment: Alignment.center,
margin: EdgeInsets.only(left: 5.0, right: 5.0),
child: Padding(
padding: const EdgeInsets.fromLTRB(
10.0,
0.0,
15,
0,
),
child: TextField(
controller: quantitycontroller,
keyboardType: TextInputType.text,
focusNode: quantityFocusNode,
style: TextStyle(fontSize: 14),
onChanged: (value) {
provider.updateQuantity(quantitycontroller.text);
},
onTapOutside: (event) {
// Handle onTapOutside
FocusScope.of(context).unfocus();
},
decoration: InputDecoration(
isDense: true,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
fontSize: 14,
),
//contentPadding: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 10.0),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: 'Enter Quantity',
),
),
),
),
Container(
alignment: Alignment.topLeft,
child: Text(
"Description",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 12,
),
),
),
Container(
height: 180,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
borderRadius: BorderRadius.circular(20),
border:
descriptionFocusNode.hasFocus
? Border.all(
color: AppColors.app_blue,
width: 0.5,
)
: null,
),
// alignment: Alignment.center,
margin: EdgeInsets.only(left: 5.0, right: 5.0),
child: Padding(
padding: const EdgeInsets.fromLTRB(
10.0,
0.0,
15,
0,
),
child: TextField(
controller: descriptioncontroller,
maxLines: 100,
keyboardType: TextInputType.text,
focusNode: descriptionFocusNode,
style: TextStyle(fontSize: 14),
onChanged: (value) {
provider.updateQuantity(descriptioncontroller.text);
},
onTapOutside: (event) {
// Handle onTapOutside
FocusScope.of(context).unfocus();
},
decoration: InputDecoration(
isDense: true,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
fontSize: 14,
),
//contentPadding: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 10.0),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: 'Enter Description',
),
),
),
),
InkWell(
onTap: () {
print(provider.isButtonEnabled);
if(type=="Recieve"){
provider.issuetype = "Recieved";
}else{
provider.issuetype = "Issued";
}
provider.StockRecieveIssueAPI(homeProvider,context,quantitycontroller.text,descriptioncontroller.text,provider.partID,provider.issuetype);
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 5.0,
right: 5.0,
top: 5.0,
bottom: 5.0,
),
decoration: BoxDecoration(
color: provider.isButtonEnabled?AppColors.app_blue:AppColors.button_disabled, //1487C9
borderRadius: BorderRadius.circular(30.0),
),
child: Center(
child: Text(
"Submit",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
),
),
),
],
),
);
},
),
),
),
);
},
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:generp/Notifiers/HomeScreenNotifier.dart';
import 'package:generp/Notifiers/InventoryProvider.dart';
import 'package:provider/provider.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';
import '../../Utils/app_colors.dart';
class InventoryScreen extends StatefulWidget {
const InventoryScreen({super.key});
@override
State<InventoryScreen> createState() => _InventoryScreenState();
}
class _InventoryScreenState extends State<InventoryScreen> {
FocusNode partIDfocusNode = FocusNode();
TextEditingController partIDcontroller = TextEditingController();
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
var inventoryProvider = Provider.of<InventoryProvider>(
context,
listen: false,
);
inventoryProvider.checkPermission1();
inventoryProvider.requestCameraPermission();
});
}
@override
Widget build(BuildContext context) {
return Consumer<InventoryProvider>(
builder: (context, provider, child) {
return Scaffold(
backgroundColor: AppColors.scaffold_bg_color,
appBar: AppBar(),
body: Container(
decoration: BoxDecoration(color: Colors.black),
child: Column(
children: [
Spacer(),
Container(
height: 250,
child: QRView(
key: provider.scannerKey,
onQRViewCreated: (p0) {
provider.onQRViewCreated(p0, "inventory", context);
},
formatsAllowed: [BarcodeFormat.qrcode],
cameraFacing: CameraFacing.back,
overlay: QrScannerOverlayShape(
borderColor: AppColors.app_blue,
borderRadius: 20,
borderLength: 60,
borderWidth: 10,
cutOutSize: 250.0,
),
),
),
SizedBox(height: 25),
Text(
"Scan QR",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18, color: Colors.white),
),
Text(
"to open Inventory",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 14, color: Colors.white),
),
Spacer(),
Text(
"or",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18, color: Colors.white),
),
InkResponse(
onTap: () async {
_showPartIdBottomSheet(context);
},
child: Text(
"Tap To Enter Part ID",
textAlign: TextAlign.center,
style: TextStyle(fontSize: 14, color: Colors.white),
),
),
SizedBox(height: 50),
],
),
),
);
},
);
}
Future<void> _showPartIdBottomSheet(BuildContext context) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
useRootNavigator: true,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Padding(
padding: EdgeInsets.only(
bottom:
MediaQuery.of(
context,
).viewInsets.bottom, // This handles keyboard
),
child: Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 30,
),
child: Consumer2<InventoryProvider, HomescreenNotifier>(
builder: (context, provider, homeProvider, child) {
return SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
alignment: Alignment.topLeft,
child: Text(
"Part ID",
style: TextStyle(
color: AppColors.semi_black,
fontSize: 12,
),
),
),
Container(
height: 48,
alignment: Alignment.center,
decoration: BoxDecoration(
color: AppColors.text_field_color,
borderRadius: BorderRadius.circular(20),
border:
partIDfocusNode.hasFocus
? Border.all(
color: AppColors.app_blue,
width: 0.5,
)
: null,
),
// alignment: Alignment.center,
margin: EdgeInsets.only(left: 5.0, right: 5.0),
child: Padding(
padding: const EdgeInsets.fromLTRB(
10.0,
0.0,
15,
0,
),
child: TextField(
controller: partIDcontroller,
keyboardType: TextInputType.emailAddress,
focusNode: partIDfocusNode,
style: TextStyle(fontSize: 14),
onChanged: (value) {},
onTapOutside: (event) {
// Handle onTapOutside
FocusScope.of(context).unfocus();
},
decoration: InputDecoration(
isDense: true,
hintStyle: TextStyle(
fontWeight: FontWeight.w400,
fontSize: 14,
),
//contentPadding: EdgeInsets.fromLTRB(5.0, 10.0, 5.0, 10.0),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: 'Enter Part ID',
),
),
),
),
InkWell(
onTap: () {
provider.LoadPartDetailsApifunction(
homeProvider,
context,
"inventory",
partIDcontroller.text,
);
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 5.0,
right: 5.0,
top: 5.0,
bottom: 5.0,
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(30.0),
),
child: Center(
child: Text(
"Submit",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
),
),
),
],
),
);
},
),
),
),
);
},
);
},
);
}
}
...@@ -99,6 +99,7 @@ class ApiCalling { ...@@ -99,6 +99,7 @@ class ApiCalling {
try{ try{
final response = await post( {},getAppVersionUrl, {}); final response = await post( {},getAppVersionUrl, {});
if(response!=null){ if(response!=null){
print("${response.body}");
return VersionsResponse.fromJson(jsonDecode(response.body)); return VersionsResponse.fromJson(jsonDecode(response.body));
}else { }else {
return null; return null;
...@@ -279,7 +280,9 @@ class ApiCalling { ...@@ -279,7 +280,9 @@ class ApiCalling {
res = jsonDecode(res); res = jsonDecode(res);
} }
if (res != null) { if (res != null) {
debugPrint(res); print(data);
print(check_in_pic);
debugPrint("Check in: ${res}");
return CheckInResponse.fromJson(res); return CheckInResponse.fromJson(res);
} else { } else {
debugPrint("Null Response"); debugPrint("Null Response");
...@@ -351,7 +354,7 @@ class ApiCalling { ...@@ -351,7 +354,7 @@ class ApiCalling {
}; };
final res = await post(data, employeeMonthwiseAttendanceUrl, {}); final res = await post(data, employeeMonthwiseAttendanceUrl, {});
if (res != null) { if (res != null) {
debugPrint(res.body); debugPrint("montly attendance: ${res.body}");
// return AttendanceHistory.fromJson(jsonDecode(res.body)); // return AttendanceHistory.fromJson(jsonDecode(res.body));
return res.body; return res.body;
} else { } else {
...@@ -374,7 +377,7 @@ class ApiCalling { ...@@ -374,7 +377,7 @@ class ApiCalling {
}; };
final res = await post(data, employeeDayAttendanceDetailsUrl, {}); final res = await post(data, employeeDayAttendanceDetailsUrl, {});
if (res != null) { if (res != null) {
debugPrint(res.body); debugPrint("Attendacnce API /; ${res.body}");
return AttendanceDaywiseResponse.fromJson(jsonDecode(res.body)); return AttendanceDaywiseResponse.fromJson(jsonDecode(res.body));
} else { } else {
debugPrint("Null Response"); debugPrint("Null Response");
......
...@@ -6,9 +6,13 @@ ...@@ -6,9 +6,13 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <file_selector_linux/file_selector_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h> #include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) file_selector_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin");
file_selector_plugin_register_with_registrar(file_selector_linux_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# #
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
file_selector_linux
url_launcher_linux url_launcher_linux
) )
......
...@@ -7,8 +7,10 @@ import Foundation ...@@ -7,8 +7,10 @@ import Foundation
import connectivity_plus import connectivity_plus
import device_info_plus import device_info_plus
import file_selector_macos
import firebase_core import firebase_core
import firebase_messaging import firebase_messaging
import flutter_image_compress_macos
import flutter_inappwebview_macos import flutter_inappwebview_macos
import flutter_local_notifications import flutter_local_notifications
import geolocator_apple import geolocator_apple
...@@ -22,8 +24,10 @@ import url_launcher_macos ...@@ -22,8 +24,10 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin"))
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin"))
......
...@@ -41,6 +41,46 @@ packages: ...@@ -41,6 +41,46 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
camera:
dependency: "direct main"
description:
name: camera
sha256: "413d2b34fe28496c35c69ede5b232fb9dd5ca2c3a4cb606b14efc1c7546cc8cb"
url: "https://pub.dev"
source: hosted
version: "0.11.1"
camera_android_camerax:
dependency: transitive
description:
name: camera_android_camerax
sha256: f0dcbce91623f75030840609de9b64d0d73f86df279c6e9588c1501245a05eb2
url: "https://pub.dev"
source: hosted
version: "0.6.15+2"
camera_avfoundation:
dependency: transitive
description:
name: camera_avfoundation
sha256: ca36181194f429eef3b09de3c96280f2400693f9735025f90d1f4a27465fdd72
url: "https://pub.dev"
source: hosted
version: "0.9.19"
camera_platform_interface:
dependency: transitive
description:
name: camera_platform_interface
sha256: "2f757024a48696ff4814a789b0bd90f5660c0fb25f393ab4564fb483327930e2"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
camera_web:
dependency: transitive
description:
name: camera_web
sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f"
url: "https://pub.dev"
source: hosted
version: "0.3.5"
characters: characters:
dependency: transitive dependency: transitive
description: description:
...@@ -97,6 +137,14 @@ packages: ...@@ -97,6 +137,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.6" version: "3.0.6"
csslib:
dependency: transitive
description:
name: csslib
sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -169,6 +217,38 @@ packages: ...@@ -169,6 +217,38 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.1" version: "7.0.1"
file_selector_linux:
dependency: transitive
description:
name: file_selector_linux
sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33"
url: "https://pub.dev"
source: hosted
version: "0.9.3+2"
file_selector_macos:
dependency: transitive
description:
name: file_selector_macos
sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc"
url: "https://pub.dev"
source: hosted
version: "0.9.4+2"
file_selector_platform_interface:
dependency: transitive
description:
name: file_selector_platform_interface
sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b
url: "https://pub.dev"
source: hosted
version: "2.6.2"
file_selector_windows:
dependency: transitive
description:
name: file_selector_windows
sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b"
url: "https://pub.dev"
source: hosted
version: "0.9.3+4"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -246,6 +326,54 @@ packages: ...@@ -246,6 +326,54 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.12.0" version: "1.12.0"
flutter_image_compress:
dependency: "direct main"
description:
name: flutter_image_compress
sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27"
url: "https://pub.dev"
source: hosted
version: "2.4.0"
flutter_image_compress_common:
dependency: transitive
description:
name: flutter_image_compress_common
sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb
url: "https://pub.dev"
source: hosted
version: "1.0.6"
flutter_image_compress_macos:
dependency: transitive
description:
name: flutter_image_compress_macos
sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337"
url: "https://pub.dev"
source: hosted
version: "1.0.3"
flutter_image_compress_ohos:
dependency: transitive
description:
name: flutter_image_compress_ohos
sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51
url: "https://pub.dev"
source: hosted
version: "0.0.3"
flutter_image_compress_platform_interface:
dependency: transitive
description:
name: flutter_image_compress_platform_interface
sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889"
url: "https://pub.dev"
source: hosted
version: "1.0.5"
flutter_image_compress_web:
dependency: transitive
description:
name: flutter_image_compress_web
sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96
url: "https://pub.dev"
source: hosted
version: "0.1.5"
flutter_inappwebview: flutter_inappwebview:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -398,6 +526,14 @@ packages: ...@@ -398,6 +526,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e
url: "https://pub.dev"
source: hosted
version: "2.0.28"
flutter_ringtone_player: flutter_ringtone_player:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -480,6 +616,70 @@ packages: ...@@ -480,6 +616,70 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.5" version: "0.2.5"
get:
dependency: "direct main"
description:
name: get
sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425
url: "https://pub.dev"
source: hosted
version: "4.7.2"
google_maps:
dependency: transitive
description:
name: google_maps
sha256: "4d6e199c561ca06792c964fa24b2bac7197bf4b401c2e1d23e345e5f9939f531"
url: "https://pub.dev"
source: hosted
version: "8.1.1"
google_maps_flutter:
dependency: "direct main"
description:
name: google_maps_flutter
sha256: "830d8f7b51b4a950bf0d7daa675324fed6c9beb57a7ecca2a59018270c96b4e0"
url: "https://pub.dev"
source: hosted
version: "2.12.1"
google_maps_flutter_android:
dependency: transitive
description:
name: google_maps_flutter_android
sha256: ab83128296fbeaa52e8f2b3bf53bcd895e64778edddcdc07bc8f33f4ea78076c
url: "https://pub.dev"
source: hosted
version: "2.16.1"
google_maps_flutter_ios:
dependency: transitive
description:
name: google_maps_flutter_ios
sha256: c7433645c4c9b61c587938cb06072f3dad601239e596b090c0f8f206c1f2ade7
url: "https://pub.dev"
source: hosted
version: "2.15.2"
google_maps_flutter_platform_interface:
dependency: transitive
description:
name: google_maps_flutter_platform_interface
sha256: "970c8f766c02909c7be282dea923c971f83a88adaf07f8871d0aacebc3b07bb2"
url: "https://pub.dev"
source: hosted
version: "2.11.1"
google_maps_flutter_web:
dependency: transitive
description:
name: google_maps_flutter_web
sha256: a45786ea6691cc7cdbe2cf3ce2c2daf4f82a885745666b4a36baada3a4e12897
url: "https://pub.dev"
source: hosted
version: "0.5.12"
html:
dependency: transitive
description:
name: html
sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602"
url: "https://pub.dev"
source: hosted
version: "0.15.6"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -496,6 +696,70 @@ packages: ...@@ -496,6 +696,70 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.2" version: "4.1.2"
image_picker:
dependency: "direct main"
description:
name: image_picker
sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb"
url: "https://pub.dev"
source: hosted
version: "0.8.12+23"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
url: "https://pub.dev"
source: hosted
version: "3.0.6"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
url: "https://pub.dev"
source: hosted
version: "0.8.12+2"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
url: "https://pub.dev"
source: hosted
version: "0.2.1+2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
url: "https://pub.dev"
source: hosted
version: "2.10.1"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
url: "https://pub.dev"
source: hosted
version: "0.2.1+1"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -504,6 +768,14 @@ packages: ...@@ -504,6 +768,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.20.2" version: "0.20.2"
js:
dependency: transitive
description:
name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
url: "https://pub.dev"
source: hosted
version: "0.6.7"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
...@@ -768,6 +1040,22 @@ packages: ...@@ -768,6 +1040,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.1.5" version: "6.1.5"
qr_code_scanner:
dependency: "direct main"
description:
name: qr_code_scanner
sha256: f23b68d893505a424f0bd2e324ebea71ed88465d572d26bb8d2e78a4749591fd
url: "https://pub.dev"
source: hosted
version: "1.0.1"
sanitize_html:
dependency: transitive
description:
name: sanitize_html
sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
...@@ -877,6 +1165,14 @@ packages: ...@@ -877,6 +1165,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
stream_transform:
dependency: transitive
description:
name: stream_transform
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
url: "https://pub.dev"
source: hosted
version: "2.1.1"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment