Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sai Srinivas
GEN_ERP_2025
Commits
c09dfa71
Commit
c09dfa71
authored
May 07, 2025
by
Sai Srinivas
Browse files
07-05-2025 By Sai Srinivas
Second Commit Inventory Module and Attendance related screens
parent
b76cf1af
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
android/app/src/main/AndroidManifest.xml
View file @
c09dfa71
...
@@ -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}"
...
...
android/gradle.properties
View file @
c09dfa71
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
lib/Notifiers/AtteendaceHistoryNotifier.dart
0 → 100644
View file @
c09dfa71
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
();
}
}
lib/Notifiers/AttendanceNotifier.dart
View file @
c09dfa71
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
lib/Notifiers/CheckInProvider.dart
0 → 100644
View file @
c09dfa71
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
();
}
}
lib/Notifiers/HomeScreenNotifier.dart
View file @
c09dfa71
...
@@ -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
();
...
...
lib/Notifiers/InventoryProvider.dart
0 → 100644
View file @
c09dfa71
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
());
}
}
}
lib/Notifiers/splashVersionNotifier.dart
View file @
c09dfa71
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
();
...
...
lib/main.dart
View file @
c09dfa71
...
@@ -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
){
...
...
lib/screens/AttendanceScreen.dart
View file @
c09dfa71
This diff is collapsed.
Click to expand it.
lib/screens/CheckInScreen.dart
0 → 100644
View file @
c09dfa71
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
),
),
),
),
),
],
),
),
),
],
),
),
),
],
),
),
),
);
},
);
}
}
lib/screens/FrontCameraCapture.dart
0 → 100644
View file @
c09dfa71
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
,
),
),
),
),
],
),
),
);
}
}
lib/screens/HomeScreen.dart
View file @
c09dfa71
...
@@ -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
(
...
...
lib/screens/inventory/GeneratorPartDetailsScreen.dart
0 → 100644
View file @
c09dfa71
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
),
),
),
),
),
],
),
);
},
),
),
),
);
},
);
},
);
}
}
lib/screens/inventory/InventoryScreen.dart
0 → 100644
View file @
c09dfa71
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
),
),
),
),
),
],
),
);
},
),
),
),
);
},
);
},
);
}
}
lib/services/api_calling.dart
View file @
c09dfa71
...
@@ -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"
);
...
...
linux/flutter/generated_plugin_registrant.cc
View file @
c09dfa71
...
@@ -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
);
...
...
linux/flutter/generated_plugins.cmake
View file @
c09dfa71
...
@@ -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
)
)
...
...
macos/Flutter/GeneratedPluginRegistrant.swift
View file @
c09dfa71
...
@@ -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"
))
...
...
pubspec.lock
View file @
c09dfa71
...
@@ -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:
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment