Merge branch 'refs/heads/design_3.0_cx_module' into design_3.0_loan_module

design_3.0_asset_delivery_module
Sikander Saleem 3 months ago
commit b407103002

@ -11,8 +11,7 @@ class URLs {
// static String _baseUrl = "$_host/mobile"; // static String _baseUrl = "$_host/mobile";
static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/v4/mobile"; // for asset inventory on UAT // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev
// static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM
// static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation
@ -37,6 +36,8 @@ class URLs {
static get getUserInfo => "$_baseUrl/MobileAuth/GetUserInfo"; static get getUserInfo => "$_baseUrl/MobileAuth/GetUserInfo";
static get getMobilePermissionByUser => "$_baseUrl/Permission/GetMobilePermissionByUser";
static get logout => "$_baseUrl/MobileAuth/Logout"; static get logout => "$_baseUrl/MobileAuth/Logout";
static get enableFaceId => "$_baseUrl/MobileAuth/EnabledFaceId"; static get enableFaceId => "$_baseUrl/MobileAuth/EnabledFaceId";

@ -133,7 +133,6 @@ class AllRequestsProvider extends ChangeNotifier {
List<int> getStatues(BuildContext context) { List<int> getStatues(BuildContext context) {
List<int> list = [1, 2, 3, 4]; List<int> list = [1, 2, 3, 4];
//TODO need to refactor this code ....
if (context.userProvider.isAssessor) { if (context.userProvider.isAssessor) {
list = [9]; list = [9];
@ -155,9 +154,13 @@ class AllRequestsProvider extends ChangeNotifier {
if (context.settingProvider.isUserFlowMedical && !context.userProvider.isNurse) { if (context.settingProvider.isUserFlowMedical && !context.userProvider.isNurse) {
list.add(7); // task mod list.add(7); // task mod
} }
if (!context.userProvider.isNurse) {
list.add(8); // // switching asset inventory to users permissions
} context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
list.add(module.module!.value!);
}
});
if (context.userProvider.isNurse) { if (context.userProvider.isNurse) {
list.add(9); // list.add(9); //

@ -9,6 +9,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/models/new_models/general_response_model.dart'; import 'package:test_sa/models/new_models/general_response_model.dart';
import 'package:test_sa/models/new_models/update_password.dart'; import 'package:test_sa/models/new_models/update_password.dart';
import 'package:test_sa/models/new_models/verify_otp_model.dart'; import 'package:test_sa/models/new_models/verify_otp_model.dart';
@ -51,6 +52,7 @@ class UserProvider extends ChangeNotifier {
SwipeTransaction _swipeTransactionModel = SwipeTransaction(); SwipeTransaction _swipeTransactionModel = SwipeTransaction();
List<SwipeHistory> _swipeHistory = []; List<SwipeHistory> _swipeHistory = [];
List<SiteContactInfoModel> _siteContactList = []; List<SiteContactInfoModel> _siteContactList = [];
List<ModulesPermissionsModel> _modulesPermissionsModel = [];
UserContactInfoModel userInfoModel = UserContactInfoModel(); UserContactInfoModel userInfoModel = UserContactInfoModel();
SwipeTransaction get swipeTransactionModel => _swipeTransactionModel; SwipeTransaction get swipeTransactionModel => _swipeTransactionModel;
@ -59,6 +61,10 @@ class UserProvider extends ChangeNotifier {
List<SiteContactInfoModel> get siteContactList => _siteContactList; List<SiteContactInfoModel> get siteContactList => _siteContactList;
List<ModulesPermissionsModel> get modulesPermissionsList => _modulesPermissionsModel;
ModulesPermissionsModel currentModelPermission(int moduleId) => ModulesPermissionsModel.fromJson(_modulesPermissionsModel.singleWhere((module) => module.module!.value == moduleId).toJson());
set swipeHistory(List<SwipeHistory> value) { set swipeHistory(List<SwipeHistory> value) {
_swipeHistory = value; _swipeHistory = value;
notifyListeners(); notifyListeners();
@ -112,7 +118,7 @@ class UserProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
Response response; Response response;
try { try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); // showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson()); response = await ApiManager.instance.post(URLs.login, body: await user.toLoginJson());
_loading = false; _loading = false;
@ -122,16 +128,16 @@ class UserProvider extends ChangeNotifier {
_user!.profilePhotoName = URLs.getFileUrl(_user!.profilePhotoName); _user!.profilePhotoName = URLs.getFileUrl(_user!.profilePhotoName);
ApiManager.instance.user = _user; ApiManager.instance.user = _user;
notifyListeners(); notifyListeners();
Navigator.pop(context); // Navigator.pop(context);
return response.statusCode; return response.statusCode;
} }
notifyListeners(); notifyListeners();
Navigator.pop(context); // Navigator.pop(context);
return response.statusCode; return response.statusCode;
} catch (error) { } catch (error) {
// debugPrint(error); // debugPrint(error);
print('SSL or Network Error: $error'); print('SSL or Network Error: $error');
Navigator.pop(context); // Navigator.pop(context);
_loading = false; _loading = false;
notifyListeners(); notifyListeners();
return -1; return -1;
@ -172,6 +178,24 @@ class UserProvider extends ChangeNotifier {
} }
} }
Future<bool> getMobilePermissionByUser() async {
_modulesPermissionsModel = [];
Response response;
try {
response = await ApiManager.instance.get(URLs.getMobilePermissionByUser, enableToastMessage: false);
if (response.statusCode >= 200 && response.statusCode < 300) {
List dataList = json.decode(response.body)["data"] ?? [];
_modulesPermissionsModel = List.generate(dataList.length, (index) => ModulesPermissionsModel.fromJson(dataList[index])).where((module) => module.canView!).toList();
if (response.statusCode == 200) {
return true;
}
}
return false;
} catch (error) {
return false;
}
}
Future<bool> logout(BuildContext context) async { Future<bool> logout(BuildContext context) async {
Response response; Response response;
try { try {

@ -103,8 +103,11 @@ class _DashboardViewState extends State<DashboardView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
bool isNurse = (Provider.of<UserProvider>(context, listen: false).user?.type) == UsersTypes.normal_user;
final user = Provider.of<UserProvider>(context, listen: false).user; final user = Provider.of<UserProvider>(context, listen: false).user;
bool isEngineer = (user?.type) == UsersTypes.engineer;
///Need to check which info need to show on dashboard for quality user.
bool isQualityUser = (user?.type) == UsersTypes.qualityUser;
return Stack( return Stack(
children: [ children: [
Scaffold( Scaffold(
@ -126,7 +129,7 @@ class _DashboardViewState extends State<DashboardView> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [16.height, ProgressFragment(), 16.height, if (!isNurse) const RequestsFragment(), const RequestCategoryFragment()], children: [16.height, ProgressFragment(), 16.height, if (isEngineer) const RequestsFragment(), const RequestCategoryFragment()],
), ),
), ),
), ),

@ -95,6 +95,7 @@ class AppBarWidget extends StatelessWidget {
bool isSuccess = await context.userProvider.userChangeAssetGroup(); bool isSuccess = await context.userProvider.userChangeAssetGroup();
Utils.hideLoading(context); Utils.hideLoading(context);
if (isSuccess) { if (isSuccess) {
await context.userProvider.getMobilePermissionByUser();
settingProvider.setAssetGroup(newValue); settingProvider.setAssetGroup(newValue);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
context.settingProvider.setUser(ApiManager.instance.user!); context.settingProvider.setUser(ApiManager.instance.user!);

@ -0,0 +1,51 @@
class ModulesPermissionsModel {
bool? canAdd;
bool? canEdit;
bool? canView;
bool? canDelete;
Module? module;
ModulesPermissionsModel({this.canAdd, this.canEdit, this.canView, this.canDelete, this.module});
ModulesPermissionsModel.fromJson(Map<String, dynamic> json) {
canAdd = json['canAdd'];
canEdit = json['canEdit'];
canView = json['canView'];
canDelete = json['canDelete'];
module = json['module'] != null ? new Module.fromJson(json['module']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['canAdd'] = this.canAdd;
data['canEdit'] = this.canEdit;
data['canView'] = this.canView;
data['canDelete'] = this.canDelete;
if (this.module != null) {
data['module'] = this.module!.toJson();
}
return data;
}
}
class Module {
int? id;
String? name;
int? value;
Module({this.id, this.name, this.value});
Module.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
value = json['value'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
data['value'] = this.value;
return data;
}
}

@ -44,6 +44,7 @@ class RecurrentWoData {
String? scheduleDate; String? scheduleDate;
Status? status; Status? status;
Site? site; Site? site;
PlanRecurrent? planRecurrent;
Lookup? building; Lookup? building;
Lookup? floor; Lookup? floor;
Lookup? department; Lookup? department;
@ -64,6 +65,7 @@ class RecurrentWoData {
this.scheduleDate, this.scheduleDate,
this.status, this.status,
this.site, this.site,
this.planRecurrent,
this.building, this.building,
this.recurrentWoTimerModel, this.recurrentWoTimerModel,
this.floor, this.floor,
@ -72,7 +74,7 @@ class RecurrentWoData {
this.planRecurrentMedicalTaskRooms, this.planRecurrentMedicalTaskRooms,
this.planRecurrentTaskTimers, this.planRecurrentTaskTimers,
this.timerModelList, this.timerModelList,
this.recurrentWoTimePicker, this.recurrentWoTimePicker,
this.comment, this.comment,
this.totalWorkingHours}); this.totalWorkingHours});
@ -83,6 +85,7 @@ class RecurrentWoData {
engineer = json['engineer'] != null ? new Engineer.fromJson(json['engineer']) : null; engineer = json['engineer'] != null ? new Engineer.fromJson(json['engineer']) : null;
scheduleDate = json['scheduleDate']; scheduleDate = json['scheduleDate'];
status = json['status'] != null ? Status.fromJson(json['status']) : null; status = json['status'] != null ? Status.fromJson(json['status']) : null;
planRecurrent = json['status'] != null ? PlanRecurrent.fromJson(json['planRecurrent']) : null;
site = json['site'] != null ? Site.fromJson(json['site']) : null; site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json["building"] == null ? null : Lookup.fromJson(json["building"]); building = json["building"] == null ? null : Lookup.fromJson(json["building"]);
floor = json["floor"] == null ? null : Lookup.fromJson(json["floor"]); floor = json["floor"] == null ? null : Lookup.fromJson(json["floor"]);
@ -354,3 +357,124 @@ class PlanRecurrentTaskTimers {
return data; return data;
} }
} }
class PlanRecurrent {
int? taskTypeId;
Lookup? taskType;
String? planNo;
String? planName;
int? planSequence;
int? frequencyId;
String? frequency;
bool? autoConverstion;
String? comment;
String? scheduleDateFrom1;
String? scheduleDateFrom2;
Site? site;
Lookup? building;
Lookup? floor;
Lookup? department;
Lookup? room;
// List<Null>? planRecurrentMedicalRooms;
bool? friday;
bool? saturday;
bool? sunday;
bool? monday;
bool? tuesday;
bool? wednesday;
bool? thursday;
PlanRecurrent(
{this.taskTypeId,
this.taskType,
this.planNo,
this.planName,
this.planSequence,
this.frequencyId,
this.frequency,
this.autoConverstion,
this.comment,
this.scheduleDateFrom1,
this.scheduleDateFrom2,
this.site,
this.building,
this.floor,
this.department,
this.room,
// this.planRecurrentMedicalRooms,
this.friday,
this.saturday,
this.sunday,
this.monday,
this.tuesday,
this.wednesday,
this.thursday});
PlanRecurrent.fromJson(Map<String, dynamic> json) {
taskTypeId = json['taskTypeId'];
taskType = json['taskType'] != null ? new Lookup.fromJson(json['taskType']) : null;
planNo = json['planNo'];
planName = json['planName'];
planSequence = json['planSequence'];
frequencyId = json['frequencyId'];
frequency = json['frequency'];
autoConverstion = json['autoConverstion'];
comment = json['comment'];
scheduleDateFrom1 = json['scheduleDateFrom1'];
scheduleDateFrom2 = json['scheduleDateFrom2'];
site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json["building"] == null ? null : Lookup.fromJson(json["building"]);
floor = json["floor"] == null ? null : Lookup.fromJson(json["floor"]);
department = json["department"] == null ? null : Lookup.fromJson(json["department"]);
room = json["room"] == null ? null : Lookup.fromJson(json["room"]);
// if (json['planRecurrentMedicalRooms'] != null) {
// planRecurrentMedicalRooms = <Null>[];
// json['planRecurrentMedicalRooms'].forEach((v) {
// planRecurrentMedicalRooms!.add(new Null.fromJson(v));
// });
// }
friday = json['friday'];
saturday = json['saturday'];
sunday = json['sunday'];
monday = json['monday'];
tuesday = json['tuesday'];
wednesday = json['wednesday'];
thursday = json['thursday'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['taskTypeId'] = this.taskTypeId;
if (this.taskType != null) {
data['lookUp'] = this.taskType!.toJson();
}
data['planNo'] = this.planNo;
data['planName'] = this.planName;
data['planSequence'] = this.planSequence;
data['frequencyId'] = this.frequencyId;
data['frequency'] = this.frequency;
data['autoConverstion'] = this.autoConverstion;
data['comment'] = this.comment;
data['scheduleDateFrom1'] = this.scheduleDateFrom1;
data['scheduleDateFrom2'] = this.scheduleDateFrom2;
if (this.site != null) {
data['site'] = this.site!.toJson();
}
data['building'] = this.building;
data['floor'] = this.floor;
data['department'] = this.department;
data['room'] = this.room;
// if (this.planRecurrentMedicalRooms != null) {
// data['planRecurrentMedicalRooms'] = this.planRecurrentMedicalRooms!.map((v) => v.toJson()).toList();
// }
data['friday'] = this.friday;
data['saturday'] = this.saturday;
data['sunday'] = this.sunday;
data['monday'] = this.monday;
data['tuesday'] = this.tuesday;
data['wednesday'] = this.wednesday;
data['thursday'] = this.thursday;
return data;
}
}

@ -14,11 +14,13 @@ import 'package:test_sa/views/widgets/loaders/image_loader.dart';
class AssetDetailCardView extends StatelessWidget { class AssetDetailCardView extends StatelessWidget {
AssetInventoryModel assetInventoryModel; AssetInventoryModel assetInventoryModel;
VoidCallback onDeletePress; VoidCallback onDeletePress;
bool canDelete;
AssetDetailCardView({ AssetDetailCardView({
super.key, super.key,
required this.assetInventoryModel, required this.assetInventoryModel,
required this.onDeletePress, required this.onDeletePress,
this.canDelete = false,
}); });
@override @override
@ -32,9 +34,10 @@ class AssetDetailCardView extends StatelessWidget {
context.translation.assetInformation, context.translation.assetInformation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
).expanded, ).expanded,
'delete_icon'.toSvgAsset().onPress(() { if (canDelete)
onDeletePress(); 'delete_icon'.toSvgAsset().onPress(() {
}), onDeletePress();
}),
], ],
), ),
8.height, 8.height,
@ -45,7 +48,8 @@ class AssetDetailCardView extends StatelessWidget {
Text( Text(
'${context.translation.assetNumber}: ${assetInventoryModel.assetNumber ?? '-'}', '${context.translation.assetNumber}: ${assetInventoryModel.assetNumber ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), Text( ),
Text(
'${context.translation.assetName}: ${assetInventoryModel.assetName ?? '-'}', '${context.translation.assetName}: ${assetInventoryModel.assetName ?? '-'}',
style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120),
), ),

@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/modules/asset_inventory_module/models/session_model.dart'; import 'package:test_sa/modules/asset_inventory_module/models/session_model.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_detail_view.dart'; import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_detail_view.dart';
import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_scan_assets_view.dart'; import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_scan_assets_view.dart';
@ -19,8 +20,9 @@ import '../provider/asset_inventory_provider.dart';
class AssetInventoryPage extends StatefulWidget { class AssetInventoryPage extends StatefulWidget {
final int sessionId; final int sessionId;
final int moduleId;
const AssetInventoryPage({Key? key, required this.sessionId}) : super(key: key); const AssetInventoryPage({Key? key, required this.sessionId, required this.moduleId}) : super(key: key);
@override @override
_AssetInventoryPageState createState() { _AssetInventoryPageState createState() {
@ -35,6 +37,7 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
void initState() { void initState() {
super.initState(); super.initState();
_assetInventoryProvider = Provider.of<AssetInventoryProvider>(context, listen: false); _assetInventoryProvider = Provider.of<AssetInventoryProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
getInitialData(); getInitialData();
}); });
@ -42,6 +45,7 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
Future<void> getInitialData() async { Future<void> getInitialData() async {
_assetInventoryProvider.reset(); _assetInventoryProvider.reset();
_assetInventoryProvider.modelPermission = context.userProvider.currentModelPermission(widget.moduleId);
await _assetInventoryProvider.getSessionById(id: widget.sessionId); await _assetInventoryProvider.getSessionById(id: widget.sessionId);
await _assetInventoryProvider.getAssetsInSession( await _assetInventoryProvider.getAssetsInSession(
sessionId: widget.sessionId, sessionId: widget.sessionId,
@ -100,15 +104,16 @@ class _AssetInventoryPageState extends State<AssetInventoryPage> {
AssetInventoryScanAssetView(sessionId: provider.sessionModel?.id ?? 0), AssetInventoryScanAssetView(sessionId: provider.sessionModel?.id ?? 0),
], ],
).expanded, ).expanded,
FooterActionButton.footerContainer( if (provider.modelPermission?.canEdit ?? false)
context: context, FooterActionButton.footerContainer(
child: AppFilledButton( context: context,
buttonColor: AppColor.primary10, child: AppFilledButton(
label: 'Scan Assets'.addTranslation, buttonColor: AppColor.primary10,
onPressed: () => _scanAsset(provider: provider), label: 'Scan Assets'.addTranslation,
// buttonColor: AppColor.primary10, onPressed: () => _scanAsset(provider: provider),
), // buttonColor: AppColor.primary10,
) ),
)
], ],
), ),
); );

@ -65,6 +65,7 @@ class _AssetInventoryScanAssetViewState extends State<AssetInventoryScanAssetVie
} }
return AssetDetailCardView( return AssetDetailCardView(
assetInventoryModel: assets[index], assetInventoryModel: assets[index],
canDelete: (provider.modelPermission?.canEdit ?? false),
onDeletePress: () async { onDeletePress: () async {
await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async { await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async {
if (success) { if (success) {

@ -161,6 +161,7 @@ class _SiteInformationPageState extends State<SiteInformationPage> {
itemCount: assets.length, itemCount: assets.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
return AssetDetailCardView( return AssetDetailCardView(
canDelete: (provider.modelPermission?.canEdit ?? false),
assetInventoryModel: assets[index], assetInventoryModel: assets[index],
onDeletePress: () async { onDeletePress: () async {
await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async { await provider.deleteAssetISession(id: assets[index].id ?? 0).then((success) async {

@ -58,7 +58,7 @@ class InventorySessionItemView extends StatelessWidget {
), ),
], ],
).toShadowContainer(context, withShadow: showShadow).onPress(() async { ).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestData!.id!))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestData!.id!, moduleId: requestData!.transactionNo!)));
}); });
} }
return Column( return Column(
@ -99,7 +99,7 @@ class InventorySessionItemView extends StatelessWidget {
), ),
], ],
).toShadowContainer(context, withShadow: showShadow).onPress(() async { ).toShadowContainer(context, withShadow: showShadow).onPress(() async {
Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestDetails!.id!))); Navigator.of(context).push(MaterialPageRoute(builder: (_) => AssetInventoryPage(sessionId: requestDetails!.id!, moduleId: requestDetails!.transactionType!)));
}); });
} }

@ -11,6 +11,7 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/asset_search.dart'; import 'package:test_sa/models/device/asset_search.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/module_permissions_model.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_report.dart'; import 'package:test_sa/models/service_request/service_report.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
@ -46,8 +47,11 @@ class AssetInventoryProvider extends ChangeNotifier {
List<AssetInventoryModel> sessionAssetList = []; List<AssetInventoryModel> sessionAssetList = [];
List<AssetInventoryModel> siteFilterAssetList = []; List<AssetInventoryModel> siteFilterAssetList = [];
ModulesPermissionsModel? modelPermission;
void reset() { void reset() {
pageNo = 1; pageNo = 1;
modelPermission = null;
assetInventoryResponse = null; assetInventoryResponse = null;
sessionModel = null; sessionModel = null;
sessionAssetList = []; sessionAssetList = [];

@ -9,7 +9,6 @@ class InternalAuditAttachments {
String? createdBy; String? createdBy;
InternalAuditAttachments.fromJson(Map<String, dynamic> json) { InternalAuditAttachments.fromJson(Map<String, dynamic> json) {
log('name is ${json['name']}');
id = json['id']; id = json['id'];
name = (json['name'] != null && !json['name'].toString().startsWith('data:image/jpeg')) ? json['name'] : null; name = (json['name'] != null && !json['name'].toString().startsWith('data:image/jpeg')) ? json['name'] : null;
originalName = json['originalName']; originalName = json['originalName'];

@ -103,7 +103,7 @@ class _EquipmentInternalAuditDetailPageState extends State<EquipmentInternalAudi
], ],
).paddingAll(0).toShadowContainer(context), ).paddingAll(0).toShadowContainer(context),
).expanded, ).expanded,
if (context.userProvider.isEngineer) if (context.userProvider.isEngineer&&model?.status?.value!=3)
FooterActionButton.footerContainer( FooterActionButton.footerContainer(
context: context, context: context,
child: AppFilledButton( child: AppFilledButton(

@ -61,6 +61,7 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
void populateForm() { void populateForm() {
formModel.requestId = widget.model?.id; formModel.requestId = widget.model?.id;
formModel.id = widget.model?.id; formModel.id = widget.model?.id;
formModel.debrief = widget.model?.engineerData?.debrief;
_attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? []; _attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? [];
calculateWorkingTime(); calculateWorkingTime();
@ -92,33 +93,36 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
_onSubmit(BuildContext context) async { _onSubmit(BuildContext context) async {
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false; bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
/// Need to refactor this code when timer requirements clear keep picker or both.
// formModel.auditTimers ??= [];
// if (formModel.auditTimePicker != null) {
// int durationInSecond = formModel.auditTimePicker!.endAt!.difference(formModel.auditTimePicker!.startAt!).inSeconds;
// formModel.auditTimers?.add(
// InternalAuditTimerModel(
// id: 0,
// startDate: formModel.auditTimePicker!.startAt!.toIso8601String(), // Handle potential null
// endDate: formModel.auditTimePicker!.endAt?.toIso8601String(), // Handle potential null
// totalWorkingHour: ((durationInSecond) / 60 / 60),
// ),
// );
// }
// formModel.timerModelList?.forEach((timer) {
// int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
// formModel.auditTimers?.add(
// InternalAuditTimerModel(
// id: 0,
// startDate: timer.startAt!.toIso8601String(), // Handle potential null
// endDate: timer.endAt?.toIso8601String(), // Handle potential null
// totalWorkingHour: ((durationInSecond) / 60 / 60),
// ),
// );
// });
InternalAuditProvider provider = Provider.of<InternalAuditProvider>(context, listen: false); InternalAuditProvider provider = Provider.of<InternalAuditProvider>(context, listen: false);
if ( formModel.startTime == null) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); Fluttertoast.showToast(msg: "Working Hours Required");
formModel.auditTimers ??= []; return;
if (formModel.auditTimePicker != null) {
int durationInSecond = formModel.auditTimePicker!.endAt!.difference(formModel.auditTimePicker!.startAt!).inSeconds;
formModel.auditTimers?.add(
InternalAuditTimerModel(
id: 0,
startDate: formModel.auditTimePicker!.startAt!.toIso8601String(), // Handle potential null
endDate: formModel.auditTimePicker!.endAt?.toIso8601String(), // Handle potential null
totalWorkingHour: ((durationInSecond) / 60 / 60),
),
);
} }
formModel.timerModelList?.forEach((timer) { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
formModel.auditTimers?.add(
InternalAuditTimerModel(
id: 0,
startDate: timer.startAt!.toIso8601String(), // Handle potential null
endDate: timer.endAt?.toIso8601String(), // Handle potential null
totalWorkingHour: ((durationInSecond) / 60 / 60),
),
);
});
_formKey.currentState!.save(); _formKey.currentState!.save();
formModel.attachments = []; formModel.attachments = [];
for (var item in _attachments) { for (var item in _attachments) {
@ -133,17 +137,22 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
} }
final success = await provider.updateEquipmentInternalAudit(model: formModel); final success = await provider.updateEquipmentInternalAudit(model: formModel);
Navigator.pop(context); Navigator.pop(context);
if (formModel.isComplete == true) { // if (formModel.isComplete == true) {
//Navigate to List screen.
} else if (formModel.isComplete == false) {
//Navigate to Detail screen.
if (success) { if (success) {
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
} else { } else {
Fluttertoast.showToast(msg: 'Failed to update'); Fluttertoast.showToast(msg: 'Failed to update');
} }
//Navigate to List screen.
// } else if (formModel.isComplete == false) {
// //Navigate to Detail screen.
// if (success) {
// Navigator.of(context).pop(true);
// } else {
// Fluttertoast.showToast(msg: 'Failed to update');
// }
} // }
} }
@override @override
@ -292,7 +301,7 @@ class _UpdateEquipmentInternalAuditPageState extends State<UpdateEquipmentIntern
timer: formModel.auditTimerModel, timer: formModel.auditTimerModel,
pickerFromDate: DateTime.tryParse(widget.model?.createdDate ?? ''), pickerFromDate: DateTime.tryParse(widget.model?.createdDate ?? ''),
pickerTimer: formModel.auditTimePicker, pickerTimer: formModel.auditTimePicker,
showPicker: false, showTimer: false,
onPick: (timer) { onPick: (timer) {
updateTimer(timer: timer); updateTimer(timer: timer);
}, },

@ -105,7 +105,7 @@ class _SystemInternalAuditDetailPageState extends State<SystemInternalAuditDetai
], ],
).paddingAll(0).toShadowContainer(context), ).paddingAll(0).toShadowContainer(context),
).expanded, ).expanded,
if (context.userProvider.isEngineer) if (context.userProvider.isEngineer && model?.status?.value != 3)
FooterActionButton.footerContainer( FooterActionButton.footerContainer(
context: context, context: context,
child: AppFilledButton( child: AppFilledButton(

@ -61,6 +61,7 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
void populateForm() { void populateForm() {
formModel.requestId = widget.model?.id; formModel.requestId = widget.model?.id;
formModel.id = widget.model?.id; formModel.id = widget.model?.id;
formModel.debrief = widget.model?.engineerData?.debrief;
_attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? []; _attachments = widget.model?.engineerData?.attachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt() ?? 0, name: e.name!)).toList() ?? [];
calculateWorkingTime(); calculateWorkingTime();
@ -91,33 +92,38 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
} }
_onSubmit(BuildContext context) async { _onSubmit(BuildContext context) async {
/// Need to refactor this code when timer requirements clear keep picker or both.
// // formModel.auditTimers ??= [];
// // if (formModel.auditTimePicker != null) {
// // int durationInSecond = formModel.auditTimePicker!.endAt!.difference(formModel.auditTimePicker!.startAt!).inSeconds;
// // formModel.auditTimers?.add(
// // InternalAuditTimerModel(
// // id: 0,
// // startDate: formModel.auditTimePicker!.startAt!.toIso8601String(), // Handle potential null
// // endDate: formModel.auditTimePicker!.endAt?.toIso8601String(), // Handle potential null
// // // endDate: formModel.auditTimePicker!.startAt?.add(const Duration(hours: 1)).toIso8601String(), // Handle potential null
// // totalWorkingHour: ((durationInSecond) / 60 / 60),
// // ),
// // );
// // }
// // formModel.timerModelList?.forEach((timer) {
// // int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
// // formModel.auditTimers?.add(
// // InternalAuditTimerModel(
// // id: 0,
// // startDate: timer.startAt!.toIso8601String(), // Handle potential null
// // endDate: timer.endAt?.toIso8601String(), // Handle potential null
// // totalWorkingHour: ((durationInSecond) / 60 / 60),
// // ),
// // );
// // });
bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false; bool isTimerPickerEnable = ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
InternalAuditProvider provider = Provider.of<InternalAuditProvider>(context, listen: false); InternalAuditProvider provider = Provider.of<InternalAuditProvider>(context, listen: false);
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); if ( formModel.startTime == null) {
Fluttertoast.showToast(msg: "Working Hours Required");
formModel.auditTimers ??= []; return;
if (formModel.auditTimePicker != null) {
int durationInSecond = formModel.auditTimePicker!.endAt!.difference(formModel.auditTimePicker!.startAt!).inSeconds;
formModel.auditTimers?.add(
InternalAuditTimerModel(
id: 0,
startDate: formModel.auditTimePicker!.startAt!.toIso8601String(), // Handle potential null
endDate: formModel.auditTimePicker!.endAt?.toIso8601String(), // Handle potential null
totalWorkingHour: ((durationInSecond) / 60 / 60),
),
);
} }
formModel.timerModelList?.forEach((timer) { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int durationInSecond = timer.endAt!.difference(timer.startAt!).inSeconds;
formModel.auditTimers?.add(
InternalAuditTimerModel(
id: 0,
startDate: timer.startAt!.toIso8601String(), // Handle potential null
endDate: timer.endAt?.toIso8601String(), // Handle potential null
totalWorkingHour: ((durationInSecond) / 60 / 60),
),
);
});
_formKey.currentState!.save(); _formKey.currentState!.save();
formModel.attachments = []; formModel.attachments = [];
@ -131,18 +137,12 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
), ),
); );
} }
log('submit press');
log('data ${formModel.toJson()}');
final success = await provider.updateSystemInternalAudit(model: formModel); final success = await provider.updateSystemInternalAudit(model: formModel);
Navigator.pop(context); Navigator.pop(context);
if (formModel.isComplete == true) { if (success) {
//Navigate to List screen. Navigator.of(context).pop(true);
} else if (formModel.isComplete == false) { } else {
if (success) { Fluttertoast.showToast(msg: 'Failed to update');
Navigator.of(context).pop(true);
} else {
Fluttertoast.showToast(msg: 'Failed to update');
}
} }
} }
@ -162,6 +162,9 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
formModel.startTime = start; formModel.startTime = start;
formModel.endTime = end; formModel.endTime = end;
formModel.totalHours = totalHours; formModel.totalHours = totalHours;
setState(() {
});
} }
} }
@ -231,7 +234,6 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
buttonColor: context.isDark ? AppColor.neutral70 : AppColor.white60, buttonColor: context.isDark ? AppColor.neutral70 : AppColor.white60,
textColor: context.isDark ? AppColor.white10 : AppColor.black10, textColor: context.isDark ? AppColor.white10 : AppColor.black10,
onPressed: () { onPressed: () {
log('button press ');
formModel.isComplete = false; formModel.isComplete = false;
_onSubmit(context); _onSubmit(context);
}).expanded, }).expanded,
@ -283,8 +285,9 @@ class _UpdateSystemInternalAuditPageState extends State<UpdateSystemInternalAudi
// ), // ),
AppTimer( AppTimer(
label: context.translation.workingHours, label: context.translation.workingHours,
showPicker: false, showTimer: false,
timer: formModel.auditTimerModel, timer: formModel.auditTimerModel,
// enabled:formModel.endTime==null,
pickerFromDate: DateTime.tryParse(widget.model?.createdDate ?? ''), pickerFromDate: DateTime.tryParse(widget.model?.createdDate ?? ''),
pickerTimer: formModel.auditTimePicker, pickerTimer: formModel.auditTimePicker,
onPick: (time) { onPick: (time) {

@ -78,6 +78,7 @@ class _RecurrentTaskInfoWidgetState extends State<RecurrentTaskInfoWidget> {
widget.model!.title!.bodyText(context).custom(color: AppColor.textColor(context)), widget.model!.title!.bodyText(context).custom(color: AppColor.textColor(context)),
2.height, 2.height,
'${context.translation.taskNo}: ${widget.model!.taskNo!}'.bodyText2(context).custom(color: AppColor.neutral120), '${context.translation.taskNo}: ${widget.model!.taskNo!}'.bodyText2(context).custom(color: AppColor.neutral120),
'Plan Name: ${widget.model?.planRecurrent?.planName ?? "-"}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.site}: ${widget.model!.site!.siteName!}'.bodyText2(context).custom(color: AppColor.neutral120), '${context.translation.site}: ${widget.model!.site!.siteName!}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.assignedEmployee}: ${widget.model!.engineer!.userName ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120), '${context.translation.assignedEmployee}: ${widget.model!.engineer!.userName ?? ""}'.bodyText2(context).custom(color: AppColor.neutral120),
'${context.translation.scheduledDate}: ${widget.model!.scheduleDate!.toMonthYearFormat}'.bodyText2(context).custom(color: AppColor.neutral120), '${context.translation.scheduledDate}: ${widget.model!.scheduleDate!.toMonthYearFormat}'.bodyText2(context).custom(color: AppColor.neutral120),
@ -95,7 +96,7 @@ class _RecurrentTaskInfoWidgetState extends State<RecurrentTaskInfoWidget> {
8.height, 8.height,
buildingInfoWidget(label: context.translation.room, value: widget.model!.room?.name?.cleanupWhitespace.capitalizeFirstOfEach, context: context), buildingInfoWidget(label: context.translation.room, value: widget.model!.room?.name?.cleanupWhitespace.capitalizeFirstOfEach, context: context),
8.height, 8.height,
_timerWidget(context,totalWorkingHours), _timerWidget(context, totalWorkingHours),
8.height, 8.height,
_commentWidget(context: context, model: widget.model) _commentWidget(context: context, model: widget.model)
], ],

@ -96,7 +96,22 @@ class CreateRequestModel {
static List<CreateRequestModel> requestsList(BuildContext context) { static List<CreateRequestModel> requestsList(BuildContext context) {
List<CreateRequestModel> list = []; List<CreateRequestModel> list = [];
log('user type is ${context.userProvider.isQualityUser}'); // switching to users permissions
// context.userProvider.modulesPermissionsList.where((module) => module.canAdd!).toList().forEach((module) {
// switch (module.module!.value) {
// case 1:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateNewRequest.id));
//
// case 2:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", GasRefillRequestForm.routeName));
//
// case 3:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateDeviceTransferRequest.id));
//
// case 4:
// list.add(CreateRequestModel(module.module!.name!, "add_icon", CreateTaskView.id));
// }
// });
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser) {
list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id)); list.add(CreateRequestModel("Equipment Internal Audit Checklist".addTranslation, "add_icon", CreateEquipmentInternalAuditForm.id));
list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id)); list.add(CreateRequestModel("System Internal Audit Checklist".addTranslation, "add_icon", CreateSystemInternalAuditForm.id));

@ -61,7 +61,14 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
); );
search!.searchBySelectedValue = search?.requestNumber; search!.searchBySelectedValue = search?.requestNumber;
} }
var types = { Map<String, int> types = {};
// switching to users permissions
// context.userProvider.modulesPermissionsList.forEach((module) {
// types[module.module!.name!] = module.module!.value!;
// });
types = {
context.translation.correctiveMaintenance: 1, context.translation.correctiveMaintenance: 1,
context.translation.gasRefill: 2, context.translation.gasRefill: 2,
context.translation.transferAsset: 3, context.translation.transferAsset: 3,
@ -80,6 +87,13 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
types['Recall and Alert'] = 7; types['Recall and Alert'] = 7;
} }
// switching asset inventory to users permissions
context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
types[module.module!.name!] = module.module!.value!;
}
});
if (!isEngineer) { if (!isEngineer) {
types['TRAF'] = 9; types['TRAF'] = 9;
} }

@ -54,14 +54,17 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (context.settingProvider.isUserFlowMedical && Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) { if (context.settingProvider.isUserFlowMedical && Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {
requestsList.add(Request(7, 'Recall and Alert')); requestsList.add(Request(7, 'Recall and Alert'));
} }
if (Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {
requestsList.add(Request(8, 'Inventory Session'.addTranslation)); // switching asset inventory to users permissions
} context.userProvider.modulesPermissionsList.forEach((module) {
if (module.module!.value! == 8) {
requestsList.add(Request(module.module!.value!, module.module!.name!.addTranslation));
}
});
if (context.userProvider.user!.type == UsersTypes.normal_user) { if (context.userProvider.user!.type == UsersTypes.normal_user) {
requestsList.add(Request(9, 'TRAF')); requestsList.add(Request(9, 'TRAF'));
} }
if (context.userProvider.isEngineer) { if (context.userProvider.isEngineer) {
// TODO need to replace with actual number.
requestsList.add(Request(10, 'Equipment Internal Audit')); requestsList.add(Request(10, 'Equipment Internal Audit'));
requestsList.add(Request(11, 'System Internal Audit')); requestsList.add(Request(11, 'System Internal Audit'));
} }
@ -77,7 +80,6 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (context.userProvider.isQualityUser) { if (context.userProvider.isQualityUser) {
requestsList = [ requestsList = [
Request(null, context.translation.allWorkOrder), Request(null, context.translation.allWorkOrder),
//TODO need to replace with actual number.
Request(10, 'Equipment Internal Audit'), Request(10, 'Equipment Internal Audit'),
Request(11, 'System Internal Audit'), Request(11, 'System Internal Audit'),
]; ];

@ -25,6 +25,7 @@ import '../../controllers/providers/settings/setting_provider.dart';
import '../../controllers/validator/validator.dart'; import '../../controllers/validator/validator.dart';
import '../../models/user.dart'; import '../../models/user.dart';
import '../common_widgets/app_filled_button.dart'; import '../common_widgets/app_filled_button.dart';
import '../common_widgets/app_lazy_loading.dart';
import '../common_widgets/app_text_form_field.dart'; import '../common_widgets/app_text_form_field.dart';
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
@ -237,10 +238,13 @@ class _LoginPageState extends State<LoginPage> {
return; return;
} }
_formKey.currentState!.save(); _formKey.currentState!.save();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
int status = await _userProvider.login(context: context, user: _user); int status = await _userProvider.login(context: context, user: _user);
if (status >= 200 && status < 300 && _userProvider.user!.isAuthenticated! ?? false) { if (status >= 200 && status < 300 && _userProvider.user!.isAuthenticated! ?? false) {
await _userProvider.getMobilePermissionByUser();
await _settingProvider!.setUser(_userProvider.user!); await _settingProvider!.setUser(_userProvider.user!);
Navigator.pop(context);
// (await SharedPreferences.getInstance()).remove(ASettings.localAuth); // (await SharedPreferences.getInstance()).remove(ASettings.localAuth);
await _settingProvider!.setRememberMe(_user.userName!, _user.password!, rememberMe); await _settingProvider!.setRememberMe(_user.userName!, _user.password!, rememberMe);
//TODO need to verify this here... //TODO need to verify this here...
@ -251,6 +255,7 @@ class _LoginPageState extends State<LoginPage> {
} }
Navigator.pushReplacementNamed(context, LandPage.routeName); Navigator.pushReplacementNamed(context, LandPage.routeName);
} else { } else {
Navigator.pop(context);
Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest); Fluttertoast.showToast(msg: _userProvider.user?.message ?? context.translation.failedToCompleteRequest);
} }
} }

@ -116,6 +116,7 @@ class _SplashPageState extends State<SplashPage> {
}); });
if (status && _userProvider.refreshedUser != null) { if (status && _userProvider.refreshedUser != null) {
_userProvider.refreshedUser!.token = _settingProvider.user?.token; _userProvider.refreshedUser!.token = _settingProvider.user?.token;
await _userProvider.getMobilePermissionByUser();
await _settingProvider.setUser(_userProvider.refreshedUser!); await _settingProvider.setUser(_userProvider.refreshedUser!);
_userProvider.setUser(_userProvider.refreshedUser!); _userProvider.setUser(_userProvider.refreshedUser!);
await _settingProvider.setAuth(_settingProvider.user?.isEnabledFaceId ?? false); await _settingProvider.setAuth(_settingProvider.user?.isEnabledFaceId ?? false);

@ -22,7 +22,7 @@ class AppTimer extends StatefulWidget {
final TextStyle? style; final TextStyle? style;
final BoxDecoration? decoration; final BoxDecoration? decoration;
final bool enabled; final bool enabled;
final bool showPicker; final bool showTimer;
final String? label; final String? label;
final double? width; final double? width;
@ -41,7 +41,7 @@ class AppTimer extends StatefulWidget {
this.onPick, this.onPick,
this.timerProgress, this.timerProgress,
this.enabled = true, this.enabled = true,
this.showPicker = true, this.showTimer = true,
}) : super(key: key); }) : super(key: key);
@override @override
@ -128,8 +128,8 @@ class _AppTimerState extends State<AppTimer> {
@override @override
void initState() { void initState() {
///this is temp check for internal audit ///this is temp check for internal audit to always show picker.
canPickTime = widget.showPicker == false ? false : ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false; canPickTime = widget.showTimer == false ? true : ApiManager.instance.assetGroup?.enabledEngineerTimer ?? false;
_startAt = widget.timer?.startAt; _startAt = widget.timer?.startAt;
_endAt = widget.timer?.endAt; _endAt = widget.timer?.endAt;
_running = _startAt != null && _endAt == null; _running = _startAt != null && _endAt == null;
@ -286,50 +286,51 @@ class _AppTimerState extends State<AppTimer> {
], ],
8.height, 8.height,
], ],
Container( if (widget.showTimer)
// width: widget.width ?? 100 * AppStyle.getScaleFactor(context), Container(
height: 56.toScreenHeight, // width: widget.width ?? 100 * AppStyle.getScaleFactor(context),
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth), height: 56.toScreenHeight,
decoration: widget.decoration ?? padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
BoxDecoration( decoration: widget.decoration ??
color: context.isDark && !widget.enabled BoxDecoration(
? AppColor.neutral60 color: context.isDark && !widget.enabled
: !widget.enabled ? AppColor.neutral60
// backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90, : !widget.enabled
? AppColor.neutral40 // backgroundColor: context.isDark ? AppColor.neutral20 : AppColor.neutral90,
: AppColor.fieldBgColor(context), ? AppColor.neutral40
borderRadius: BorderRadius.circular(10), : AppColor.fieldBgColor(context),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], borderRadius: BorderRadius.circular(10),
), boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
child: _loading
? const SizedBox.square(dimension: 18, child: CircularProgressIndicator(color: Colors.white))
: Row(
children: [
Expanded(
child: ValueListenableBuilder<String>(
valueListenable: _period,
builder: (context, value, _) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(widget.label ?? "Timer").tinyFont(context),
value.bodyText(context).custom(
color: widget.enabled
? context.isDark
? AppColor.neutral30
: AppColor.neutral50
: AppColor.neutral20,
),
],
);
},
),
),
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
],
), ),
).onPress(_loading || !widget.enabled ? null : _onPressed), child: _loading
? const SizedBox.square(dimension: 18, child: CircularProgressIndicator(color: Colors.white))
: Row(
children: [
Expanded(
child: ValueListenableBuilder<String>(
valueListenable: _period,
builder: (context, value, _) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(widget.label ?? "Timer").tinyFont(context),
value.bodyText(context).custom(
color: widget.enabled
? context.isDark
? AppColor.neutral30
: AppColor.neutral50
: AppColor.neutral20,
),
],
);
},
),
),
if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow),
],
),
).onPress(_loading || !widget.enabled ? null : _onPressed),
], ],
); );
} }

Loading…
Cancel
Save