From 144951caecb1770d2eeed3c4777967b2a153cf5e Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 16 Oct 2025 17:01:05 +0300 Subject: [PATCH] traf request creation completed. --- lib/controllers/api_routes/urls.dart | 3 +- .../providers/api/all_requests_provider.dart | 25 +++- .../providers/api/search_user_provider.dart | 64 +++++++++ lib/main.dart | 2 + .../users_based_on_search_model.dart | 44 ++++++ .../traf_module/create_traf_request_page.dart | 120 ++++++++++------ .../traf_module/traf_request_detail_page.dart | 21 ++- .../traf_module/traf_request_model.dart | 16 ++- .../traf_module/update_traf_request_page.dart | 2 +- .../users_auto_complete_field.dart | 134 ++++++++++++++++++ .../create_request-type_bottomsheet.dart | 2 +- .../my_request/all_requests_filter_page.dart | 4 + .../my_request/my_requests_page.dart | 3 + 13 files changed, 384 insertions(+), 56 deletions(-) create mode 100644 lib/controllers/providers/api/search_user_provider.dart create mode 100644 lib/models/new_models/users_based_on_search_model.dart create mode 100644 lib/modules/traf_module/users_auto_complete_field.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 6627c7c3..7fc41288 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -258,7 +258,7 @@ class URLs { //Traf static get addTRAF => "$_baseUrl/TRAF/AddTRAF"; // get static get getTRAFById => "$_baseUrl/TRAF/GetTRAFById"; // get - static get getAssetNDAutoCompleteByDynamicCodes => "$_baseUrl/AssetNameDefinition/GetAssetNDAutoCompleteByDynamicCodes"; // get + static get getAssetNDAutoCompleteByDynamicCodes => "$_baseUrl/AssetNameDefinition/GetAssetNDAutoCompleteByDynamicCodes"; // get// get //gas refill static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get @@ -294,6 +294,7 @@ class URLs { static get getTaskEvaluatorUser => "$_baseUrl/Account/GetUserByRoleValue?value=R-2"; // get static get getNurses => "$_baseUrl/Account/GetUserByRoleValue?value=R-7"; // get static get getNursesBySiteId => "$_baseUrl/Account/GetUserByRoleValueSiteAndAssetGroupBySiteId?value=R-7"; // get + static get getUsersBasedOnSearch => "$_baseUrl/Account/GetUsersBasedOnSearch"; // get // pentry static get getPentry => "$_baseUrl/return/pentry/details"; // get diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 54fd7776..722dafbc 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -4,6 +4,7 @@ import 'package:flutter/widgets.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/all_requests_and_count_model.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/ppm/recurrent_wo.dart'; @@ -130,6 +131,28 @@ class AllRequestsProvider extends ChangeNotifier { SearchAllRequestsModel? searchedModel; + List getStatues(BuildContext context) { + List list = [1, 2, 3, 4]; + + if (context.userProvider.user!.type != UsersTypes.normal_user) { + list.add(5); + } + list.add(6); // task module + + if (context.settingProvider.isUserFlowMedical && context.userProvider.user!.type != UsersTypes.normal_user) { + list.add(7); // task mod + } + if (context.userProvider.user!.type != UsersTypes.normal_user) { + list.add(8); // + } + + if (context.userProvider.user!.type == UsersTypes.normal_user) { + list.add(9); // + } + + return list; + } + Future getAllRequests(BuildContext context, {int? typeTransaction, SearchAllRequestsModel? search}) async { if (isAllLoading == true) return -2; isAllLoading = true; @@ -143,7 +166,7 @@ class AllRequestsProvider extends ChangeNotifier { } final type = typeTransaction == null ? search?.typeTransaction == null || (search?.typeTransaction?.isEmpty ?? false) - ? [1, 2, 3, 4, 5, 6,7] + ? [1, 2, 3, 4, 5, 6, 7] : search!.typeTransaction : [typeTransaction]; List status = (search?.statuses == null || (search?.statuses?.isEmpty ?? false)) ? (((search?.isArchived ?? false) ? [3] : [1, 2, 4])) : search!.statuses!; diff --git a/lib/controllers/providers/api/search_user_provider.dart b/lib/controllers/providers/api/search_user_provider.dart new file mode 100644 index 00000000..2804e8a6 --- /dev/null +++ b/lib/controllers/providers/api/search_user_provider.dart @@ -0,0 +1,64 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.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/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/models/new_models/users_based_on_search_model.dart'; +import 'package:test_sa/models/service_request/spare_parts.dart'; + +class UserSearchProvider extends ChangeNotifier { + // number of items call in each request + final pageItemNumber = 20; + + //reset provider data + void reset() { + _parts = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int? _stateCode; + + int? get stateCode => _stateCode; + + // true if there is next pagein product list and false if not + bool _nextPage = true; + + bool get nextPage => _nextPage; + + // contain user data + // when user not login or register _user = null + List? _parts; + + List? get parts => _parts; + + bool _loading = false; + + bool get isLoading => _loading; + + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + Future> getUsersBasedOnSearch(String query) async { + late Response response; + try { + response = await ApiManager.instance.get(URLs.getUsersBasedOnSearch + "?searchText=$query"); + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body); + page = categoriesListJson.map((part) => UsersBasedOnSearchModel.fromJson(part)).toList(); + } + return page; + } catch (error) { + return []; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index f2f5a281..70880a3b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,6 +19,7 @@ import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/oracle_code_provider.dart'; import 'package:test_sa/controllers/providers/api/parts_provider.dart'; import 'package:test_sa/controllers/providers/api/ppm_provider.dart'; +import 'package:test_sa/controllers/providers/api/search_user_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/employee/nurse_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; @@ -211,6 +212,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => TrafRequestProvider()), ChangeNotifierProvider(create: (_) => DepartmentLookupProvider()), + ChangeNotifierProvider(create: (_) => UserSearchProvider()), ///todo deleted //ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), diff --git a/lib/models/new_models/users_based_on_search_model.dart b/lib/models/new_models/users_based_on_search_model.dart new file mode 100644 index 00000000..54480f91 --- /dev/null +++ b/lib/models/new_models/users_based_on_search_model.dart @@ -0,0 +1,44 @@ +class UsersBasedOnSearchModel { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + String? extensionNo; + String? phoneNumber; + bool? isActive; + + UsersBasedOnSearchModel( + {this.userId, + this.userName, + this.email, + this.employeeId, + this.languageId, + this.extensionNo, + this.phoneNumber, + this.isActive}); + + UsersBasedOnSearchModel.fromJson(Map json) { + userId = json['userId']; + userName = json['userName']; + email = json['email']; + employeeId = json['employeeId']; + languageId = json['languageId']; + extensionNo = json['extensionNo']; + phoneNumber = json['phoneNumber']; + isActive = json['isActive']; + } + + Map toJson() { + final Map data = new Map(); + data['userId'] = this.userId; + data['userName'] = this.userName; + data['email'] = this.email; + data['employeeId'] = this.employeeId; + data['languageId'] = this.languageId; + data['extensionNo'] = this.extensionNo; + data['phoneNumber'] = this.phoneNumber; + data['isActive'] = this.isActive; + return data; + } +} diff --git a/lib/modules/traf_module/create_traf_request_page.dart b/lib/modules/traf_module/create_traf_request_page.dart index 012e7ab7..8cac2b05 100644 --- a/lib/modules/traf_module/create_traf_request_page.dart +++ b/lib/modules/traf_module/create_traf_request_page.dart @@ -9,10 +9,12 @@ import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/traf_department.dart'; +import 'package:test_sa/models/new_models/users_based_on_search_model.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/traf_module/asset_auto_complete_field.dart'; import 'package:test_sa/modules/traf_module/traf_request_detail_page.dart'; import 'package:test_sa/modules/traf_module/update_traf_request_page.dart'; +import 'package:test_sa/modules/traf_module/users_auto_complete_field.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'; @@ -43,7 +45,6 @@ class _CreateTRAFRequestPageState extends State { final GlobalKey _formKey = GlobalKey(); bool _acknowledgement = false; - Asset? asset; Lookup? requestType; @@ -54,18 +55,24 @@ class _CreateTRAFRequestPageState extends State { TrafRequestDataModel? trafRequest; List abc = []; + List departments = []; + List userBasedOnSearch = []; + + FocusNode otherServicesEffectsNode = FocusNode(); + FocusNode useInCombinationNode = FocusNode(); + FocusNode departmentNode = FocusNode(); @override void initState() { super.initState(); - trafRequest = TrafRequestDataModel(id: 0); + trafRequest = TrafRequestDataModel(id: 0, attachments: [], departments: [], qty: 1); resetProviders(); } void resetProviders() { Provider.of(context, listen: false).reset(); - Provider.of(context, listen: false).reset(); + // Provider.of(context, listen: false).reset(); } @override @@ -107,7 +114,7 @@ class _CreateTRAFRequestPageState extends State { trafRequest?.requestTypeId = value?.id; if (requestType?.value == 1) { trafRequest?.assetId = null; - trafRequest?.qty = null; + // trafRequest?.qty = 0; } else if (requestType?.value == 2) { trafRequest?.assetNDId = null; } @@ -138,7 +145,7 @@ class _CreateTRAFRequestPageState extends State { onPick: (asset) async { this.asset = asset; trafRequest?.assetId = asset.id?.toInt(); - trafRequest?.qty = 1; + // trafRequest?.qty = 1; setState(() {}); // pendingAssetServiceRequest = null; // _serviceRequest.device = asset; @@ -232,19 +239,42 @@ class _CreateTRAFRequestPageState extends State { }, ), 12.height, - SingleItemDropDownMenu( - context: context, - showAsBottomSheet: true, - backgroundColor: AppColor.neutral100, - showShadow: false, - height: 80, - title: "List down names & contact information of users going to use the technology & specify if they are part-time or full time?", - initialValue: isUsedSolelyOrShared, - onSelect: (value) { - // isUsedSolelyOrShared = value; + SearchUserAutoCompleteField( + clearAfterPick: true, + byName: true, + initialValue: "", + onPick: (user) { + userBasedOnSearch.add(user); + FocusScope.of(context).unfocus(); + // model.partCatalogItem = PartCatalogItem(id: part.sparePart?.id, partNumber: part.sparePart?.partNo, partName: part.sparePart?.partName, oracleCode: part.sparePart?.oracleCode); setState(() {}); }, ), + if (userBasedOnSearch.isNotEmpty) ...[ + // 12.height, + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.only(left: 12, right: 12), + itemBuilder: (cxt, index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + dense: true, + contentPadding: EdgeInsets.zero, + title: Text("Name: ${userBasedOnSearch[index].userName ?? ""}"), + subtitle: Text("Email: ${userBasedOnSearch[index].email ?? ""}\nPhone: ${userBasedOnSearch[index].phoneNumber ?? ""}"), + trailing: const Icon(Icons.delete_rounded, color: Color(0xffF63939), size: 20).onPress(() { + userBasedOnSearch.removeAt(index); + setState(() {}); + }), + ), + ], + ), + separatorBuilder: (cxt, index) => Divider(thickness: 1, height: 1, color: context.isDark ? AppColor.neutral20 : AppColor.neutral30), + itemCount: userBasedOnSearch.length) + ], 12.height, SingleItemDropDownMenu( context: context, @@ -259,34 +289,33 @@ class _CreateTRAFRequestPageState extends State { trafRequest?.usingSolelyOrSharedId = value?.value; if (isUsedSolelyOrShared?.value != 1) { departments = []; - trafRequest?.departments = []; + trafRequest?.trafDepartments = []; Provider.of(context, listen: false).reset(); + FocusScope.of(context).unfocus(); + } else { + departmentNode.requestFocus(); } setState(() {}); }, ), if (isUsedSolelyOrShared?.value == 1) ...[ 12.height, - MultipleItemDropDownMenu( - context: context, - showAsBottomSheet: true, - backgroundColor: AppColor.neutral100, - showShadow: false, - showCancel: true, - requestById: context.userProvider.user?.clientId, - title: "Please specify departments and relations", - initialValue: departments, - onSelect: (value) { - departments = value ?? []; - trafRequest?.departments = departments - .map((element) => Departments( - id: element.id!.toInt(), - trafId: element.id!.toInt(), - departmentId: element.id!.toInt(), - )) - .toList(); - // setState(() {}); - }, + Focus( + focusNode: departmentNode, + child: MultipleItemDropDownMenu( + context: context, + showAsBottomSheet: true, + backgroundColor: AppColor.neutral100, + showShadow: false, + showCancel: true, + requestById: context.userProvider.user?.clientId, + title: "Please specify departments and relations", + initialValue: departments, + onSelect: (value) { + departments = value ?? []; + trafRequest?.trafDepartments = departments.map((element) => Departments(id: 0, trafId: 0, departmentId: element.id!.toInt())).toList(); + }, + ), ), ], 12.height, @@ -303,8 +332,10 @@ class _CreateTRAFRequestPageState extends State { trafRequest?.isEffectedId = value?.value; if (otherServicesEffects?.value != 1) { trafRequest?.effectedServices = null; + FocusScope.of(context).unfocus(); + } else { + otherServicesEffectsNode.requestFocus(); } - setState(() {}); }, ), @@ -315,6 +346,7 @@ class _CreateTRAFRequestPageState extends State { // makeMultiLinesNull: true, textInputType: TextInputType.multiline, alignLabelWithHint: true, + node: otherServicesEffectsNode, labelText: "List down these services and stat how would it be effected", backgroundColor: AppColor.fieldBgColor(context), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), @@ -338,6 +370,9 @@ class _CreateTRAFRequestPageState extends State { trafRequest?.isCombinationId = value?.value; if (useInCombination?.value != 1) { trafRequest?.usedWithCombination = null; + FocusScope.of(context).unfocus(); + } else { + useInCombinationNode.requestFocus(); } setState(() {}); }, @@ -348,6 +383,7 @@ class _CreateTRAFRequestPageState extends State { initialValue: "", textInputType: TextInputType.multiline, alignLabelWithHint: true, + node: useInCombinationNode, labelText: "kindly describe in detail", backgroundColor: AppColor.fieldBgColor(context), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), @@ -396,9 +432,13 @@ class _CreateTRAFRequestPageState extends State { void _verifyAndSubmit() async { trafRequest?.employeeId = context.userProvider.user?.userID; trafRequest?.siteId = context.userProvider.user?.clientId; - // Utils.showLoading(context); - // await Provider.of(context, listen: false).addTraf(trafRequest!.toJson()); - // Utils.hideLoading(context); + trafRequest?.trafContacts = []; + trafRequest?.trafContacts = userBasedOnSearch.map((item) => TrafContacts(id: 0, trafId: 0, name: item.userName)).toList(); + + Utils.showLoading(context); + await Provider.of(context, listen: false).addTraf(trafRequest!.toJson()); + Utils.hideLoading(context); + Navigator.pop(context); Navigator.push(context, MaterialPageRoute(builder: (context) => TrafRequestDetailPage(trafId: 27))); } } diff --git a/lib/modules/traf_module/traf_request_detail_page.dart b/lib/modules/traf_module/traf_request_detail_page.dart index 4b763736..5682b444 100644 --- a/lib/modules/traf_module/traf_request_detail_page.dart +++ b/lib/modules/traf_module/traf_request_detail_page.dart @@ -51,7 +51,6 @@ class _TrafRequestDetailPageState extends State { builder: (_, isLoading, __) { if (isLoading) return const ALoading(); TrafRequestProvider trafProvider = Provider.of(context, listen: false); - return Column( children: [ ListView( @@ -66,16 +65,16 @@ class _TrafRequestDetailPageState extends State { ] ], ).expanded, - // if (isEngineer) - FooterActionButton.footerContainer( - context: context, - child: AppFilledButton( - buttonColor: AppColor.primary10, - label: "Update", - onPressed: () { - Navigator.pushNamed(context, UpdateTrafRequestPage.id); - }), - ), + // // if (isEngineer) + // FooterActionButton.footerContainer( + // context: context, + // child: AppFilledButton( + // buttonColor: AppColor.primary10, + // label: "Update", + // onPressed: () { + // Navigator.pushNamed(context, UpdateTrafRequestPage.id); + // }), + // ), ], ); }, diff --git a/lib/modules/traf_module/traf_request_model.dart b/lib/modules/traf_module/traf_request_model.dart index c8a35cb4..0d1eedf1 100644 --- a/lib/modules/traf_module/traf_request_model.dart +++ b/lib/modules/traf_module/traf_request_model.dart @@ -51,6 +51,7 @@ class TrafRequestDataModel { int? positionId; String? positionName; List? departments; + List? trafDepartments; int? siteId; String? siteName; String? requesterExtensionNumber; @@ -144,6 +145,7 @@ class TrafRequestDataModel { this.positionId, this.positionName, this.departments, + this.trafDepartments, this.siteId, this.siteName, this.requesterExtensionNumber, @@ -242,6 +244,12 @@ class TrafRequestDataModel { departments!.add(new Departments.fromJson(v)); }); } + if (json['trafDepartments'] != null) { + trafDepartments = []; + json['trafDepartments'].forEach((v) { + trafDepartments!.add(new Departments.fromJson(v)); + }); + } siteId = json['siteId']; siteName = json['siteName']; requesterExtensionNumber = json['requesterExtensionNumber']; @@ -354,6 +362,9 @@ class TrafRequestDataModel { if (this.departments != null) { data['departments'] = this.departments!.map((v) => v.toJson()).toList(); } + if (this.trafDepartments != null) { + data['trafDepartments'] = this.trafDepartments!.map((v) => v.toJson()).toList(); + } data['siteId'] = this.siteId; data['siteName'] = this.siteName; data['requesterExtensionNumber'] = this.requesterExtensionNumber; @@ -452,15 +463,17 @@ class TrafRequestDataModel { class TrafContacts { int? id; int? trafId; + String? userId; String? name; String? telephone; String? notes; - TrafContacts({this.id, this.trafId, this.name, this.telephone, this.notes}); + TrafContacts({this.id, this.trafId, this.userId, this.name, this.telephone, this.notes}); TrafContacts.fromJson(Map json) { id = json['id']; trafId = json['trafId']; + userId = json['userId']; name = json['name']; telephone = json['telephone']; notes = json['notes']; @@ -470,6 +483,7 @@ class TrafContacts { final Map data = new Map(); data['id'] = this.id; data['trafId'] = this.trafId; + data['userId'] = this.userId; data['name'] = this.name; data['telephone'] = this.telephone; data['notes'] = this.notes; diff --git a/lib/modules/traf_module/update_traf_request_page.dart b/lib/modules/traf_module/update_traf_request_page.dart index 77fab5a1..e16e5726 100644 --- a/lib/modules/traf_module/update_traf_request_page.dart +++ b/lib/modules/traf_module/update_traf_request_page.dart @@ -87,7 +87,7 @@ class _UpdateTrafRequestPageState extends State { initialValue: classificationType, onSelect: (value) { classificationType = value; - trafRequest?.cla = value?.value; + // trafRequest?.cla = value?.value; // setState(() {}); }, ), diff --git a/lib/modules/traf_module/users_auto_complete_field.dart b/lib/modules/traf_module/users_auto_complete_field.dart new file mode 100644 index 00000000..12060844 --- /dev/null +++ b/lib/modules/traf_module/users_auto_complete_field.dart @@ -0,0 +1,134 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/oracle_code_provider.dart'; +import 'package:test_sa/controllers/providers/api/parts_provider.dart'; +import 'package:test_sa/controllers/providers/api/search_user_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/new_models/asset_nd_auto_complete_by_dynamic_codes_model.dart'; +import 'package:test_sa/models/new_models/users_based_on_search_model.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../extensions/text_extensions.dart'; +import '../../../models/service_request/spare_parts.dart'; +import '../../../new_views/app_style/app_text_style.dart'; + +class SearchUserAutoCompleteField extends StatefulWidget { + final String initialValue; + final num? assetId; + final bool clearAfterPick, byName; + final Function(UsersBasedOnSearchModel) onPick; + + const SearchUserAutoCompleteField({Key? key, required this.byName, required this.initialValue, this.assetId, required this.onPick, this.clearAfterPick = true}) : super(key: key); + + @override + _UsersAutoCompleteFieldState createState() => _UsersAutoCompleteFieldState(); +} + +class _UsersAutoCompleteFieldState extends State { + late UserSearchProvider _TechnologyUsersProvider; + + late TextEditingController _controller; + + bool loading = false; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue); + super.initState(); + _TechnologyUsersProvider = Provider.of(context, listen: false); + } + + @override + void didUpdateWidget(covariant SearchUserAutoCompleteField oldWidget) { + if (widget.initialValue != oldWidget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10)); + return Container( + decoration: BoxDecoration( + color: AppColor.background(context), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)], + ), + child: Autocomplete( + optionsBuilder: (TextEditingValue textEditingValue) async { + if (textEditingValue.text.isEmpty) { + if (loading) { + setState(() { + loading = false; + }); + } + return const Iterable.empty(); + } + if (!loading) { + setState(() { + loading = true; + }); + } + List workOrders = (await _TechnologyUsersProvider.getUsersBasedOnSearch(textEditingValue.text)); + setState(() { + loading = false; + }); + return workOrders; + }, + displayStringForOption: (UsersBasedOnSearchModel option) => widget.byName ? option.userName ?? "" : option.employeeId ?? "", + fieldViewBuilder: (BuildContext context, TextEditingController fieldTextEditingController, FocusNode fieldFocusNode, VoidCallback onFieldSubmitted) { + return TextField( + controller: _controller, + focusNode: fieldFocusNode, + style: AppTextStyles.bodyText.copyWith(color: AppColor.black10), + textAlign: TextAlign.start, + decoration: InputDecoration( + border: border, + disabledBorder: border, + focusedBorder: border, + enabledBorder: border, + errorBorder: border, + contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth), + constraints: const BoxConstraints(), + suffixIconConstraints: const BoxConstraints(maxHeight: 24, maxWidth: 24 + 8), + filled: true, + fillColor: AppColor.fieldBgColor(context), + errorStyle: AppTextStyle.tiny.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60), + floatingLabelStyle: AppTextStyle.body1.copyWith(fontWeight: FontWeight.w500, color: context.isDark ? null : AppColor.neutral20), + labelText: "Users going to use technology", + labelStyle: AppTextStyles.tinyFont.copyWith(color: AppColor.textColor(context)), + suffixIcon: loading ? const CircularProgressIndicator(color: AppColor.primary10, strokeWidth: 3.0).paddingOnly(end: 8) : null, + ), + textInputAction: TextInputAction.search, + onChanged: (text) { + fieldTextEditingController.text = text; + }, + onSubmitted: (String value) { + onFieldSubmitted(); + }, + ); + }, + onSelected: (UsersBasedOnSearchModel selection) { + if (widget.clearAfterPick) { + _controller.clear(); + } else { + _controller.text = widget.byName ? (selection.userName ?? "") : (selection.employeeId ?? ""); + } + widget.onPick(selection); + }, + ), + ); + } +} 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 ff090f7b..f644e951 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 @@ -103,7 +103,7 @@ class CreateRequestModel { list.add(CreateRequestModel(context.translation.transferAsset, "add_icon", CreateDeviceTransferRequest.id)); //TODO uncommit this to enable task. list.add(CreateRequestModel(context.translation.task, "add_icon", CreateTaskView.id)); - list.add(CreateRequestModel("Traf".addTranslation, "add_icon", CreateTRAFRequestPage.id)); + list.add(CreateRequestModel("TRAF".addTranslation, "add_icon", CreateTRAFRequestPage.id)); } return list; } 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..cbfbbf68 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 @@ -75,6 +75,10 @@ class _AllRequestsFilterPageState extends State { if (context.settingProvider.isUserFlowMedical) { types['Recall and Alert'] = 7; } + + if (!isEngineer) { + types['TRAF'] = 9; + } final statuses = { "All WO": 0, context.translation.open: 1, 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 23f1c89a..46ef9af8 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 @@ -50,6 +50,9 @@ class _MyRequestsPageState extends State { if (context.settingProvider.isUserFlowMedical) { requestsList.add(Request(7, 'Recall and Alert')); } + if (context.userProvider.user!.type == UsersTypes.normal_user) { + requestsList.add(Request(9, 'TRAF')); + } _provider = Provider.of(context, listen: false); _provider!.reset();