Gas refill design without submit button

main_design2.0
zaid_daoud 2 years ago
parent ed759f5dcf
commit b1e93abf4d

@ -33,5 +33,7 @@
"add": "أضف", "add": "أضف",
"site" : "الموقع", "site" : "الموقع",
"onlyNumbers": "يسمح بإدخال الأرقام فقط", "onlyNumbers": "يسمح بإدخال الأرقام فقط",
"youHaveToSelect" : "يجب عليك إختيار" "youHaveToSelect" : "يجب عليك إختيار",
"building" : "المبنى",
"floor" : "الطابق"
} }

@ -33,5 +33,7 @@
"add": "Add", "add": "Add",
"site" : "Site", "site" : "Site",
"onlyNumbers": "Only Numbers Allowed", "onlyNumbers": "Only Numbers Allowed",
"youHaveToSelect" : "You have to select" "youHaveToSelect" : "You have to select",
"building" : "Building",
"floor" : "Floor"
} }

@ -17,6 +17,7 @@ import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.d
import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart'; import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart';
import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart'; 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/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 'package:test_sa/views/pages/user/land_page.dart' as old;
import 'controllers/providers/api/user_provider.dart'; import 'controllers/providers/api/user_provider.dart';
@ -59,6 +60,7 @@ class MyApp extends StatelessWidget {
providers: [ providers: [
ChangeNotifierProvider(create: (_) => UserProvider()), ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => GasTypesProvider()), ChangeNotifierProvider(create: (_) => GasTypesProvider()),
ChangeNotifierProvider(create: (_) => NullableLoadingProvider()),
ChangeNotifierProvider(create: (_) => CylinderTypesProvider()), ChangeNotifierProvider(create: (_) => CylinderTypesProvider()),
ChangeNotifierProvider(create: (_) => CylinderSizeProvider()), ChangeNotifierProvider(create: (_) => CylinderSizeProvider()),
ChangeNotifierProvider(create: (_) => DepartmentProvider()), ChangeNotifierProvider(create: (_) => DepartmentProvider()),

@ -1,5 +1,5 @@
class Base { class Base {
final String name, identifier; String name, identifier;
const Base({this.name, this.identifier}); Base({this.name, this.identifier});
} }

@ -1,4 +1,3 @@
import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
class CallRequestForWorkOrder { class CallRequestForWorkOrder {
@ -414,13 +413,13 @@ class Site {
} }
} }
class Department extends Base { class Department {
int id; int id;
String departmentName; String departmentName;
String departmentCode; String departmentCode;
String ntCode; String ntCode;
Department({this.id, this.departmentName, this.departmentCode, this.ntCode}) : super(identifier: id.toString(), name: departmentName); Department({this.id, this.departmentName, this.departmentCode, this.ntCode});
Department.fromJson(Map<String, dynamic> json) { Department.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];

@ -34,4 +34,6 @@ enum TranslationKeys {
site, site,
onlyNumbers, onlyNumbers,
youHaveToSelect, youHaveToSelect,
building,
floor,
} }

@ -1,15 +1,17 @@
import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
class Building { class Building extends Base {
Building({ Building({
this.id, this.id,
this.name,
this.value, this.value,
this.floors, this.floors,
}); String name,
}) : super(identifier: id.toString(), name: name);
Building.fromJson(dynamic json) { Building.fromJson(dynamic json) {
id = json['id']; id = json['id'];
identifier = id.toString();
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
if (json['floors'] != null) { if (json['floors'] != null) {
@ -20,7 +22,6 @@ class Building {
} }
} }
num id; num id;
String name;
num value; num value;
List<Floor> floors; List<Floor> floors;
Building copyWith({ Building copyWith({

@ -1,14 +1,18 @@
class Department { import '../base.dart';
class Department extends Base {
Department({ Department({
this.id, this.id,
this.departmentName, this.departmentName,
this.departmentCode, this.departmentCode,
this.ntCode, this.ntCode,
}); }) : super(identifier: id.toString(), name: departmentName);
Department.fromJson(dynamic json) { Department.fromJson(dynamic json) {
id = json['id']; id = json['id'];
identifier = id.toString();
departmentName = json['departmentName']; departmentName = json['departmentName'];
name = departmentName;
departmentCode = json['departmentCode']; departmentCode = json['departmentCode'];
ntCode = json['ntCode']; ntCode = json['ntCode'];
} }

@ -1,15 +1,17 @@
import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
class Floor { class Floor extends Base {
Floor({ Floor({
this.id, this.id,
this.name, String name,
this.value, this.value,
this.departments, this.departments,
}); }) : super(identifier: id.toString(), name: name);
Floor.fromJson(dynamic json) { Floor.fromJson(dynamic json) {
id = json['id']; id = json['id'];
identifier = id.toString();
name = json['name']; name = json['name'];
value = json['value']; value = json['value'];
if (json['departments'] != null) { if (json['departments'] != null) {
@ -20,7 +22,6 @@ class Floor {
} }
} }
num id; num id;
String name;
num value; num value;
List<Department> departments; List<Department> departments;
Floor copyWith({ Floor copyWith({

@ -10,7 +10,9 @@ class Site extends Base {
Site.fromJson(dynamic json) { Site.fromJson(dynamic json) {
id = json['id']; id = json['id'];
identifier = id.toString();
custName = json['custName']; custName = json['custName'];
name = custName;
if (json['buildings'] != null) { if (json['buildings'] != null) {
buildings = []; buildings = [];
json['buildings'].forEach((v) { json['buildings'].forEach((v) {

@ -14,8 +14,20 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
final Function(T) onSelect; final Function(T) onSelect;
final T initialValue; final T initialValue;
final bool enabled; final bool enabled;
final List<T> staticData;
final TranslationKeys title; final TranslationKeys title;
const SingleItemDropDownMenu({Key key, @required this.context, @required this.title, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key);
/// If you want to use a static data (without calling API)
/// just use [NullableLoadingProvider] as generic data type and fill the [staticData]
const SingleItemDropDownMenu({
Key key,
@required this.context,
@required this.title,
this.onSelect,
this.initialValue,
this.enabled = true,
this.staticData,
}) : super(key: key);
@override @override
State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>(); State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>();
@ -27,9 +39,11 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override @override
void initState() { void initState() {
provider = Provider.of<X>(widget.context); if (widget.staticData != null) {
provider = Provider.of<X>(widget.context);
}
if (widget.initialValue != null) { if (widget.initialValue != null) {
final result = provider.items?.where((element) { final result = (widget.staticData ?? provider?.items)?.where((element) {
return element == widget.initialValue; return element == widget.initialValue;
}); });
if (result.isNotEmpty) _selectedItem = result.first; if (result.isNotEmpty) _selectedItem = result.first;
@ -49,7 +63,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override @override
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) { void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
if (widget.initialValue != null) { if (widget.initialValue != null) {
final result = provider.items?.where((element) { final result = (widget.staticData ?? provider?.items)?.where((element) {
return element == widget.initialValue; return element == widget.initialValue;
}); });
if (result.isNotEmpty) { if (result.isNotEmpty) {
@ -69,12 +83,12 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppLoadingManager( return AppLoadingManager(
isLoading: provider.loading, isLoading: provider?.loading ?? false,
isFailedLoading: provider.items == null, isFailedLoading: provider?.items == null && widget.staticData == null,
stateCode: provider.stateCode, stateCode: widget.staticData == null ? provider?.stateCode : 200,
onRefresh: () async { onRefresh: () async {
provider.reset(); provider?.reset();
await provider.getDate(); await provider?.getDate();
}, },
child: Container( child: Container(
height: 60.toScreenHeight, height: 60.toScreenHeight,
@ -87,7 +101,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)), if (widget.enabled) const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -117,7 +131,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
}); });
widget.onSelect(newValue); widget.onSelect(newValue);
}, },
items: provider.items?.map<DropdownMenuItem<T>>((value) { items: (widget.staticData ?? provider?.items)?.map<DropdownMenuItem<T>>((value) {
return DropdownMenuItem<T>( return DropdownMenuItem<T>(
value: value, value: value,
child: Text( child: Text(

@ -5,6 +5,9 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart'; import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/models/new_models/site.dart'; import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
@ -15,6 +18,7 @@ import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.d
import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart'; import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart';
import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart'; 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/gas_request_providers/site_provider.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/validator/validator.dart'; import '../../controllers/validator/validator.dart';
import '../common_widgets/default_app_bar.dart'; import '../common_widgets/default_app_bar.dart';
@ -105,6 +109,36 @@ class _NewGasRefillRequestPageState extends State<NewGasRefillRequestPage> {
_gasModel.site = value; _gasModel.site = value;
}, },
), ),
8.height,
SingleItemDropDownMenu<Building, NullableLoadingProvider>(
context: context,
title: TranslationKeys.building,
enabled: _gasModel.site?.buildings?.isNotEmpty ?? false,
staticData: _gasModel.site?.buildings ?? [],
onSelect: (value) {
_gasModel.building = value;
},
),
8.height,
SingleItemDropDownMenu<Floor, NullableLoadingProvider>(
context: context,
title: TranslationKeys.floor,
enabled: _gasModel.building?.floors?.isNotEmpty ?? false,
staticData: _gasModel.building?.floors ?? [],
onSelect: (value) {
_gasModel.floor = value;
},
),
8.height,
SingleItemDropDownMenu<Department, NullableLoadingProvider>(
context: context,
title: TranslationKeys.department,
enabled: _gasModel.floor?.departments?.isNotEmpty ?? false,
staticData: _gasModel.floor?.departments ?? [],
onSelect: (value) {
_gasModel.department = value;
},
),
// 8.height, // 8.height,
// SingleItemDropDownMenu<Department, DepartmentProvider>( // SingleItemDropDownMenu<Department, DepartmentProvider>(
// context: context, // context: context,

@ -1,5 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/models/base.dart'; import 'package:test_sa/models/base.dart';
import 'package:test_sa/models/lookup.dart';
class NullableLoadingProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() {
return Future.value();
}
}
abstract class LoadingListNotifier<T extends Base> extends ChangeNotifier { abstract class LoadingListNotifier<T extends Base> extends ChangeNotifier {
int stateCode; int stateCode;

Loading…
Cancel
Save