From 8e2b21bd9dacd72187688f2033c5110bbe2049fe Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 8 Jun 2023 10:36:53 +0300 Subject: [PATCH] gas refill cont. --- lib/controllers/api_routes/urls.dart | 5 + .../providers/api/gas_refill_provider.dart | 18 ++- .../providers/api/hospitals_provider.dart | 31 ++++ lib/models/customer.dart | 149 ++++++++++++++++++ lib/models/gas_refill/gas_refill_model.dart | 4 + lib/models/hospital.dart | 128 ++++++++++++++- .../user/gas_refill/request_gas_refill.dart | 94 +++++++++-- .../user/gas_refill/track_gas_refill.dart | 1 + .../gas_refill/building_type_menu.dart | 101 ++++++++++++ .../gas_refill/department_type_menu.dart | 101 ++++++++++++ .../widgets/gas_refill/floor_type_menu.dart | 101 ++++++++++++ .../hospital_auto_complete_field.dart | 9 ++ .../hospital_auto_complete_field_new.dart | 97 ++++++++++++ 13 files changed, 824 insertions(+), 15 deletions(-) create mode 100644 lib/models/customer.dart create mode 100644 lib/views/widgets/gas_refill/building_type_menu.dart create mode 100644 lib/views/widgets/gas_refill/department_type_menu.dart create mode 100644 lib/views/widgets/gas_refill/floor_type_menu.dart create mode 100644 lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index e52251cd..4dc9dc73 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,5 +1,6 @@ class URLs { URLs._(); + static const host2 = "http://194.163.164.213/atoms/api"; static const host1 = "https://atomsuat.hmg.com"; // uat url @@ -18,6 +19,8 @@ class URLs { static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get + static get getHospitalsAutoComplete => "$_baseUrl/Customer/GetCustomersAutoComplete"; // get + static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051 static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 @@ -29,7 +32,9 @@ class URLs { static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; + static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; + static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index c293bf75..cb2c6bb6 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -5,6 +5,7 @@ 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/gas_refill/gas_refill_model.dart'; +import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { @@ -16,6 +17,10 @@ class GasRefillProvider extends ChangeNotifier { items = null; nextPage = true; stateCode = null; + hospital = null; + building = null; + floor = null; + department = null; } // state code of current request to defied error message @@ -50,7 +55,7 @@ class GasRefillProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; - print("url:${ URLs.getGasRefill}:body:$body"); + print("url:${URLs.getGasRefill}:body:$body"); response = await ApiManager.instance.post( URLs.getGasRefill, @@ -89,6 +94,11 @@ class GasRefillProvider extends ChangeNotifier { Map body = { "uid": user.id.toString(), "token": user.token ?? "", + "building": {"id": building?.id, "name": building?.name, "value": building?.value}, + "floor": {"id": floor.id, "name": floor.name, "value": floor.value}, + "expectedDate": "2023-06-08T07:03:07.866Z", + "expectedTime": "2023-06-08T07:03:07.866Z", + "department": {"id": department.id, "departmentName": department.name, "departmentCode": "", "ntCode": ""}, "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; @@ -158,4 +168,10 @@ class GasRefillProvider extends ChangeNotifier { return -1; } } + + Hospital hospital; + Buildings building; + Floors floor; + Departments department; + DateTime expectedDateTime; } diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 38c1f1aa..eb9e3ae9 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -114,4 +114,35 @@ class HospitalsProvider extends ChangeNotifier { return []; } } + + Future> getHospitalsListByVal({String searchVal=""}) async { + Response response; + try { + if(searchVal.isNotEmpty) { + searchVal = "?searchText=$searchVal"; + } + response = await ApiManager.instance.get(URLs.getHospitalsAutoComplete+searchVal); + // response = await get( + // Uri.parse(host + URLs.getHospitals + // + ( title == null || title.isEmpty ? "" : "?name=$title" )), + // headers: { + // "Content-Type":"application/json; charset=utf-8" + // } + // ); + _stateCode = response.statusCode; + + List _page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); + } + return _page; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return []; + } + } } diff --git a/lib/models/customer.dart b/lib/models/customer.dart new file mode 100644 index 00000000..d075eff9 --- /dev/null +++ b/lib/models/customer.dart @@ -0,0 +1,149 @@ +class Customer { + List data; + String message; + String innerMessage; + int responseCode; + bool isSuccess; + + Customer({this.data, this.message, this.innerMessage, this.responseCode, this.isSuccess}); + + Customer.fromJson(Map json) { + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data.add(new Data.fromJson(v)); + }); + } + message = json['message']; + innerMessage = json['innerMessage']; + responseCode = json['responseCode']; + isSuccess = json['isSuccess']; + } + + Map toJson() { + final Map data = new Map(); + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + data['message'] = this.message; + data['innerMessage'] = this.innerMessage; + data['responseCode'] = this.responseCode; + data['isSuccess'] = this.isSuccess; + return data; + } +} + +class Data { + int id; + int customerCode; + String custName; + List buildings; + + Data({this.id, this.customerCode, this.custName, this.buildings}); + + Data.fromJson(Map json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = new List(); + json['buildings'].forEach((v) { + buildings.add(new Buildings.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['customerCode'] = this.customerCode; + data['custName'] = this.custName; + if (this.buildings != null) { + data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Buildings { + int id; + String name; + int value; + List floors; + + Buildings({this.id, this.name, this.value, this.floors}); + + Buildings.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['floors'] != null) { + floors = new List(); + json['floors'].forEach((v) { + floors.add(new Floors.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.floors != null) { + data['floors'] = this.floors.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Floors { + int id; + String name; + int value; + List departments; + + Floors({this.id, this.name, this.value, this.departments}); + + Floors.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['departments'] != null) { + departments = new List(); + json['departments'].forEach((v) { + departments.add(new Departments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.departments != null) { + data['departments'] = this.departments.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Departments { + int id; + String name; + + Departments({this.id, this.name}); + + Departments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 4cc43203..f15dd4bc 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -7,6 +7,8 @@ class GasRefillModel { String clientName; String title; Lookup status; + Lookup building; + Lookup floor; List details; GasRefillModel({ @@ -21,6 +23,8 @@ class GasRefillModel { bool validate() { if (title == null) return false; if (status == null) return false; + if (building == null) return false; + if (floor == null) return false; if (details == null && details.isEmpty) return false; return true; } diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index d59eda18..d9c5cd34 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -2,7 +2,7 @@ class Hospital { int id; int customerCode; String name; - List buildings; + List buildings; Hospital({ this.id, @@ -12,7 +12,16 @@ class Hospital { }); factory Hospital.fromJson(Map parsedJson) { - return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: parsedJson["buildings"]); + List buildings = []; + + if (parsedJson['buildings'] != null) { + buildings = []; + parsedJson['buildings'].forEach((v) { + buildings.add(new Buildings.fromJson(v)); + }); + } + + return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: buildings); } factory Hospital.fromHospital(Hospital hospital) { @@ -23,3 +32,118 @@ class Hospital { return {'id': id, 'customerCode': customerCode, 'custName': name, "buildings": buildings}; } } + +// class Data { +// int id; +// int customerCode; +// String custName; +// List buildings; +// +// Data({this.id, this.customerCode, this.custName, this.buildings}); +// +// Data.fromJson(Map json) { +// id = json['id']; +// customerCode = json['customerCode']; +// custName = json['custName']; +// if (json['buildings'] != null) { +// buildings = new List(); +// json['buildings'].forEach((v) { +// buildings.add(new Buildings.fromJson(v)); +// }); +// } +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['id'] = this.id; +// data['customerCode'] = this.customerCode; +// data['custName'] = this.custName; +// if (this.buildings != null) { +// data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); +// } +// return data; +// } +// } + +class Buildings { + int id; + String name; + int value; + List floors; + + Buildings({this.id, this.name, this.value, this.floors}); + + Buildings.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['floors'] != null) { + floors = new List(); + json['floors'].forEach((v) { + floors.add(new Floors.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.floors != null) { + data['floors'] = this.floors.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Floors { + int id; + String name; + int value; + List departments; + + Floors({this.id, this.name, this.value, this.departments}); + + Floors.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['departments'] != null) { + departments = new List(); + json['departments'].forEach((v) { + departments.add(new Departments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.departments != null) { + data['departments'] = this.departments.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Departments { + int id; + String name; + + Departments({this.id, this.name}); + + Departments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 79a2320f..d3903a46 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -13,7 +13,12 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; +import 'package:test_sa/views/widgets/gas_refill/building_type_menu.dart'; +import 'package:test_sa/views/widgets/gas_refill/department_type_menu.dart'; +import 'package:test_sa/views/widgets/gas_refill/floor_type_menu.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; +import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart'; @@ -25,6 +30,7 @@ import '../../../../controllers/localization/localization.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; + const RequestGasRefill({Key key}) : super(key: key); @override @@ -110,7 +116,11 @@ class _RequestGasRefillState extends State { _subtitle = AppLocalization.of(context).subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _gasRefillProvider = Provider.of(context, listen: false); + if (_gasRefillProvider == null) { + _gasRefillProvider = Provider.of(context, listen: false); + _gasRefillProvider.reset(); + } + return Scaffold( key: _scaffoldKey, body: Form( @@ -174,25 +184,80 @@ class _RequestGasRefillState extends State { const SizedBox( height: 4, ), - const ASubTitle("Type"), - if (_validate && _currentDetails.type == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), + HospitalAutoCompleteField( + initialValue: _gasRefillProvider.hospital?.name, + // onSave: (value){ + // _search.hospital = value; + // }, + onSearch: (value) { + _gasRefillProvider.hospital = value; + _gasRefillProvider.building = null; + _gasRefillProvider.floor = null; + _gasRefillProvider.department = null; + setState(() {}); + }, + ), const SizedBox( - height: 4, + height: 8, + ), + BuildingTypeMenu( + initialValue: _gasRefillProvider?.building, + building: _gasRefillProvider?.hospital?.buildings, + onSelect: (status) { + _gasRefillProvider.building = status; + setState(() {}); + }, + ), + const SizedBox(height: 8), + FloorTypeMenu( + initialValue: _gasRefillProvider?.floor, + floors: _gasRefillProvider?.building?.floors, + onSelect: (status) { + _gasRefillProvider.floor = status; + setState(() {}); + }, ), + const SizedBox(height: 8), + DepartmentTypeMenu( + initialValue: _gasRefillProvider?.department, + departments: _gasRefillProvider?.floor?.departments, + onSelect: (status) { + _gasRefillProvider.department = status; + setState(() {}); + }, + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Expected Date Time"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.expectedDateTime, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.expectedDateTime = date; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Divider(color: Theme.of(context).colorScheme.primary), + const SizedBox(height: 4), + const ASubTitle("Type"), + if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), + const SizedBox(height: 4), GasTypeMenu( initialValue: _currentDetails.type, onSelect: (status) { _currentDetails.type = status; }, ), - - const SizedBox( - height: 8, - ), + const SizedBox(height: 8), const ASubTitle("Cylinder Size"), if (_validate && _currentDetails.cylinderSize == null) ASubTitle( @@ -208,6 +273,10 @@ class _RequestGasRefillState extends State { _currentDetails.cylinderSize = status; }, ), + const SizedBox( + height: 8, + ), + const SizedBox( height: 8, ), @@ -254,6 +323,7 @@ class _RequestGasRefillState extends State { text: _subtitle.add, onPressed: _addNewModel, ), + if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"), ListView.builder( key: _DetailsKey, diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index aa3141c1..c016fd62 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -23,6 +23,7 @@ class _TrackGasRefillPageState extends State with TickerProv GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; + @override Widget build(BuildContext context) { _gasRefillProvider = Provider.of(context); diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart new file mode 100644 index 00000000..2cfb901f --- /dev/null +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class BuildingTypeMenu extends StatefulWidget { + final Function(Buildings) onSelect; + Buildings initialValue; + List building; + + BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const []}) : super(key: key); + + @override + _BuildingTypeMenuState createState() { + return _BuildingTypeMenuState(); + } +} + +class _BuildingTypeMenuState extends State { + Buildings _selectedBuilding; + List _building; + + @override + void initState() { + super.initState(); + _selectedBuilding = widget.initialValue; + _building = widget.building; + } + + @override + void didUpdateWidget(covariant BuildingTypeMenu oldWidget) { + if (oldWidget.building != widget.building) { + _building = widget.building; + _selectedBuilding = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedBuilding, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Building", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Buildings newValue) { + setState(() { + _selectedBuilding = newValue; + }); + widget.onSelect(newValue); + }, + items: _building?.map>((Buildings value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/gas_refill/department_type_menu.dart b/lib/views/widgets/gas_refill/department_type_menu.dart new file mode 100644 index 00000000..4014f570 --- /dev/null +++ b/lib/views/widgets/gas_refill/department_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class DepartmentTypeMenu extends StatefulWidget { + final Function(Departments) onSelect; + Departments initialValue; + List departments; + + DepartmentTypeMenu({Key key, this.onSelect, this.initialValue, this.departments = const []}) : super(key: key); + + @override + _DepartmentTypeMenuState createState() { + return _DepartmentTypeMenuState(); + } +} + +class _DepartmentTypeMenuState extends State { + Departments _selected; + List _departments; + + @override + void initState() { + super.initState(); + _selected = widget.initialValue; + _departments = widget.departments; + } + + @override + void didUpdateWidget(covariant DepartmentTypeMenu oldWidget) { + if (oldWidget.departments != widget.departments) { + _departments = widget.departments; + _selected = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Department", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Departments newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: widget?.departments?.map>((Departments value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart new file mode 100644 index 00000000..9658b53f --- /dev/null +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class FloorTypeMenu extends StatefulWidget { + final Function(Floors) onSelect; + Floors initialValue; + List floors; + + FloorTypeMenu({Key key, this.onSelect, this.initialValue, this.floors = const []}) : super(key: key); + + @override + _FloorTypeMenuState createState() { + return _FloorTypeMenuState(); + } +} + +class _FloorTypeMenuState extends State { + Floors _selected; + List _floors; + + @override + void initState() { + super.initState(); + _selected = widget.initialValue; + _floors = widget.floors; + } + + @override + void didUpdateWidget(covariant FloorTypeMenu oldWidget) { + if (oldWidget.floors != widget.floors) { + _floors = widget.floors; + _selected = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Floor", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Floors newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: _floors?.map>((Floors value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 40e1eb6a..ea4d662a 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -34,6 +34,15 @@ class _HospitalAutoCompleteFieldState extends State { super.initState(); } + @override + void didUpdateWidget(covariant HospitalAutoCompleteField oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.initialValue != widget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + } + @override void dispose() { _controller.dispose(); diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart new file mode 100644 index 00000000..1bc29fd6 --- /dev/null +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +class HospitalAutoCompleteField extends StatefulWidget { + final String initialValue; + final Function(Hospital) onSearch; + + //final Function(Hospital) onSave; + + const HospitalAutoCompleteField({ + Key key, + this.onSearch, + this.initialValue, + }) : super(key: key); + + @override + _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); +} + +class _HospitalAutoCompleteFieldState extends State { + SettingProvider _settingProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue); + super.initState(); + } + + @override + void didUpdateWidget(covariant HospitalAutoCompleteField oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.initialValue != widget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: [ + // AppStyle.boxShadow + // ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: _subtitle.hospital, + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); + }, + itemBuilder: (context, hospital) { + return ListTile( + title: Text(hospital.name), + ); + }, + onSuggestionSelected: (hospital) { + widget.onSearch(hospital); + }, + ), + ); + } +}