Merge branch 'refs/heads/design_3.0_data_segregation' into design_3.0_asset_inventory_module

# Conflicts:
#	lib/controllers/api_routes/urls.dart
#	lib/controllers/providers/api/all_requests_provider.dart
design_3.0_medical_gas
Sikander Saleem 3 months ago
commit 160dc57b86

@ -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";

@ -147,6 +147,23 @@ class UserProvider extends ChangeNotifier {
}
}
Future<bool> 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<bool> logout(BuildContext context) async {
Response response;
try {

@ -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<bool> checkIsEnabledFaceId({required bool status}) async {
try {
final response = await ApiManager.instance.post(
URLs.enableFaceId,
showToast: false,
body: <String, dynamic>{
'isEnabled':status,
'isEnabled': status,
},
);
return response.statusCode >= 200 && response.statusCode < 300;
@ -203,7 +206,6 @@ class SettingProvider extends ChangeNotifier {
}
}
Future<bool> checkAppUpdate(String buildNumber, String osType) async {
Response response;
bool isValid = false;

@ -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));

@ -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<DashBoardProvider>(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<DashBoardProvider>(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<UserProvider>(context, listen: false).user?.assetGroups?.map<DropdownMenuItem<AssetGroup?>>((value) {

@ -73,7 +73,7 @@ class RequestCategoryFragment extends StatelessWidget {
Widget getTabs({required BuildContext context, required DashBoardProvider requestsProvider, required UsersTypes? userType}) {
List<CategoryTabs> 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,

@ -19,7 +19,14 @@ extension BuildContextExtension on BuildContext {
SettingProvider get settingProvider => Provider.of<SettingProvider>(this, listen: false);
UserProvider get userProvider => Provider.of<UserProvider>(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),

@ -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<String, dynamic> 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<String, dynamic> 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,
};
}

@ -10,7 +10,6 @@ class User {
List<int>? departmentId;
List<String>? departmentName;
String? message;
String? username;
String? userID;
String? email;
@ -38,6 +37,7 @@ class User {
bool? lockoutEnabled;
int? accessFailedCount;
List<AssetGroup>? assetGroups;
AssetGroup? selectedAssetGroup;
bool? employeeIsHMG;
bool? enableWifi;
bool? enableNFC;
@ -88,12 +88,13 @@ class User {
Future<Map<String, dynamic>> 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 = <AssetGroup>[];
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;

@ -146,20 +146,20 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
if (Provider.of<SettingProvider>(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,
],

@ -120,16 +120,16 @@ class _PpmDetailsPageState extends State<PpmDetailsPage> {
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());

@ -58,7 +58,7 @@ class _PpmExternalDetailsFormState extends State<PpmExternalDetailsForm> {
final ppmProvider = Provider.of<PpmProvider>(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<ExternalDetailItem> {
),
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;
}

@ -108,7 +108,7 @@ class _UpdatePpmState extends State<UpdatePpm> with TickerProviderStateMixin {
if (typeOfService == null) {
return;
}
if (typeOfService?.id == 66) {
if (typeOfService?.value == 2) {
ppmProvider.totalTabs = 4;
} else {
ppmProvider.totalTabs = 3;

@ -299,7 +299,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
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;

@ -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<TaskRequestDetailsView> {
Widget build(BuildContext context) {
userProvider ??= Provider.of<UserProvider>(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<TaskRequestProvider>(builder: (context, taskProvider, child) {
TaskData? taskModel = taskProvider.taskRequestModel;
@ -122,6 +125,7 @@ class _TaskRequestDetailsViewState extends State<TaskRequestDetailsView> {
],
),
],
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<TaskRequestDetailsView> {
);
}
Widget showWorkingTime(List<TaskJobActivityEngineerTimer> timer) {
if (context.userProvider.user!.type == UsersTypes.normal_user) return const SizedBox();
double totalWorkingHours = timer.fold<double>(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<TaskRequestDetailsView> {
'${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();

@ -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);
}

@ -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<AppTextFormField> {
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<AppTextFormField> {
? (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 ??

@ -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),
],
),
),

@ -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<AllRequestsFilterPage> {
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<AllRequestsFilterPage> {
body: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
@ -194,11 +196,11 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
// 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),
),
);
}

@ -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<AllRequestsSearchPage> {
child: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -124,9 +126,9 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
],
),
).expanded,
AppFilledButton(onPressed: _search, label: context.translation.search),
FooterActionButton.footerContainer(context: context, child: AppFilledButton(onPressed: _search, label: context.translation.search)),
],
).paddingAll(16),
),
),
);
}

@ -49,7 +49,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
//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<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {
requestsList.add(Request(7, 'Recall and Alert'));
}
if (Provider.of<UserProvider>(context, listen: false).user!.type != UsersTypes.normal_user) {

@ -110,8 +110,9 @@ class _LoginPageState extends State<LoginPage> {
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<LoginPage> {
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(

@ -175,7 +175,7 @@ class _ProfilePageState extends State<ProfilePage> {
16.height,
AppFilledButton(
label: "Update Information",
buttonColor: context.isDark? AppColor.primary10:AppColor.neutral50,
buttonColor: context.isDark ? AppColor.primary10 : AppColor.neutral50,
onPressed: () {
context.showBottomSheet(
UpdateUserContactInfoBottomSheet(

@ -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(

@ -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"

Loading…
Cancel
Save