Search All Requests Done

main_design2.0
zaid_daoud 2 years ago
parent 3c4d8b74e2
commit e29946e280

@ -6,6 +6,8 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/all_requests_and_count_model.dart';
import '../../../models/search_all_requests_model.dart';
class AllRequestsProvider extends ChangeNotifier {
bool isAllLoading = false;
bool isOpenLoading = false;
@ -33,7 +35,7 @@ class AllRequestsProvider extends ChangeNotifier {
getCloseRequests();
}
Future<int> getAllRequests({int typeTransaction}) async {
Future<int> getAllRequests({int typeTransaction, SearchAllRequestsModel search}) async {
if (isAllLoading == true) return -2;
isAllLoading = true;
if (allRequestsAndCount == null) notifyListeners();
@ -43,7 +45,13 @@ class AllRequestsProvider extends ChangeNotifier {
"typeTransaction": typeTransaction == null ? [1, 2, 3, 4] : [typeTransaction],
"statusTransaction": [1, 2, 3],
"priority": [0, 1],
"displayData": []
"displayData": [],
if (search?.requestNumber?.value?.isNotEmpty ?? false) "requestNumber": search.requestNumber.value,
if (search?.assetName?.value?.isNotEmpty ?? false) "assetName": search.assetName.value,
if (search?.assetNo?.value?.isNotEmpty ?? false) "assetNumber": search.assetNo.value,
if (search?.sn?.value?.isNotEmpty ?? false) "assetSerialNo": search.sn.value,
if (search?.model?.value?.isNotEmpty ?? false) "model": search.model.value,
if (search?.manufacture?.value?.isNotEmpty ?? false) "manufacturer": search.manufacture.value,
};
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body);

@ -217,7 +217,7 @@
"requiredField" : "Required Field",
"passwordLengthMessage" : "Password must has at least 6 characters",
"overview" : "Overview",
"myRequests" : "My Request",
"myRequests" : "My Requests",
"myAssets" : "My Assets",
"contactUs": "Contact Us",
"welcome" : "Welcome,",

@ -0,0 +1,46 @@
import 'package:flutter/cupertino.dart';
import 'package:test_sa/extensions/context_extension.dart';
class SearchAllRequestsModel {
SearchByRequestNumberModel requestNumber;
SearchByAssetNameModel assetName;
SearchByAssetNoModel assetNo;
SearchByManufactureModel manufacture;
SearchBySNModel sn;
SearchByRequestModel model;
SearchAllRequestsBaseModel selectedValue;
SearchAllRequestsModel({this.requestNumber, this.assetName, this.assetNo, this.manufacture, this.sn, this.model});
}
abstract class SearchAllRequestsBaseModel {
String label;
String value;
BuildContext context;
TextInputType inputType;
SearchAllRequestsBaseModel(BuildContext context, {this.label, this.value, this.inputType = TextInputType.text});
}
class SearchByRequestNumberModel extends SearchAllRequestsBaseModel {
SearchByRequestNumberModel(BuildContext context, {String value = "0"}) : super(context, label: "${context.translation.requestNo}.", value: value?.toString());
}
class SearchByAssetNameModel extends SearchAllRequestsBaseModel {
SearchByAssetNameModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.assetName, value: value);
}
class SearchByAssetNoModel extends SearchAllRequestsBaseModel {
SearchByAssetNoModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.assetNo, value: value, inputType: TextInputType.number);
}
class SearchByManufactureModel extends SearchAllRequestsBaseModel {
SearchByManufactureModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.manufacture, value: value);
}
class SearchBySNModel extends SearchAllRequestsBaseModel {
SearchBySNModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.sn, value: value);
}
class SearchByRequestModel extends SearchAllRequestsBaseModel {
SearchByRequestModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.model, value: value);
}

@ -1,22 +1,16 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/new_views/pages/land_page/calendar_page.dart';
import 'package:test_sa/new_views/pages/land_page/home_app_bar.dart';
import 'package:test_sa/new_views/pages/land_page/my_assets_page.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.dart';
import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart';
import 'package:test_sa/views/pages/user/land_page.dart' as old_page;
import 'package:test_sa/views/widgets/equipment/single_device_picker.dart';
import '../../../controllers/providers/settings/setting_provider.dart';
import '../../../views/widgets/dialogs/dialog.dart';
import '../../common_widgets/app_bottom_nav_bar.dart';
import '../../common_widgets/app_drawer.dart';
import '../../common_widgets/app_floating_action_button.dart';
import 'contact_us_bottom_sheet.dart';
import 'dashboard_page.dart';
@ -50,30 +44,24 @@ class _LandPageState extends State<LandPage> {
DashboardPage(onDrawerPress: (() {
_scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer();
})),
// old_page.LandPage(),
MyRequestsPage(),
SingleDevicePicker(),
if (_userProvider.user.type == UsersTypes.engineer) CalendarPage(),
// const old_page.LandPage(),
MyRequestsPage(),
const SingleDevicePicker(),
if (_userProvider.user.type == UsersTypes.engineer) const CalendarPage(),
];
}
return WillPopScope(
onWillPop: () async {
/// TODO [zaid] : show dialog before exit
// bool result = await showDialog(
// context: context,
// builder: (_) => const AAlertDialog(
// title: "_subtitle.exit",
// content: "_subtitle.exitAlert",
// ),
// );
if (true) {
if (Platform.isAndroid) {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
} else {
exit(0);
}
bool result = await showDialog(
context: context,
builder: (_) => AAlertDialog(title: context.translation.signOut, content: context.translation.logoutAlert),
);
if (result) {
Provider.of<SettingProvider>(context, listen: false).resetSettings();
Provider.of<UserProvider>(context, listen: false).reset();
Navigator.of(context).pop();
Navigator.of(context).pop();
}
return false;
},

@ -0,0 +1,110 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/devices_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/models/new_models/department.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/department_provider.dart';
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import '../../../../views/widgets/equipment/equipment_status_buttons.dart';
import '../../../common_widgets/app_lazy_loading.dart';
import '../../../common_widgets/default_app_bar.dart';
class AllRequestsFilterPage extends StatefulWidget {
static const String id = "all_requests_filter_page";
// final AssetSearch data;
const AllRequestsFilterPage({Key key}) : super(key: key);
@override
State<AllRequestsFilterPage> createState() => _AllRequestsFilterPageState();
}
class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
// AssetSearch filter;
Site _site;
Department _department;
@override
void initState() {
// filter = widget.data ?? AssetSearch();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: DefaultAppBar(title: context.translation.filter),
body: Column(
children: [
SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
/// todo : TBD
EquipmentStatusButtons(onSelect: (value) {
if (value == null) {
/// the selected value is [All Assets]
}
}),
16.height,
SingleItemDropDownMenu<Department, DepartmentProvider>(
context: context,
title: context.translation.byDepartment,
initialValue: _department,
onSelect: (value) {
_department = value;
},
).paddingOnly(start: 16, end: 16),
8.height,
SingleItemDropDownMenu<Site, SiteProvider>(
context: context,
title: context.translation.bySite,
initialValue: _site,
onSelect: (value) {
_site = value;
},
).paddingOnly(start: 16, end: 16),
16.height,
context.translation.pmDateRange.heading5(context).paddingOnly(start: 16, end: 16),
8.height,
/// todo : TBD
Row(
children: [
ADatePicker(
label: context.translation.from,
onDatePicker: (date) {},
).expanded,
8.width,
ADatePicker(
label: context.translation.to,
onDatePicker: (date) {},
).expanded,
],
).paddingOnly(start: 16, end: 16),
],
),
).expanded,
AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16),
],
).paddingOnly(top: 16, bottom: 16),
);
}
void _search() async {
// filter.site = _site?.name;
// filter.department = _department?.departmentName;
final deviceProvider = Provider.of<AssetProvider>(context, listen: false);
deviceProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// await deviceProvider.getAssets(search: filter);
Navigator.pop(context);
// Navigator.of(context).pop(filter);
}
}

@ -0,0 +1,101 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/all_requests_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/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/requests_search_button.dart';
import '../../../../models/search_all_requests_model.dart';
import '../../../common_widgets/app_lazy_loading.dart';
import '../../../common_widgets/default_app_bar.dart';
class AllRequestsSearchPage extends StatefulWidget {
static const String id = "all_requests_search_page";
final SearchAllRequestsModel data;
const AllRequestsSearchPage({Key key, this.data}) : super(key: key);
@override
State<AllRequestsSearchPage> createState() => _AllRequestsSearchPageState();
}
class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
SearchAllRequestsModel search;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
void initState() {
search = widget.data;
super.initState();
}
@override
Widget build(BuildContext context) {
if (search == null) {
search = SearchAllRequestsModel(
requestNumber: SearchByRequestNumberModel(context),
assetName: SearchByAssetNameModel(context),
assetNo: SearchByAssetNoModel(context),
manufacture: SearchByManufactureModel(context),
sn: SearchBySNModel(context),
model: SearchByRequestModel(context),
);
search.selectedValue = search.requestNumber;
}
return Scaffold(
appBar: DefaultAppBar(title: context.translation.search),
body: Form(
key: _formKey,
child: Column(
children: [
SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
context.translation.searchBy.heading5(context),
8.height,
RequestsSearchButtons(
items: [search.requestNumber, search.assetName, search.assetNo, search.manufacture, search.sn, search.model],
initialValue: search.selectedValue,
onSelect: (value) {
if (search.selectedValue != value) {
search.selectedValue = value;
setState(() {});
}
},
),
16.height,
AppTextFormField(
controller: TextEditingController(text: search.selectedValue.value),
labelText: search.selectedValue.label,
textInputType: search.selectedValue.inputType,
onSaved: (value) {
search.selectedValue.value = value;
},
),
],
),
).expanded,
AppFilledButton(onPressed: _search, label: context.translation.search),
],
).paddingAll(16),
),
);
}
void _search() async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
// requestsProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await requestsProvider.getAllRequests(search: search);
Navigator.pop(context);
Navigator.of(context).pop(search);
}
}
}

@ -5,12 +5,21 @@ 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/models/search_all_requests_model.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_filter_page.dart';
import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search_page.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart';
class MyRequestsPage extends StatelessWidget {
MyRequestsPage({Key key}) : super(key: key);
class MyRequestsPage extends StatefulWidget {
const MyRequestsPage({Key key}) : super(key: key);
@override
State<MyRequestsPage> createState() => _MyRequestsPageState();
}
class _MyRequestsPageState extends State<MyRequestsPage> {
AllRequestsProvider _provider;
SearchAllRequestsModel _search;
@override
Widget build(BuildContext context) {
@ -31,10 +40,8 @@ class MyRequestsPage extends StatelessWidget {
padding: const EdgeInsets.only(left: 16, right: 8),
alignment: Alignment.center,
decoration: ShapeDecoration(
color: Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
color: const Color(0xFFEAF1F4),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
),
child: Row(
children: [
@ -49,10 +56,10 @@ class MyRequestsPage extends StatelessWidget {
],
),
).onPress(() async {
// final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetSearchScreen(data: _searchAsset)));
// if (result != null) {
// _searchAsset = result;
// }
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AllRequestsSearchPage(data: _search)));
if (result != null) {
_search = result;
}
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}).expanded,
@ -61,10 +68,10 @@ class MyRequestsPage extends StatelessWidget {
context.translation.filter,
style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)),
).onPress(() async {
// final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetFilterScreen(data: _searchAsset)));
// if (result != null) {
// _searchAsset = result;
// }
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => const AllRequestsFilterPage()));
if (result != null) {
// _searchAsset = result;
}
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}),

@ -0,0 +1,67 @@
import 'package:flutter/material.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 '../../../../models/search_all_requests_model.dart';
import '../../../app_style/app_color.dart';
class RequestsSearchButtons extends StatefulWidget {
final Function(SearchAllRequestsBaseModel) onSelect;
final List<SearchAllRequestsBaseModel> items;
final SearchAllRequestsBaseModel initialValue;
const RequestsSearchButtons({Key key, @required this.items, this.initialValue, this.onSelect}) : super(key: key);
@override
State<RequestsSearchButtons> createState() => _RequestsSearchButtonsState();
}
class _RequestsSearchButtonsState extends State<RequestsSearchButtons> {
SearchAllRequestsBaseModel _data;
@override
void initState() {
_data = widget.initialValue;
super.initState();
}
@override
void didUpdateWidget(covariant RequestsSearchButtons oldWidget) {
if (widget.initialValue != oldWidget.initialValue) {
setState(() {
_data = widget.initialValue;
});
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return Wrap(
spacing: 8.toScreenWidth,
runSpacing: 8.toScreenHeight,
children: widget.items
.map(
(data) => Container(
padding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: (_data == data ? 12 : 8).toScreenWidth),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
color: _data == data ? AppColor.neutral30 : Colors.white,
border: _data == data ? Border.all(width: 1, color: AppColor.primary50) : null,
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)],
),
child: data.label.tinyFont(context).custom(color: AppColor.neutral50),
).onPress(
() {
setState(() {
_data = data;
});
widget.onSelect(data);
},
),
)
.toList(),
);
}
}

@ -172,7 +172,7 @@ class _SingleDevicePickerState extends State<SingleDevicePicker> {
return AssetItemListView(
device: _searchableList[itemIndex],
onPressed: (device) {
Navigator.of(context).pop(device);
Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id);
},
);
},

Loading…
Cancel
Save