diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index f0b83404..72f82b54 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,7 +1,7 @@ class URLs { URLs._(); - static const String appReleaseBuildNumber = "26"; + static const String appReleaseBuildNumber = "28"; // static const host1 = "https://atomsm.hmg.com"; // production url // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url @@ -9,10 +9,11 @@ class URLs { static const host1 = "http://10.201.111.125:9495"; // temporary Server UAT url // static String _baseUrl = "$_host/mobile"; - // static final String _baseUrl = "$_host/v3/mobile"; // new V3 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 // 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 String _host = host1; @@ -25,6 +26,8 @@ class URLs { // API Routes static get login => "$_baseUrl/MobileAuth/Login"; + static get userChangeAssetGroup => "$_baseUrl/MobileAuth/UserChangeAssetGroup"; + static get getUserInfo => "$_baseUrl/MobileAuth/GetUserInfo"; static get logout => "$_baseUrl/MobileAuth/Logout"; diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 6e6fc577..7a846817 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -147,6 +147,23 @@ class UserProvider extends ChangeNotifier { } } + Future userChangeAssetGroup() async { + Response response; + try { + response = await ApiManager.instance.post(URLs.userChangeAssetGroup, body: {}); + if (response.statusCode >= 200 && response.statusCode < 300) { + User tempUser = await User.fromJson(jsonDecode(response.body)); + tempUser.profilePhotoName = URLs.getFileUrl(tempUser!.profilePhotoName); + ApiManager.instance.user = tempUser; + _user = user; + return true; + } + return false; + } catch (error) { + return false; + } + } + Future logout(BuildContext context) async { Response response; try { diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 2482c5b9..63cd4a28 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -37,7 +37,9 @@ class SettingProvider extends ChangeNotifier { bool get isUserFlowMedical => _assetGroup?.id == 1; bool get isUserFMS => _assetGroup?.id == 2; + bool get engineerCanCreateCM => isUserFMS; + bool get showPriority => !(isUserFMS && user?.type == UsersTypes.normal_user); // Local authentication instance @@ -77,8 +79,10 @@ class SettingProvider extends ChangeNotifier { } void selectAssetGroup(User user) { - if(user.assetGroups ==null) return; - if (user.assetGroups!.length == 1) { + if (user.assetGroups == null) return; + if (user.selectedAssetGroup != null) { + _assetGroup = user.selectedAssetGroup; + } else if (user.assetGroups!.length == 1) { _assetGroup = user.assetGroups!.first; } else { int fmIndex = user.assetGroups!.indexWhere((element) => element.id == 1); @@ -187,14 +191,13 @@ class SettingProvider extends ChangeNotifier { } } - Future checkIsEnabledFaceId({required bool status}) async { try { final response = await ApiManager.instance.post( URLs.enableFaceId, showToast: false, body: { - 'isEnabled':status, + 'isEnabled': status, }, ); return response.statusCode >= 200 && response.statusCode < 300; @@ -203,7 +206,6 @@ class SettingProvider extends ChangeNotifier { } } - Future checkAppUpdate(String buildNumber, String osType) async { Response response; bool isValid = false; diff --git a/lib/dashboard_latest/dashboard_provider.dart b/lib/dashboard_latest/dashboard_provider.dart index 61298f75..a0e8a47f 100644 --- a/lib/dashboard_latest/dashboard_provider.dart +++ b/lib/dashboard_latest/dashboard_provider.dart @@ -113,7 +113,7 @@ class DashBoardProvider extends ChangeNotifier { } Response response; try { - response = await ApiManager.instance.post(url,body: {}); + response = await ApiManager.instance.post(url, body: {}); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { dashboardCount = DashboardCount.fromJson(json.decode(response.body)); diff --git a/lib/dashboard_latest/widgets/app_bar_widget.dart b/lib/dashboard_latest/widgets/app_bar_widget.dart index f65ed034..a716fd58 100644 --- a/lib/dashboard_latest/widgets/app_bar_widget.dart +++ b/lib/dashboard_latest/widgets/app_bar_widget.dart @@ -1,13 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; +import 'package:test_sa/views/widgets/dialogs/confirm_dialog.dart'; import '../../controllers/providers/api/user_provider.dart'; import '../../models/user.dart'; @@ -48,11 +51,11 @@ class AppBarWidget extends StatelessWidget { children: [ Text( snapshot.user?.username ?? "", // Simplified null check - style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600), + style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50, fontWeight: FontWeight.w600, fontSize: context.isTablet() ? 14 : null), ), Text( snapshot.user?.type?.name.toCamelCase ?? "", // Simplified null check - style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20, fontSize: context.isTablet() ? 12 : null), ), ], ), @@ -83,16 +86,29 @@ class AppBarWidget extends StatelessWidget { borderRadius: BorderRadius.circular(8), style: TextStyle(color: Theme.of(context).primaryColor), underline: const SizedBox.shrink(), - onChanged: (newValue) { + onChanged: (newValue) async { if (settingProvider.assetGroup != newValue) { - settingProvider.setAssetGroup(newValue); - WidgetsBinding.instance.addPostFrameCallback((_) { - DashBoardProvider dashBoardProvider = Provider.of(context, listen: false); - dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context); - dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!); - dashBoardProvider.resetRequestDataList(); - dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex].tag); - }); + AssetGroup? tempGroup = ApiManager.instance.assetGroup; + ApiManager.instance.assetGroup = newValue; + + Utils.showLoading(context); + bool isSuccess = await context.userProvider.userChangeAssetGroup(); + Utils.hideLoading(context); + if (isSuccess) { + settingProvider.setAssetGroup(newValue); + WidgetsBinding.instance.addPostFrameCallback((_) { + context.settingProvider.setUser(ApiManager.instance.user!); + context.userProvider.setUser(ApiManager.instance.user!); + DashBoardProvider dashBoardProvider = Provider.of(context, listen: false); + dashBoardProvider.setTabs(userType: settingProvider.user!.type!, context: context); + dashBoardProvider.getDashBoardCount(usersType: settingProvider.user!.type!); + dashBoardProvider.resetRequestDataList(); + dashBoardProvider.getRequestDetail(usersType: settingProvider.user!.type!, status: dashBoardProvider.tabs[dashBoardProvider.currentListIndex].tag); + }); + } else { + ApiManager.instance.assetGroup = tempGroup; + context.showConfirmDialog("Failed, Please Try again"); + } } }, items: Provider.of(context, listen: false).user?.assetGroups?.map>((value) { diff --git a/lib/dashboard_latest/widgets/request_category_fragment.dart b/lib/dashboard_latest/widgets/request_category_fragment.dart index 95af0330..0736fe80 100644 --- a/lib/dashboard_latest/widgets/request_category_fragment.dart +++ b/lib/dashboard_latest/widgets/request_category_fragment.dart @@ -73,7 +73,7 @@ class RequestCategoryFragment extends StatelessWidget { Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) { List tabs = CategoryTabs.getTabs(userType: userType ?? UsersTypes.normal_user, context: context); return SizedBox( - height: 44 + 16, + height: 44 + (context.isTablet() ? 36 : 16), child: ListView.separated( scrollDirection: Axis.horizontal, separatorBuilder: (cxt, index) => 12.width, diff --git a/lib/extensions/context_extension.dart b/lib/extensions/context_extension.dart index 1f36d4ba..85299f73 100644 --- a/lib/extensions/context_extension.dart +++ b/lib/extensions/context_extension.dart @@ -19,7 +19,14 @@ extension BuildContextExtension on BuildContext { SettingProvider get settingProvider => Provider.of(this, listen: false); UserProvider get userProvider => Provider.of(this, listen: false); - + bool isTablet() { + final mediaQueryData = MediaQuery.of(this); + final double screenWidth = mediaQueryData.size.width; + final double screenHeight = mediaQueryData.size.height; + final double devicePixelRatio = mediaQueryData.devicePixelRatio; + bool isTablet = (devicePixelRatio < 2 && (screenWidth >= 700 || screenHeight >= 700)) || (devicePixelRatio >= 2 && (screenWidth >= 1000 || screenHeight >= 1000)); + return isTablet; + } void showConfirmDialog(String message, {String? title, VoidCallback? onTap}) => showDialog( context: this, builder: (BuildContext cxt) => ConfirmDialog(message: message, onTap: onTap, title: title), diff --git a/lib/models/new_models/task_request/task_request_model.dart b/lib/models/new_models/task_request/task_request_model.dart index 3dc5e315..d1b6dc1a 100644 --- a/lib/models/new_models/task_request/task_request_model.dart +++ b/lib/models/new_models/task_request/task_request_model.dart @@ -928,6 +928,8 @@ class TaskAsset { String? roomName; String? supplierName; String? assetTypeName; + String? poNumber; + String? installationDate; TaskAsset(); @@ -946,24 +948,26 @@ class TaskAsset { roomName = json['roomName']; supplierName = json['supplierName']; assetTypeName = json['assetTypeName']; + poNumber = json['poNumber']; + installationDate = json['installationDate']; } - Map toJson() { - return { - 'id': id, - 'assetNumber': assetNumber, - 'serialNo': serialNo, - 'assetName': assetName, - 'model': model, - 'manufacturer': manufacturer, - 'siteName': siteName, - 'siteId': siteId, - 'buildingName': buildingName, - 'floorName': floorName, - 'departmentName': departmentName, - 'roomName': roomName, - 'supplierName': supplierName, - 'assetTypeName': assetTypeName, - }; - } + Map toJson() => { + 'id': id, + 'assetNumber': assetNumber, + 'serialNo': serialNo, + 'assetName': assetName, + 'model': model, + 'manufacturer': manufacturer, + 'siteName': siteName, + 'siteId': siteId, + 'buildingName': buildingName, + 'floorName': floorName, + 'departmentName': departmentName, + 'roomName': roomName, + 'supplierName': supplierName, + 'assetTypeName': assetTypeName, + 'poNumber': poNumber, + 'installationDate': installationDate, + }; } diff --git a/lib/models/user.dart b/lib/models/user.dart index a1ed40b0..e8bb7044 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -10,7 +10,6 @@ class User { List? departmentId; List? departmentName; String? message; - String? username; String? userID; String? email; @@ -38,6 +37,7 @@ class User { bool? lockoutEnabled; int? accessFailedCount; List? assetGroups; + AssetGroup? selectedAssetGroup; bool? employeeIsHMG; bool? enableWifi; bool? enableNFC; @@ -88,12 +88,13 @@ class User { Future> toLoginJson() async { String notificationType = (Platform.isAndroid && !(await FirebaseNotificationManger.isGoogleServicesAvailable())) ? "HMC" : "FCM"; - if(FirebaseNotificationManger.token==null){ + if (FirebaseNotificationManger.token == null) { //calling this agin to check for token as sometimes token is null fresh install.. await FirebaseNotificationManger.getToken(); } return {"username": userName, "password": password, "fireBaseToken": FirebaseNotificationManger?.token ?? "", "notificationType": notificationType}; } + UsersTypes? get type { switch (userRoles?.first.value) { case "R-6": @@ -149,6 +150,7 @@ class User { map['assetGroups'] = assetGroups!.map((v) => v.toJson()).toList(); } map['tokenlife'] = tokenlife; + map['selectedAssetGroup'] = selectedAssetGroup?.toJson(); map['isAuthenticated'] = isAuthenticated; map['hasError'] = hasError; map['profilePhotoName'] = profilePhotoName; @@ -208,7 +210,7 @@ class User { userRoles!.add(UserRoles.fromJson(v)); }); } - + selectedAssetGroup = json['selectedAssetGroup'] != null ? AssetGroup.fromJson(json['selectedAssetGroup']) : null; if (json['assetGroups'] != null) { assetGroups = []; json['assetGroups'].forEach((v) { @@ -309,9 +311,7 @@ class AssetGroup { } @override - bool operator ==(Object other) => - identical(this, other) || - other is AssetGroup && runtimeType == other.runtimeType && id == other.id; + bool operator ==(Object other) => identical(this, other) || other is AssetGroup && runtimeType == other.runtimeType && id == other.id; @override int get hashCode => id.hashCode; diff --git a/lib/modules/cm_module/views/components/service_request_detail_view.dart b/lib/modules/cm_module/views/components/service_request_detail_view.dart index cb63de73..992c0060 100644 --- a/lib/modules/cm_module/views/components/service_request_detail_view.dart +++ b/lib/modules/cm_module/views/components/service_request_detail_view.dart @@ -146,20 +146,20 @@ class _ServiceRequestDetailViewState extends State { if (Provider.of(context, listen: false).showPriority) ...[ StatusLabel( label: workOrder.priority?.name, - id: workOrder.priority!.id!, + id: workOrder.priority!.value!, radius: 4, - textColor: AppColor.getPriorityStatusTextColor(context, workOrder.priority!.id!), - backgroundColor: AppColor.getPriorityStatusColor(context, workOrder.priority!.id!), + textColor: AppColor.getPriorityStatusTextColor(context, workOrder.priority!.value!), + backgroundColor: AppColor.getPriorityStatusColor(context, workOrder.priority!.value!), ), 8.width, ], if (workOrder.itgFormWorkOrderStatus != null) ...[ StatusLabel( label: workOrder.itgFormWorkOrderStatus, - id: 0, + // id: 0, radius: 4, textColor: AppColor.getPriorityStatusTextColor(context, 82), - backgroundColor: AppColor.getPriorityStatusColor(context, 0), + backgroundColor: AppColor.getPriorityStatusColor(context, 1000), ), 8.width, ], diff --git a/lib/modules/pm_module/ppm_wo/ppm_details_page.dart b/lib/modules/pm_module/ppm_wo/ppm_details_page.dart index 0ac5b3ae..85b1d569 100644 --- a/lib/modules/pm_module/ppm_wo/ppm_details_page.dart +++ b/lib/modules/pm_module/ppm_wo/ppm_details_page.dart @@ -120,16 +120,16 @@ class _PpmDetailsPageState extends State { context: context, ) ] else ...[ - FooterActionButton.footerContainer( - context: context, - child: AppFilledButton( - onPressed: () async { - await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdatePpm(ppm: null, planPreventiveVisit: planPreventiveVisit))); - getVisitData(); - }, - label: context.translation.viewDetails, - ), - ) + // FooterActionButton.footerContainer( + // context: context, + // child: AppFilledButton( + // onPressed: () async { + // await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdatePpm(ppm: null, planPreventiveVisit: planPreventiveVisit))); + // getVisitData(); + // }, + // label: context.translation.viewDetails, + // ), + // ) ] ]) : const Center(child: NoDataFound()); diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart index 8b1be526..ad48a65f 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/ppm_external_details_form.dart @@ -58,7 +58,7 @@ class _PpmExternalDetailsFormState extends State { final ppmProvider = Provider.of(context, listen: false); return ListView.builder( itemCount: widget.models!.length + 1, - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.only(left: 16, right: 16, top: 8, bottom: 16), itemBuilder: (context, index) { if (index == widget.models!.length) { return Visibility( @@ -190,7 +190,7 @@ class _ExternalDetailItemState extends State { ), child: Icon(Icons.add, color: context.isDark ? null : AppColor.neutral60), ).onPress(() async { - if(widget.model.supplier==null) { + if (widget.model.supplier == null) { "Please select supplier".showToast; return; } diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart b/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart index e4bd68ba..4441a434 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart @@ -108,7 +108,7 @@ class _UpdatePpmState extends State with TickerProviderStateMixin { if (typeOfService == null) { return; } - if (typeOfService?.id == 66) { + if (typeOfService?.value == 2) { ppmProvider.totalTabs = 4; } else { ppmProvider.totalTabs = 3; diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart index 3cef0f21..489ea245 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart @@ -299,7 +299,7 @@ class _WoInfoFormState extends State { onSelect: (value) { if (value != null) { widget.planPreventiveVisit.typeOfService = value; - if (widget.planPreventiveVisit.typeOfService?.id == 66) { + if (widget.planPreventiveVisit.typeOfService?.value == 2) { ppmProvider.totalTabs = 4; } else { ppmProvider.totalTabs = 3; diff --git a/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart b/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart index 5e9ff9d6..612992e7 100644 --- a/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart +++ b/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart @@ -1,3 +1,4 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; @@ -8,12 +9,15 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/models/new_models/task_request/task_request_model.dart'; +import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; +import 'package:test_sa/new_views/common_widgets/working_time_tile.dart'; import 'package:test_sa/providers/task_request_provider/task_request_provider.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; +import 'package:test_sa/views/widgets/total_working_time_detail_bottomsheet.dart'; import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../models/enums/user_types.dart'; @@ -61,7 +65,6 @@ class _TaskRequestDetailsViewState extends State { Widget build(BuildContext context) { userProvider ??= Provider.of(context, listen: false); return Scaffold( - // appBar: DefaultAppBar(title:taskProvider?.taskRequestModel?.taskType?.id==7?'Recall and Alert Details': context.translation.taskRequest), appBar: DefaultAppBar(title: context.translation.taskRequest), body: Consumer(builder: (context, taskProvider, child) { TaskData? taskModel = taskProvider.taskRequestModel; @@ -122,6 +125,7 @@ class _TaskRequestDetailsViewState extends State { ], ), ], + showWorkingTime(taskModel?.taskJobActivityEngineerTimers ?? []), if ((taskProvider.taskRequestModel?.taskJobContactPersons ?? []).isNotEmpty) ...[contactInfoCard(context, taskProvider.taskRequestModel!)], if (taskProvider.taskRequestModel?.callComment != null) ...[ const Divider().defaultStyle(context), @@ -167,6 +171,55 @@ class _TaskRequestDetailsViewState extends State { ); } + Widget showWorkingTime(List timer) { + if (context.userProvider.user!.type == UsersTypes.normal_user) return const SizedBox(); + + double totalWorkingHours = timer.fold(0.0, (sum, item) { + if (item.startDate == null || item.endDate == null) return sum; + try { + final start = DateTime.parse(item.startDate!); + final end = DateTime.parse(item.endDate!); + + final diffInHours = end.difference(start).inSeconds / 3600.0; // convert to hours + + return sum + diffInHours; + } catch (_) { + return sum; + } + }); + String totalHourString = (totalWorkingHours > 0.0) ? ServiceRequestUtils.formatTotalWorkingHours(totalWorkingHours) : totalWorkingHours.toString(); + + return RichText( + text: TextSpan( + text: "${context.translation.totalWorkingTime}: ", + style: TextStyle( + fontSize: 14.toScreenWidth, fontWeight: FontWeight.w500, fontStyle: FontStyle.normal, decoration: TextDecoration.none, color: context.isDark ? AppColor.neutral10 : AppColor.neutral20), + children: [ + TextSpan(text: "$totalHourString ", style: AppTextStyles.bodyText), + const WidgetSpan( + child: Icon(Icons.info_outline_rounded, color: AppColor.primary10, size: 14), + ), + ], + ), + ).onPress(() => showModalBottomSheet( + context: context, + isDismissible: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + clipBehavior: Clip.antiAliasWithSaveLayer, + builder: (BuildContext context) => TotalWorkingTimeDetailBottomSheet( + timerList: timer.map((e) { + return TimerHistoryModel( + id: e.id, + startTime: e.startDate, + endTime: e.endDate, + workingHours: e.totalWorkingHour, + ); + }).toList()), + )); + } + Widget contactInfoCard(BuildContext context, TaskData? taskModel) { return Column( mainAxisSize: MainAxisSize.min, @@ -270,6 +323,16 @@ class _TaskRequestDetailsViewState extends State { '${context.translation.assetNo}: ${taskModel.asset?.assetNumber ?? "-"}'.bodyText(context), '${context.translation.manufacture}: ${taskModel.asset?.manufacturer ?? "-"}'.bodyText(context), '${context.translation.model}: ${taskModel.asset?.model ?? "-"}'.bodyText(context), + '${context.translation.serialNo}: ${taskModel.asset?.serialNo ?? "-"}'.bodyText(context), + '${context.translation.assetType}: ${taskModel.asset?.assetTypeName ?? "-"}'.bodyText(context), + '${context.translation.site}: ${taskModel.asset?.siteName ?? "-"}'.bodyText(context), + '${context.translation.building}: ${taskModel.asset?.buildingName ?? "-"}'.bodyText(context), + '${context.translation.floor}: ${taskModel.asset?.floorName ?? "-"}'.bodyText(context), + '${context.translation.department}: ${taskModel.asset?.departmentName ?? "-"}'.bodyText(context), + '${context.translation.room}: ${taskModel.asset?.roomName ?? "-"}'.bodyText(context), + '${context.translation.supplier}: ${taskModel.asset?.supplierName ?? "-"}'.bodyText(context), + 'PO Number: ${taskModel.asset?.poNumber ?? "-"}'.bodyText(context), + '${context.translation.installationDate}: ${taskModel.asset?.installationDate?.toAssetDetailsFormat ?? "-"}'.bodyText(context), ], ) : const SizedBox(); diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 7b7df7d4..f8c42ce9 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -264,6 +264,11 @@ class AppColor { return green15; case 370: return green15; + case 0: + return green15; + case 1: + //high priority + return white10; case 82: //high priority return white10; @@ -279,9 +284,13 @@ class AppColor { return greenStatus(context); case 370: return greenStatus(context); + case 0: + return greenStatus(context); //high priority case 82: return redStatus(context); + case 1: + return redStatus(context); default: return blueStatus(context); } diff --git a/lib/new_views/common_widgets/app_text_form_field.dart b/lib/new_views/common_widgets/app_text_form_field.dart index 2434230c..02cb825b 100644 --- a/lib/new_views/common_widgets/app_text_form_field.dart +++ b/lib/new_views/common_widgets/app_text_form_field.dart @@ -25,6 +25,7 @@ class AppTextFormField extends StatefulWidget { final TextStyle? style; final TextStyle? labelStyle; final TextStyle? hintStyle; + final TextStyle? floatingLabelStyle; final bool enable; final TextAlign? textAlign; final FocusNode? node; @@ -58,6 +59,7 @@ class AppTextFormField extends StatefulWidget { this.hintText, this.labelText, this.hintStyle, + this.floatingLabelStyle, this.textInputType = TextInputType.text, this.initialValue, // Provide default value this.enable = true, @@ -183,12 +185,16 @@ class _AppTextFormFieldState extends State { onChanged: widget.onChange, obscureText: widget.obscureText ?? false, keyboardType: widget.textInputType, - maxLines: widget.makeMultiLinesNull ? null:widget.textInputType == TextInputType.multiline ? 4 : 1, + maxLines: widget.makeMultiLinesNull + ? null + : widget.textInputType == TextInputType.multiline + ? 4 + : 1, obscuringCharacter: "*", controller: widget.controller, textInputAction: widget.textInputType == TextInputType.multiline ? null : widget.textInputAction ?? TextInputAction.next, onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(), - style: widget.style ?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500,color:context.isDark?AppColor.white10: AppColor.black10), + style: widget.style ?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.white10 : AppColor.black10), onTap: widget.onTap, decoration: InputDecoration( alignLabelWithHint: widget.alignLabelWithHint, @@ -208,9 +214,12 @@ class _AppTextFormFieldState extends State { ? (widget.enableColor ?? AppColor.neutral40) : AppColor.background(context)), errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), - floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.white10 : AppColor.neutral20), + floatingLabelStyle: widget.floatingLabelStyle ?? AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? AppColor.white10 : AppColor.neutral20), hintText: widget.hintText ?? "", - labelText: (widget.showSpeechToText && _speechToText.isListening) ? "Listening..." : widget.labelText ?? "", + // labelText: (widget.showSpeechToText && _speechToText.isListening) ? "Listening..." : widget.labelText ?? "", + label: Text( + (widget.showSpeechToText && _speechToText.isListening) ? "Listening..." : widget.labelText ?? "", + ), labelStyle: widget.labelStyle, hintStyle: widget.labelStyle, prefixIcon: widget.prefixIcon ?? diff --git a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart index edd2ba89..20478b13 100644 --- a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart +++ b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart @@ -72,7 +72,7 @@ class CreateRequestTypeBottomSheet extends StatelessWidget { size: 32, ), //24.height, - label.bodyText2(context).custom(color: context.isDark ? Colors.white : AppColor.black20), + label.bodyText2(context).custom(color: context.isDark ? Colors.white : AppColor.black20, fontSize: context.isTablet() ? 10.toScreenWidth : null), ], ), ), diff --git a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart index 5a5231b8..e8cfd8f9 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/search_all_requests_model.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.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/default_app_bar.dart'; @@ -72,7 +73,7 @@ class _AllRequestsFilterPageState extends State { types[context.translation.recurrentWo] = 5; } - if (context.settingProvider.isUserFlowMedical) { + if (context.settingProvider.isUserFlowMedical && isEngineer) { types['Recall and Alert'] = 7; } final statuses = { @@ -111,6 +112,7 @@ class _AllRequestsFilterPageState extends State { body: Column( children: [ SingleChildScrollView( + padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -194,11 +196,11 @@ class _AllRequestsFilterPageState extends State { // setState(() {}); // }), ], - ).paddingOnly(start: 16, end: 16), + ), ).expanded, - AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16), + FooterActionButton.footerContainer(context: context, child: AppFilledButton(onPressed: _search, label: context.translation.applyFilter)) ], - ).paddingOnly(top: 16, bottom: 16), + ), ); } diff --git a/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart index 35b5210b..bde4ba6f 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart @@ -7,6 +7,7 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.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'; @@ -90,6 +91,7 @@ class _AllRequestsSearchPageState extends State { child: Column( children: [ SingleChildScrollView( + padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -124,9 +126,9 @@ class _AllRequestsSearchPageState extends State { ], ), ).expanded, - AppFilledButton(onPressed: _search, label: context.translation.search), + FooterActionButton.footerContainer(context: context, child: AppFilledButton(onPressed: _search, label: context.translation.search)), ], - ).paddingAll(16), + ), ), ); } diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index 821567ac..25245710 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -49,7 +49,7 @@ class _MyRequestsPageState extends State { //TODO unCommit this to enable task requestsList.add(Request(6, context.translation.taskRequest)); //after confirm name add this to translation... - if (context.settingProvider.isUserFlowMedical) { + if (context.settingProvider.isUserFlowMedical && Provider.of(context, listen: false).user!.type != UsersTypes.normal_user) { requestsList.add(Request(7, 'Recall and Alert')); } if (Provider.of(context, listen: false).user!.type != UsersTypes.normal_user) { diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 35eb9134..8c54e927 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -110,8 +110,9 @@ class _LoginPageState extends State { backgroundColor: AppColor.fieldBgColor(context), validator: (value) => Validator.hasValue(value!) ? null : context.translation.requiredField, labelText: context.translation.username, - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), - labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 11, color: context.isDark ? Colors.white : const Color(0xff767676)), + style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), + floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), + labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff767676)), textInputType: TextInputType.text, showWithoutDecoration: true, contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight), @@ -125,8 +126,9 @@ class _LoginPageState extends State { showWithoutDecoration: true, labelText: context.translation.password, backgroundColor: AppColor.fieldBgColor(context), - style: TextStyle(fontWeight: FontWeight.w500, fontSize: 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), - labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 11, color: context.isDark ? Colors.white : const Color(0xff767676)), + style: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), + labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff767676)), + floatingLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: context.isTablet() ? 16 : 12, color: context.isDark ? Colors.white : const Color(0xff3B3D4A)), contentPadding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 12.toScreenHeight), obscureText: !_passwordVisible, suffixIcon: Icon( diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 22082ca1..9af6bb61 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -175,7 +175,7 @@ class _ProfilePageState extends State { 16.height, AppFilledButton( label: "Update Information", - buttonColor: context.isDark? AppColor.primary10:AppColor.neutral50, + buttonColor: context.isDark ? AppColor.primary10 : AppColor.neutral50, onPressed: () { context.showBottomSheet( UpdateUserContactInfoBottomSheet( diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index b304eb51..272ddf42 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -11,23 +11,23 @@ class StatusLabel extends StatelessWidget { final double radius; final bool labelInCenter; - StatusLabel({Key? key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false, this.radius = 4,this.labelInCenter=false}) : super(key: key); + StatusLabel({Key? key, this.id = 0, this.label, this.backgroundColor, this.textColor, this.isPriority = false, this.radius = 4, this.labelInCenter = false}) : super(key: key); @override Widget build(BuildContext context) { - if (id == 82) label = context.translation.highPriority; - if (id == 81) label = context.translation.lowPriority; if (label?.toLowerCase() == 'In progress'.toLowerCase()) label = context.translation.inProgress; if (label?.toLowerCase() == 'Completed'.toLowerCase()) label = context.translation.completed; if (label?.toLowerCase() == 'Open'.toLowerCase()) label = context.translation.open; if (label?.toLowerCase() == 'Closed'.toLowerCase()) label = context.translation.closed; if (label?.toLowerCase() == 'Low'.toLowerCase()) label = context.translation.lowPriority; + if (label?.toLowerCase() == 'No'.toLowerCase()) label = context.translation.lowPriority; if (label?.toLowerCase() == 'High'.toLowerCase()) label = context.translation.highPriority; + if (label?.toLowerCase() == 'Yes'.toLowerCase()) label = context.translation.highPriority; if (label?.toLowerCase() == 'Waiting for quotation'.toLowerCase()) label = context.translation.waitingForQuotation; return Container( padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 10), - alignment: labelInCenter ? Alignment.center: null, + alignment: labelInCenter ? Alignment.center : null, decoration: ShapeDecoration( color: backgroundColor, shape: RoundedRectangleBorder( diff --git a/pubspec.yaml b/pubspec.yaml index a7cf4381..70641f4d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.3.10+29 +version: 1.3.11+30 environment: sdk: ">=3.5.0 <4.0.0"