Merge remote-tracking branch 'origin/design_3.0_TM_Module_bug_fixes' into design_3.0_TM_Module_bug_fixes

design_3.0_task_module_new
Sikander Saleem 4 months ago
commit 50eb16ce32

@ -4,11 +4,11 @@ class URLs {
static const String appReleaseBuildNumber = "16";
// static const host1 = "https://atomsm.hmg.com"; // production url
// static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
static const host1 = "https://atomsmdev.hmg.com"; // local DEV url
// static const host1 = "https://atomsmuat.hmg.com"; // local UAT url
static String _baseUrl = "$_host/mobile";
// static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static String _baseUrl = "$_host/mobile";
static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis
// static final String _baseUrl = "$_host/mobile"; // host local UAT
// static final String _baseUrl = "$_host/v3/mobile"; // v3 for new CM,PM,TM
@ -42,6 +42,8 @@ class URLs {
static get getAssetById => "$_baseUrl/Asset/GetAssetById?assetId="; // get
static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2
static get getAllRequestsAndCount => "$_baseUrl/CallRequest/GetAllRequestsAndCount"; // get
static get updateUserContactInformation => "$_baseUrl/Account/UpdateContactInfo"; // get
//service request new flow urls.
static get nurseDashboardCountUrl => '$_baseUrl/ServiceRequest/GetDashboardNurseCount';

@ -3,9 +3,11 @@ import 'dart:developer';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.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/verify_otp_model.dart';
@ -35,6 +37,7 @@ class UserProvider extends ChangeNotifier {
VerifyOtpModel _verifyOtpModel = VerifyOtpModel();
SwipeTransaction _swipeTransactionModel = SwipeTransaction();
List<SwipeHistory> _swipeHistory = [];
UserContactInfoModel userInfoModel =UserContactInfoModel();
SwipeTransaction get swipeTransactionModel => _swipeTransactionModel;
@ -263,6 +266,43 @@ class UserProvider extends ChangeNotifier {
return -1;
}
}
// Future<int> updateContactInfo({required UserContactInfoModel model}) async {
// Response response;
// try {
// isLoading = true;
// notifyListeners();
// response = await ApiManager.instance.put('${URLs.updateUserContactInformation}/userId?userId=${model.userId}', body: model.toJson());
// isLoading = false;
// notifyListeners();
// return response.statusCode;
// } catch (e) {
// log("engineer mark as fixed [error] : $e");
// isLoading = false;
// notifyListeners();
// return -1;
// }
// }
Future<void> updateContactInfo({
required BuildContext context,
}) async {
late Response response;
try {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
response = await ApiManager.instance.put('${URLs.updateUserContactInformation}/userId?userId=${userInfoModel.userId}', body: userInfoModel.toJson());
if (response.statusCode >= 200 && response.statusCode < 300) {
Navigator.pop(context);
} else {
print('i am here..');
Fluttertoast.showToast(msg: "${context.translation.failedToCompleteRequest} :${json.decode(response.body)['message']}");
}
Navigator.pop(context);
} catch (error) {
notifyListeners();
Navigator.pop(context);
print(error);
}
}
Future<SwipeModel> makeSwipe({required Swipe model}) async {
isLoading = true;

@ -57,16 +57,18 @@ class WorkOrderAttachments {
int? id;
String? name;
String ?createdBy;
WorkOrderAttachments.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
createdBy = json['createdBy'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
return data;
}
}

@ -300,3 +300,20 @@ class AssetGroup {
return data;
}
}
class UserContactInfoModel {
dynamic userId;
String? email;
String? phoneNo;
String? extensionNo;
UserContactInfoModel({this.email, this.phoneNo, this.extensionNo, this.userId});
Map<String, dynamic> toJson() {
return {
'email': email,
'mobileNumber': phoneNo,
'extensionNo': extensionNo,
};
}
}

@ -318,6 +318,13 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
),
],
//workOrderNextStepStatus == WorkOrderNextStepEnum.assignToMe
// if (activity.activitySparePart?.acitiySparePartAttachments?.isNotEmpty ?? false) ...[
// 2.height,
// const Divider().defaultStyle(context),
// FilesList(images: activity.activitySparePart!.acitiySparePartAttachments!.map((toElement) => URLs.getFileUrl(toElement.name!)!).toList()),
// ],
if (!requestProvider.isReadOnlyRequest && userProvider.user?.type == UsersTypes.engineer && workOrder.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[
8.height,
const Divider().defaultStyle(context),

@ -106,6 +106,7 @@ class _AssistantEmployeeCardState extends State<AssistantEmployeeCard> {
label: context.translation.startTime,
hideShadow: true,
backgroundColor: AppColor.neutral100,
from:requestDetailProvider.currentWorkOrder?.data?.requestedDate,
date: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate,
formatDateWithTime: true,
onDatePicker: (selectedDate) {

@ -115,6 +115,7 @@ class _InternalMaintenanceRequestState extends State<InternalMaintenanceRequest>
timer: requestDetailProvider.activityMaintenanceHelperModel?.activityMaintenanceTimerModel,
enabled: enableTimer,
pickerTimer: requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker,
pickerFromDate: requestDetailProvider.currentWorkOrder?.data?.requestedDate,
onPick: (time) {
requestDetailProvider.activityMaintenanceHelperModel?.activityTimePicker = time;
},

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/ppm_provider.dart';
@ -89,12 +91,14 @@ class ExternalDetailItem extends StatefulWidget {
final PreventiveVisitSuppliers model;
final VoidCallback onRemove;
final int index;
final String ?createdDate;
const ExternalDetailItem({
Key? key,
required this.model,
required this.onRemove,
required this.index,
this.createdDate,
}) : super(key: key);
@override
@ -183,6 +187,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
backgroundColor: AppColor.neutral100,
date: widget.model.startDateTime,
formatDateWithTime: true,
from:DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate??'') ,
onDatePicker: (selectedDate) {
showTimePicker(
context: context,
@ -220,6 +225,7 @@ class _ExternalDetailItemState extends State<ExternalDetailItem> {
backgroundColor: AppColor.neutral100,
date: widget.model.endDateTime,
formatDateWithTime: true,
from:DateTime.tryParse(_ppmProvider?.planPreventiveVisit?.creationDate??'') ,
onDatePicker: (selectedDate) {
showTimePicker(
context: context,

@ -185,7 +185,9 @@ class _UpdatePpmState extends State<UpdatePpm> with TickerProviderStateMixin {
controller: _tabController,
children: [
if (ppmProvider.totalTabs == 4) ...[
PpmExternalDetailsForm(models: _planPreventiveVisit.preventiveVisitSuppliers),
PpmExternalDetailsForm(
models: _planPreventiveVisit.preventiveVisitSuppliers,
),
],
PpmCalibrationToolsForm(models: _planPreventiveVisit.preventiveVisitCalibrations),
PpmPMKitsForm(models: _planPreventiveVisit.preventiveVisitKits, assetId: _planPreventiveVisit.asset?.id),

@ -184,6 +184,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: widget.planPreventiveVisit.acutalDateOfVisit,
from: DateTime.tryParse(widget.planPreventiveVisit.creationDate??''),
formatDateWithTime: true,
onDatePicker: (selectedDate) {
showTimePicker(
@ -355,6 +356,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
width: double.infinity,
timer: widget.planPreventiveVisit.tbsTimer,
pickerTimer: widget.planPreventiveVisit.ppMTimePicker,
pickerFromDate: DateTime.tryParse(widget.planPreventiveVisit.creationDate??''),
onPick: (time) {
widget.planPreventiveVisit.ppMTimePicker = time;
},

@ -83,6 +83,7 @@ class RecurrentTaskInfoWidget extends StatelessWidget {
borderRadius: BorderRadius.circular(10),
),
pickerTimer: model?.recurrentWoTimePicker,
pickerFromDate: DateTime.tryParse(model?.scheduleDate ?? ''),
onPick: (time) {
model?.recurrentWoTimePicker = time;
},

@ -283,6 +283,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
AppTimer(
label: context.translation.workingHours,
timer: _formModel.tbsTimer,
pickerFromDate: DateTime.tryParse(widget.model.createdDate??''),
width: double.infinity,
enabled: isTimerEnable,
decoration: BoxDecoration(

@ -286,6 +286,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
AppTimer(
label: context.translation.workingHours,
timer: _formModel.timer,
pickerFromDate: DateTime.tryParse(widget.gasRefillModel?.createdDate??''),
pickerTimer: _formModel.gasRefillTimePicker,
onPick: (time) {
_formModel.gasRefillTimePicker = time;

@ -13,7 +13,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/user.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/views/pages/user/update_profile_info_bottmsheet.dart';
import 'package:test_sa/views/pages/user/update_user_contact_info_bottomsheet.dart';
import '../../../new_views/app_style/app_color.dart';
@ -177,6 +177,12 @@ class _ProfilePageState extends State<ProfilePage> {
label: "Update Information",
buttonColor: AppColor.neutral50,
onPressed: () {
_userProvider.userInfoModel = UserContactInfoModel(
userId: _user.userID,
email: _user.email,
phoneNo: _user.phoneNumber,
extensionNo: _user.extensionNo
);
showModalBottomSheet(
context: context,
isScrollControlled: true,
@ -191,57 +197,16 @@ class _ProfilePageState extends State<ProfilePage> {
),
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: MediaQuery.of(context).size.height * 0.9,
maxHeight: MediaQuery.of(context).size.height * 0.4,
),
child: SingleChildScrollView(
child: UpdateProfileInfoBottmsheet(
userInfoModel: UpdateUserInfoModel(
email: _user.email,
phoneNo: _user.phoneNumber,
extensionNo: _user.extensionNo,
),
),
child: const UpdateUserContactInfoBottomsheet(
),
),
);
},
);
// showModalBottomSheet(
// context: context,
// isScrollControlled: true,
// shape: const RoundedRectangleBorder(
// borderRadius: BorderRadius.vertical(
// top: Radius.circular(20),
// ),
// ),
// clipBehavior: Clip.antiAliasWithSaveLayer,
// builder: (BuildContext context) {
// return Padding(
// padding: EdgeInsets.only(
// bottom: MediaQuery.of(context).viewInsets.bottom,
// ),
// child: DraggableScrollableSheet(
// // initialChildSize: 0.6, // You can adjust this as needed
// minChildSize: 0.3,
// maxChildSize: 0.9,
// expand: false,
// builder: (context, scrollController) {
// return SingleChildScrollView(
// controller: scrollController,
// child: UpdateProfileInfoBottmsheet(
// userInfoModel: UpdateUserInfoModel(
// email: _user.email,
// phoneNo: _user.phoneNumber,
// extensionNo: _user.extensionNo,
// ),
// ),
// );
// },
// ),
// );
// },
// );
},
)
],
@ -404,22 +369,3 @@ class _ProfilePageState extends State<ProfilePage> {
);
}
}
class UpdateUserInfoModel {
dynamic userId;
String? email;
String? phoneNo;
String? extensionNo;
UpdateUserInfoModel({this.email, this.phoneNo, this.extensionNo, this.userId});
Map<String, dynamic> toJson() {
return {
//need this to update user info..
'userId': userId,
'email': email,
'phoneNo': phoneNo,
'extensionNo': extensionNo,
};
}
}

@ -0,0 +1,91 @@
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
class UpdateUserContactInfoBottomsheet extends StatelessWidget {
const UpdateUserContactInfoBottomsheet({super.key});
@override
Widget build(BuildContext context) {
return Consumer<UserProvider>(
builder: (context, userProvider,child) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
AppTextFormField(
labelText: "Email",
backgroundColor: AppColor.neutral100,
initialValue: userProvider.userInfoModel.email,
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false,
onChange: (value) {
userProvider.userInfoModel.email = value;
},
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
AppTextFormField(
labelText: "Phone Number",
backgroundColor: AppColor.neutral100,
initialValue: userProvider.userInfoModel.phoneNo,
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
textInputType: TextInputType.number,
showShadow: false,
onChange: (value) {
userProvider.userInfoModel.phoneNo = value;
},
style: Theme.of(context).textTheme.titleMedium,
),
8.height,
AppTextFormField(
labelText: "Extension No",
backgroundColor: AppColor.neutral100,
initialValue: userProvider.userInfoModel.extensionNo,
textAlign: TextAlign.center,
labelStyle: AppTextStyles.textFieldLabelStyle,
textInputType: TextInputType.text,
showShadow: false,
onChange: (value) {
userProvider.userInfoModel.extensionNo = value;
},
style: Theme.of(context).textTheme.titleMedium,
),
],
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 16.toScreenHeight),
color: AppColor.white10,
child: AppFilledButton(
label: "Update",
buttonColor: AppColor.neutral50,
onPressed: () async {
//TODO update user details and save to preferences..
// await userProvider.updateContactInfo(context: context);
// Navigator.pop(context);
},
),
),
],
);
}
);
}
}

@ -17,6 +17,7 @@ class AppTimer extends StatefulWidget {
final TimerModel? timer;
final Future<bool> Function(TimerModel)? onChange;
final TimerModel? pickerTimer;
final DateTime? pickerFromDate;
final Function(TimerModel?)? onPick;
final TextStyle? style;
final BoxDecoration? decoration;
@ -35,6 +36,7 @@ class AppTimer extends StatefulWidget {
this.decoration,
this.width,
this.pickerTimer,
this.pickerFromDate,
this.onPick,
this.timerProgress,
this.enabled = true,
@ -162,6 +164,7 @@ class _AppTimerState extends State<AppTimer> {
hideShadow: true,
backgroundColor: AppColor.neutral100,
date: _pickerStartAt,
from: widget.pickerFromDate,
enable: _tempPickerTimer == null,
formatDateWithTime: true,
onDatePicker: (selectedDate) {
@ -182,6 +185,7 @@ class _AppTimerState extends State<AppTimer> {
hideShadow: true,
backgroundColor: AppColor.neutral100,
enable: _pickerStartAt != null,
from:_pickerStartAt,
date: _pickerEndAt,
formatDateWithTime: true,
onDatePicker: (selectedDate) {

Loading…
Cancel
Save