Gas refill screen

main_design2.0
zaid_daoud 2 years ago
parent b1e93abf4d
commit b77a36ac50

@ -21,7 +21,7 @@ class URLs {
// static String getFileUrl(String file) => (file == null || file.isEmpty) ? null :1 (file.contains("/") ? file : "$_host/attachment/$file");
// API Routes
static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post
static get login => "$_baseUrl/MobileAuth/Login"; // post
static get register => "$_baseUrl/handle/create/user"; // post
static get updateProfile => "$_baseUrl/update/user/profile"; // post
static get getSites => "$_baseUrl/Customer/GetCustomers"; // get

@ -7,6 +7,7 @@ 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/new_models/gas_refill_model.dart' as gasModel;
import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/models/user.dart';
@ -89,9 +90,8 @@ class GasRefillProvider extends ChangeNotifier {
}
Future<int> createModel({
@required String host,
@required User user,
@required GasRefillModel model,
@required gasModel.GasRefillModel model,
}) async {
Map<String, dynamic> body = {
"uid": user.id.toString(),
@ -109,12 +109,12 @@ class GasRefillProvider extends ChangeNotifier {
"GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}",
"status": model.status.toMap(),
};
body["gazRefillDetails"] = model.details
body["gazRefillDetails"] = model.gazRefillDetails
.map((model) => {
"gasType": model.type.toMap(),
"gasType": model.gasType.toMap(),
"cylinderSize": model.cylinderSize.toMap(),
"cylinderType": model.cylinderType.toMap(),
"requestedQty": model.requestedQuantity,
"requestedQty": model.requestedQty,
})
.toList();

@ -20,6 +20,7 @@ import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import 'package:test_sa/views/pages/user/land_page.dart' as old;
import 'controllers/providers/api/gas_refill_provider.dart';
import 'controllers/providers/api/user_provider.dart';
import 'controllers/providers/settings/setting_provider.dart';
import 'new_views/pages/new_gas_refill_request_page.dart';
@ -65,6 +66,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => CylinderSizeProvider()),
ChangeNotifierProvider(create: (_) => DepartmentProvider()),
ChangeNotifierProvider(create: (_) => SiteProvider()),
ChangeNotifierProvider(create: (_) => GasRefillProvider()),
],
child: GestureDetector(
onTap: () {

@ -36,4 +36,5 @@ enum TranslationKeys {
youHaveToSelect,
building,
floor,
createdSuccessfully,
}

@ -1,3 +1,5 @@
import 'dart:developer';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.dart';
@ -46,6 +48,7 @@ class GasRefillModel {
site = json['site'] != null ? Site.fromJson(json['site']) : null;
building = json['building'] != null ? Building.fromJson(json['building']) : null;
floor = json['floor'] != null ? Floor.fromJson(json['floor']) : null;
log(json['department']);
department = json['department'] != null ? Department.fromJson(json['department']) : null;
assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null;
status = json['status'] != null ? Lookup.fromJson(json['status']) : null;
@ -150,6 +153,23 @@ class GasRefillModel {
}
return map;
}
Future<bool> validate(BuildContext context) async {
if (site == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.destinationSite)}");
return false;
} else if (building == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.building)}");
return false;
} else if (floor == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.floor)}");
return false;
} else if (department == null) {
await Fluttertoast.showToast(msg: "${context.translate(TranslationKeys.youHaveToSelect)} ${context.translate(TranslationKeys.department)}");
return false;
}
return true;
}
}
class GasRefillDetails {

@ -17,8 +17,8 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
final List<T> staticData;
final TranslationKeys title;
/// If you want to use a static data (without calling API)
/// just use [NullableLoadingProvider] as generic data type and fill the [staticData]
/// To use a static data (without calling API)
/// just send [NullableLoadingProvider] as generic data type and fill the [staticData]
const SingleItemDropDownMenu({
Key key,
@required this.context,
@ -39,19 +39,18 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override
void initState() {
if (widget.staticData != null) {
if (X != NullableLoadingProvider) {
provider = Provider.of<X>(widget.context);
}
if (widget.initialValue != null) {
final result = (widget.staticData ?? provider?.items)?.where((element) {
final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) {
return element == widget.initialValue;
});
if (result.isNotEmpty) _selectedItem = result.first;
if (widget.initialValue?.identifier ?? "" != _selectedItem?.identifier ?? "") {
if ((widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) {
widget.onSelect(_selectedItem);
}
}
super.initState();
}
@ -63,7 +62,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
if (widget.initialValue != null) {
final result = (widget.staticData ?? provider?.items)?.where((element) {
final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) {
return element == widget.initialValue;
});
if (result.isNotEmpty) {
@ -71,7 +70,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
} else {
_selectedItem = null;
}
if (widget.initialValue?.identifier ?? "" != _selectedItem?.identifier ?? "") {
if ((widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) {
widget.onSelect(_selectedItem);
}
} else {
@ -83,12 +82,14 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override
Widget build(BuildContext context) {
return AppLoadingManager(
isLoading: provider?.loading ?? false,
isFailedLoading: provider?.items == null && widget.staticData == null,
stateCode: widget.staticData == null ? provider?.stateCode : 200,
isLoading: (X == NullableLoadingProvider) ? false : provider.loading,
isFailedLoading: (X == NullableLoadingProvider) ? false : provider.items == null,
stateCode: (X == NullableLoadingProvider) ? 200 : provider.stateCode,
onRefresh: () async {
if (X != NullableLoadingProvider) {
provider?.reset();
await provider?.getDate();
}
},
child: Container(
height: 60.toScreenHeight,
@ -131,7 +132,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
});
widget.onSelect(newValue);
},
items: (widget.staticData ?? provider?.items)?.map<DropdownMenuItem<T>>((value) {
items: ((X == NullableLoadingProvider) ? widget.staticData : provider.items)?.map<DropdownMenuItem<T>>((value) {
return DropdownMenuItem<T>(
value: value,
child: Text(

@ -1,4 +1,7 @@
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/user_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';
@ -20,6 +23,7 @@ import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart'
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/providers/api/gas_refill_provider.dart';
import '../../controllers/validator/validator.dart';
import '../common_widgets/default_app_bar.dart';
@ -105,34 +109,44 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
SingleItemDropDownMenu<Site, SiteProvider>(
context: context,
title: TranslationKeys.destinationSite,
initialValue: _gasModel.site,
onSelect: (value) {
setState(() {
_gasModel.site = value;
});
},
),
8.height,
SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context,
title: TranslationKeys.building,
initialValue: _gasModel.building,
enabled: _gasModel.site?.buildings?.isNotEmpty ?? false,
staticData: _gasModel.site?.buildings ?? [],
onSelect: (value) {
setState(() {
_gasModel.building = value;
});
},
),
8.height,
SingleItemDropDownMenu<Floor, NullableLoadingProvider>(
context: context,
title: TranslationKeys.floor,
initialValue: _gasModel.floor,
enabled: _gasModel.building?.floors?.isNotEmpty ?? false,
staticData: _gasModel.building?.floors ?? [],
onSelect: (value) {
setState(() {
_gasModel.floor = value;
});
},
),
8.height,
SingleItemDropDownMenu<Department, NullableLoadingProvider>(
context: context,
title: TranslationKeys.department,
initialValue: _gasModel.department,
enabled: _gasModel.floor?.departments?.isNotEmpty ?? false,
staticData: _gasModel.floor?.departments ?? [],
onSelect: (value) {
@ -213,7 +227,7 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
}
void _add() async {
if (_formKey.currentState.validate() && await _currentDetails.validate(context)) {
if (_formKey.currentState.validate() && await _currentDetails.validate(context) && await _gasModel.validate(context)) {
_formKey.currentState.save();
_gasModel.gazRefillDetails.add(_currentDetails);
_quantityController.clear();
@ -227,7 +241,15 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
setState(() {});
}
void _submit() {
Navigator.pop(context);
Future<void> _submit() async {
final status = await Provider.of<GasRefillProvider>(context, listen: false).createModel(
user: Provider.of<UserProvider>(context, listen: false).user,
model: _gasModel,
);
if (status >= 200 && status < 300) {
Fluttertoast.showToast(msg: context.translate(TranslationKeys.createdSuccessfully));
Navigator.of(context).pop();
setState(() {});
}
}
}

@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/lookup.dart';
class NullableLoadingProvider extends LoadingListNotifier<Lookup> {
class NullableLoadingProvider extends LoadingListNotifier<Base> {
@override
Future getDate() {
return Future.value();

Loading…
Cancel
Save