Browse Source

update screen nursery

master
daivph 5 years ago
parent
commit
f7ae65bd01
10 changed files with 570 additions and 73 deletions
  1. +11
    -1
      lib/custom_model/Nursery.dart
  2. +68
    -0
      lib/presentation/screens/actions/nursery/bloc/expansion_list_bloc.dart
  3. +32
    -0
      lib/presentation/screens/actions/nursery/bloc/expansion_list_event.dart
  4. +28
    -0
      lib/presentation/screens/actions/nursery/bloc/expansion_list_state.dart
  5. +312
    -70
      lib/presentation/screens/actions/nursery/sc_edit_action_nursery.dart
  6. +2
    -2
      lib/presentation/screens/resources/sc_resource_helper.dart
  7. +55
    -0
      lib/utils/bloc/bloc/status_add_form_bloc.dart
  8. +34
    -0
      lib/utils/bloc/bloc/status_add_form_event.dart
  9. +26
    -0
      lib/utils/bloc/bloc/status_add_form_state.dart
  10. +2
    -0
      lib/utils/const_common.dart

+ 11
- 1
lib/custom_model/Nursery.dart View File

@@ -52,18 +52,28 @@ class Nursery {
}

class NurseryDetail {
int id;
String workerName;
String trayNumber;
bool isExpanded = false;
NurseryDetail({this.workerName, this.trayNumber});

NurseryDetail.clone(NurseryDetail nurseryDetail) {
this.id = nurseryDetail.id;
this.workerName = nurseryDetail.workerName;
this.trayNumber = nurseryDetail.trayNumber;
this.isExpanded = nurseryDetail.isExpanded;
}

NurseryDetail.fromJson(Map<String, dynamic> json) {
id = json['id'];
workerName = json['workerName'];
trayNumber = json['trayNumber'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['workerName'] = this.workerName;
data['trayNumber'] = this.trayNumber;
return data;

+ 68
- 0
lib/presentation/screens/actions/nursery/bloc/expansion_list_bloc.dart View File

@@ -0,0 +1,68 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:farm_tpf/custom_model/Nursery.dart';
import 'package:meta/meta.dart';

part 'expansion_list_event.dart';
part 'expansion_list_state.dart';

class ExpansionListBloc extends Bloc<ExpansionListEvent, ExpansionListState> {
ExpansionListBloc() : super(ExpansionListInitial());

@override
Stream<ExpansionListState> mapEventToState(
ExpansionListEvent event,
) async* {
if (event is AddNew) {
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
if (i == 0) {
current.isExpanded = true;
} else {
current.isExpanded = false;
}
items.add(NurseryDetail.clone(current));
}
yield ExpansionListSuccess(items: items);
} else if (event is Collapse) {
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
if (i == event.index) {
current.isExpanded = !current.isExpanded;
} else {
current.isExpanded = false;
}
items.add(NurseryDetail.clone(current));
}
yield ExpansionListSuccess(items: items);
} else if (event is DeleteItem) {
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
if (i == event.index) {
//ignore
} else {
items.add(NurseryDetail.clone(current));
}
}

yield ExpansionListSuccess(items: items);
} else if (event is Update) {
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
if (i == event.index) {
items.add(NurseryDetail.clone(event.item));
} else {
items.add(NurseryDetail.clone(current));
}
}

yield ExpansionListSuccess(items: items);
}
}
}

+ 32
- 0
lib/presentation/screens/actions/nursery/bloc/expansion_list_event.dart View File

@@ -0,0 +1,32 @@
part of 'expansion_list_bloc.dart';

abstract class ExpansionListEvent {
const ExpansionListEvent();

@override
List<Object> get props => [];
}

class Update extends ExpansionListEvent {
final int index;
final NurseryDetail item;
final List<NurseryDetail> items;
Update({@required this.index, @required this.item, @required this.items});
}

class AddNew extends ExpansionListEvent {
final List<NurseryDetail> items;
AddNew({@required this.items});
}

class DeleteItem extends ExpansionListEvent {
final int index;
final List<NurseryDetail> items;
DeleteItem({@required this.index, @required this.items});
}

class Collapse extends ExpansionListEvent {
final int index;
final List<NurseryDetail> items;
Collapse({@required this.index, @required this.items});
}

+ 28
- 0
lib/presentation/screens/actions/nursery/bloc/expansion_list_state.dart View File

@@ -0,0 +1,28 @@
part of 'expansion_list_bloc.dart';

abstract class ExpansionListState extends Equatable {
const ExpansionListState();

@override
List<Object> get props => [];
}

class ExpansionListInitial extends ExpansionListState {}

class ExpansionListFailure extends ExpansionListState {
final String errorString;
ExpansionListFailure({@required this.errorString});
}

class ExpansionListSuccess extends ExpansionListState {
final List<NurseryDetail> items;

const ExpansionListSuccess({this.items});

ExpansionListSuccess copyWith({List<NurseryDetail> items}) {
return ExpansionListSuccess(items: items ?? this.items);
}

@override
List<Object> get props => [items];
}

+ 312
- 70
lib/presentation/screens/actions/nursery/sc_edit_action_nursery.dart View File

@@ -1,12 +1,21 @@
import 'package:farm_tpf/custom_model/Nursery.dart';
import 'package:farm_tpf/data/repository/repository.dart';
import 'package:farm_tpf/models/index.dart';
import 'package:farm_tpf/presentation/screens/actions/nursery/bloc/expansion_list_bloc.dart';
import 'package:farm_tpf/presentation/screens/resources/sc_resource_helper.dart';
import 'package:farm_tpf/utils/bloc/bloc/status_add_form_bloc.dart';
import 'package:farm_tpf/utils/const_color.dart';
import 'package:farm_tpf/utils/const_common.dart';
import 'package:farm_tpf/utils/const_string.dart';
import 'package:farm_tpf/utils/const_style.dart';
import 'package:farm_tpf/utils/pref.dart';
import 'package:farm_tpf/utils/validators.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_datetime_picker/flutter_datetime_picker.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:get/get.dart';
import 'package:get/state_manager.dart';
import 'package:intl/intl.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
import 'package:pattern_formatter/pattern_formatter.dart';
@@ -30,12 +39,22 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
TextEditingController _quantityController = TextEditingController();
TextEditingController _seedIncubationTimeController = TextEditingController();
TextEditingController _descriptionController = TextEditingController();
TextEditingController _workerNameController = TextEditingController();
TextEditingController _trayNumberController = TextEditingController();
String executeTimeView;
DateTime executeTime = DateTime.now();
List<NurseryDetail> currentNurseryDetail = List<NurseryDetail>();
ExpansionListBloc _bloc;
int currentIndexUpdate = -1;
bool isResetForm = true;
final changeSupply = Get.put(ChangeSupply());
int selectedSupplyId = -1;

@override
void initState() {
super.initState();
changeSupply.initValue();
_nursery.nurseryDetail = new List<NurseryDetail>();
flutterToast = FlutterToast(context);
//UPDATE
if (_nursery != null) {
@@ -91,7 +110,23 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
Widget _btnSelectSeed() {
return FlatButton(
padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0),
onPressed: () {},
onPressed: () {
Navigator.of(context)
.push(MaterialPageRoute(
builder: (_) => ResourceHelperScreen(
titleName: "Gía thể",
type: ConstCommon.supplyTypeSubStrate,
selectedId: Get.find<ChangeSupply>().selectedSupplyId),
fullscreenDialog: false))
.then((value) {
if (value != null) {
var result = value as Supply;
_nursery.substrates = result.name;
changeSupply.change(result);
print("Home: $value");
}
});
},
child: Container(
padding:
EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0),
@@ -100,11 +135,14 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
),
child: Row(
children: [
Expanded(
child: Text(
"Tên giống",
style: TextStyle(fontSize: 14.0, color: Colors.black87),
)),
GetBuilder<ChangeSupply>(
builder: (_) => Expanded(
child: Text(
changeSupply.currentSupply.name == null
? "Loại giá thể"
: _nursery.substrates.toString(),
style: TextStyle(
fontSize: 14.0, color: Colors.black87)))),
Icon(
Icons.arrow_drop_down,
color: Colors.grey,
@@ -113,20 +151,6 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
)));
}

Widget _subStratesField() {
return TextFormField(
keyboardType: TextInputType.text,
decoration: InputDecoration(labelText: "Loại giá thể"),
controller: _substrateController,
validator: (String value) {
return Validators.validateNotNullOrEmpty(value, "Loại giá thể");
},
onSaved: (newValue) {
_nursery.substrates = newValue;
},
);
}

Widget _seedLengthField() {
return TextFormField(
keyboardType: TextInputType.numberWithOptions(decimal: true),
@@ -192,6 +216,193 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
);
}

Widget _btnAddWorker() {
return Builder(builder: (context) {
return BlocConsumer<StatusAddFormBloc, StatusAddFormState>(
listener: (context, state) {
if (state is Edit) {
isResetForm = false;
_workerNameController.text = state.nurseryDetail.workerName;
_trayNumberController.text = state.nurseryDetail.trayNumber;
} else if (state is Delete) {
if (currentIndexUpdate == state.index) {
isResetForm = true;
_workerNameController.text = "";
_trayNumberController.text = "";
}
} else {
isResetForm = true;
_workerNameController.text = "";
_trayNumberController.text = "";
}
}, builder: (context, state) {
return Container(
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10),
color: Colors.white,
border: Border.all(color: COLOR_CONST.DEFAULT)),
child: Column(
children: [
TextFormField(
keyboardType: TextInputType.text,
controller: _workerNameController,
decoration: InputDecoration(labelText: "Tên công nhân"),
onSaved: (newValue) {
_nursery.description = newValue;
},
),
TextFormField(
keyboardType: TextInputType.text,
controller: _trayNumberController,
decoration: InputDecoration(labelText: "Ươm khây số"),
onSaved: (newValue) {
_nursery.description = newValue;
},
),
Align(
alignment: Alignment.centerRight,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
isResetForm
? Container()
: OutlineButton(
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(8.0)),
child: Text("Huỷ"),
onPressed: () {
context.bloc<StatusAddFormBloc>().add(Reset());
}),
FlatButton(
color: COLOR_CONST.DEFAULT,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(8.0)),
onPressed: () {
NurseryDetail _nurseryDetail = NurseryDetail()
..workerName = _workerNameController.text
..trayNumber = _trayNumberController.text;

if (state is Edit) {
context.bloc<ExpansionListBloc>().add(Update(
index: state.index,
item: _nurseryDetail,
items: state.items));
} else {
currentNurseryDetail.insert(0, _nurseryDetail);
BlocProvider.of<ExpansionListBloc>(context)
.add(AddNew(items: currentNurseryDetail));
}
context.bloc<StatusAddFormBloc>().add(Reset());
},
child: Text(
(state is Edit) ? "Sửa" : "Thêm",
style: TextStyle(color: Colors.white),
))
],
),
),
],
));
});
});
}

Widget _buildListAddWorker() {
return Builder(builder: (context) {
return BlocBuilder<ExpansionListBloc, ExpansionListState>(
builder: (context, state) {
if (state is ExpansionListSuccess) {
currentNurseryDetail = state.items;
if (currentNurseryDetail.isEmpty) {
return Container();
}
return Container(
height: 70,
child: ListView.builder(
physics: ClampingScrollPhysics(),
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: currentNurseryDetail.length,
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
print("Show preview image or video");
currentIndexUpdate = index;
context.bloc<StatusAddFormBloc>().add(Changed(
status: CRUDStatus.edit,
index: index,
nurseryDetail: currentNurseryDetail[index],
items: currentNurseryDetail));
},
child: Card(
child: Stack(
alignment: Alignment.bottomCenter,
overflow: Overflow.visible,
children: <Widget>[
Positioned(
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Container(
padding: EdgeInsets.all(4),
width: 120,
child: Column(
children: [
SizedBox(
height: 12.0,
),
Flexible(
child: Text(
currentNurseryDetail[index]
.workerName ??
"",
overflow: TextOverflow.ellipsis,
maxLines: 1),
),
Flexible(
child: Text(currentNurseryDetail[index]
.trayNumber ??
""))
],
),
),
)),
Positioned(
top: -10,
right: -10,
child: IconButton(
icon: Icon(
Icons.cancel,
color: Colors.redAccent,
),
onPressed: () {
print("On tap delete media");
context.bloc<ExpansionListBloc>().add(
DeleteItem(
index: index,
items: currentNurseryDetail));
context.bloc<StatusAddFormBloc>().add(
Changed(
status: CRUDStatus.delete,
index: index,
nurseryDetail:
currentNurseryDetail[index],
items: currentNurseryDetail));
}),
)
],
)));
}));
} else if (state is ExpansionListFailure) {
return Container();
} else {
return Container();
}
});
});
}

_actionAppBar() {
IconButton iconButton;
if (1 == 1) {
@@ -220,57 +431,71 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
title: Text(plot_action_nursery),
actions: _actionAppBar()),
body: KeyboardDismisser(
child: Form(
key: _formKey,
autovalidate: _autoValidate,
child: SingleChildScrollView(
padding: EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Container(
width: double.infinity,
child: Text(
"Ngày thực hiện",
style: TextStyle(
color: Colors.black54, fontSize: 13.0),
),
),
_btnExecuteTimePicker(),
SizedBox(
height: 8.0,
),
Container(
width: double.infinity,
child: Text(
"Tên giống",
style: TextStyle(
color: Colors.black54, fontSize: 13.0),
),
),
_btnSelectSeed(),
SizedBox(
height: 8.0,
child: MultiBlocProvider(
providers: [
BlocProvider<ExpansionListBloc>(
create: (context) => ExpansionListBloc(),
),
BlocProvider<StatusAddFormBloc>(
create: (context) => StatusAddFormBloc(),
)
],
child: Form(
key: _formKey,
autovalidate: _autoValidate,
child: SingleChildScrollView(
padding: EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Container(
width: double.infinity,
child: Text(
"Ngày thực hiện",
style: TextStyle(
color: Colors.black54, fontSize: 13.0),
),
),
_btnExecuteTimePicker(),
SizedBox(
height: 8.0,
),
Container(
width: double.infinity,
child: Text(
"Tên giống",
style: TextStyle(
color: Colors.black54, fontSize: 13.0),
),
),
_btnSelectSeed(),
SizedBox(
height: 8.0,
),
_seedLengthField(),
SizedBox(
height: 8.0,
),
_quantityField(),
SizedBox(
height: 8.0,
),
_seedIncubationTimeField(),
SizedBox(
height: 8.0,
),
_desciptionField(),
SizedBox(
height: 8.0,
),
_btnAddWorker(),
SizedBox(
height: 8.0,
),
_buildListAddWorker(),
Container(child: Text("Them hinh anh")),
],
),
_subStratesField(),
SizedBox(
height: 8.0,
),
_seedLengthField(),
SizedBox(
height: 8.0,
),
_quantityField(),
SizedBox(
height: 8.0,
),
_seedIncubationTimeField(),
SizedBox(
height: 8.0,
),
_desciptionField()
],
),
)))));
))))));
@override
void dispose() {
_substrateController.dispose();
@@ -281,3 +506,20 @@ class _EditActionNurseryState extends State<EditActionNurseryScreen> {
super.dispose();
}
}

class ChangeSupply extends GetxController {
Supply currentSupply;
int selectedSupplyId;

void initValue() {
currentSupply = Supply();
selectedSupplyId = -1;
update();
}

void change(Supply supply) {
currentSupply = supply;
selectedSupplyId = supply.id;
update();
}
}

+ 2
- 2
lib/presentation/screens/resources/sc_resource_helper.dart View File

@@ -135,10 +135,10 @@ class ItemInfinityWidget extends StatelessWidget {
title: Text(item.name.toString()),
subtitle: Text(item.manufacturer.toString()),
value: item,
groupValue: item.isSelected ? item : null,
groupValue: item.isSelected == null ? null : item,
onChanged: (Supply value) {
print("selected value: ${value.id}");
Navigator.of(context).pop(value.id);
Navigator.of(context).pop(value);
}),
)),
onTap: () {});

+ 55
- 0
lib/utils/bloc/bloc/status_add_form_bloc.dart View File

@@ -0,0 +1,55 @@
import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:farm_tpf/custom_model/Nursery.dart';
import 'package:farm_tpf/utils/const_common.dart';
import 'package:meta/meta.dart';

part 'status_add_form_event.dart';
part 'status_add_form_state.dart';

class StatusAddFormBloc extends Bloc<StatusAddFormEvent, StatusAddFormState> {
StatusAddFormBloc() : super(Initial());

@override
Stream<StatusAddFormState> mapEventToState(
StatusAddFormEvent event,
) async* {
if (event is Changed) {
switch (event.status) {
case CRUDStatus.edit:
var index = event.index;
var item = NurseryDetail.clone(event.nurseryDetail);
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
items.add(NurseryDetail.clone(current));
}
yield new Edit(nurseryDetail: item, index: index, items: items);
break;
case CRUDStatus.delete:
if (event.items.isEmpty) {
break;
}
var index = event.index;
var item = NurseryDetail.clone(event.nurseryDetail);
List<NurseryDetail> items = new List<NurseryDetail>();
for (int i = 0; i < event.items.length; i++) {
var current = event.items[i];
if (i == index) {
//
} else {
items.add(NurseryDetail.clone(current));
}
}
yield new Delete(nurseryDetail: item, index: index, items: items);
break;
default:
yield Initial();
}
} else if (event is Reset) {
yield Initial();
}
}
}

+ 34
- 0
lib/utils/bloc/bloc/status_add_form_event.dart View File

@@ -0,0 +1,34 @@
part of 'status_add_form_bloc.dart';

abstract class StatusAddFormEvent extends Equatable {
const StatusAddFormEvent();

@override
List<Object> get props => [];
}

class Reset extends StatusAddFormEvent {}

class Changed extends StatusAddFormEvent {
final CRUDStatus status;
final int index;
final NurseryDetail nurseryDetail;
final List<NurseryDetail> items;
Changed(
{@required this.status,
@required this.index,
@required this.nurseryDetail,
@required this.items});
}

class DeleteRelateList extends StatusAddFormEvent {
final CRUDStatus status;
final int index;
final NurseryDetail nurseryDetail;
final List<NurseryDetail> items;
DeleteRelateList(
{@required this.status,
@required this.index,
@required this.nurseryDetail,
@required this.items});
}

+ 26
- 0
lib/utils/bloc/bloc/status_add_form_state.dart View File

@@ -0,0 +1,26 @@
part of 'status_add_form_bloc.dart';

abstract class StatusAddFormState {
const StatusAddFormState();
@override
List<Object> get props => [];
}

class Initial extends StatusAddFormState {}

class Edit extends StatusAddFormState {
final int index;
final NurseryDetail nurseryDetail;
final List<NurseryDetail> items;
Edit({@required this.index, @required this.nurseryDetail, this.items});
}

class Delete extends StatusAddFormState {
final int index;
final NurseryDetail nurseryDetail;
final List<NurseryDetail> items;
Delete(
{@required this.index,
@required this.nurseryDetail,
@required this.items});
}

+ 2
- 0
lib/utils/const_common.dart View File

@@ -7,3 +7,5 @@ class ConstCommon {
static const String supplyTypeSubStrate = "GIATHE";
static const String supplyTypeProtectPlant = "THUOCBVTV";
}

enum CRUDStatus { unknown, add, edit, delete }

Loading…
Cancel
Save