aman-satu-flutter/lib/views/add_product/add_product_view.dart

158 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:satu/core/entity/Category.dart';
import 'package:satu/core/entity/Goods.dart';
import 'package:satu/core/redux/actions/sell_actions.dart';
import 'package:satu/core/redux/store.dart';
import 'package:satu/core/services/dictionary_service.dart';
import 'package:satu/core/services/navigator_service.dart';
import 'package:satu/core/utils/locator.dart';
import 'package:satu/shared/app_colors.dart';
import 'package:satu/shared/ui_helpers.dart';
import 'package:satu/views/add_product/component/add_category_list_item.dart';
import 'package:satu/views/add_product/component/app_bar.dart';
import 'package:satu/widgets/fields/input_field.dart';
import 'component/add_product_list_item.dart';
class AddProductView extends StatefulWidget {
@override
_AddProductViewState createState() => _AddProductViewState();
}
class _AddProductViewState extends State<AddProductView> {
DictionaryService _dictionaryService = locator<DictionaryService>();
NavigatorService _navigatorService = locator<NavigatorService>();
TextEditingController _searchTextController;
final FocusNode _searchFocusNode = new FocusNode();
List<Category> _history;
List<Category> _categories;
List<Good> _goods;
@override
void initState() {
_searchTextController = TextEditingController();
_searchTextController.addListener(() {
if(_searchTextController.text.isNotEmpty){
searchByField(_searchTextController.text);
} else {
reset();
}
});
_history = [Category()
..id = 0
];
_categories = [];
_goods = [];
super.initState();
navigateCategory(0);
}
@override
void dispose() {
_searchTextController.dispose();
_searchFocusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
int catSize = _categories?.length ?? 0;
int goodSize = _goods?.length ?? 0;
return Scaffold(
appBar: AddProductAppBar(title: 'Товар', actions: actions(),),
body: Column(
children: [
InputField(placeholder: 'Поиск по наименованию и коду товара',
search: true,
controller: _searchTextController,
fieldFocusNode: _searchFocusNode,),
verticalSpaceTiny,
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: ListView.builder(
physics: BouncingScrollPhysics(),
itemCount: catSize + goodSize,
itemBuilder: (BuildContext context, int index) {
if (index < catSize) {
Category category = _categories[index];
return AddCategoryListItem(
name: category.name,
isOdd: index % 2 == 0,
key: Key('category_${category.id}'),
onPress: () => onCategoryPress(category),
);
}
Good good = _goods[index - catSize];
return AddProductListItem(
key: Key('product_${good.id}'),
ean: good.ean,
isOdd: index % 2 == 0,
name: good.name,
price: good.price,
categoryName: _history.last?.name,
onPress: () => onGoodPress(good),
);
},
),
),
),
],
),
);
}
onCategoryPress(Category category) {
_history.add(category);
navigateCategory(category.id);
}
onGoodPress(Good good) {
Redux.store.dispatch(addSellItem(good: good));
_navigatorService.pop();
}
List<Widget> actions() {
return [
if(_history.length > 1)
FlatButton(onPressed: () {
_history.removeLast();
navigateCategory(_history.last.id);
}, child: Text('Назад', style: TextStyle(color: Colors.black),),),
FlatButton(onPressed: reset, child: Text('Сбросить', style: TextStyle(color: Colors.black),),)
];
}
void reset() {
_history = [Category()
..id = 0
];
navigateCategory(0);
_searchTextController.clear();
}
void navigateCategory(int categoryId) async {
List<Category> categories = await _dictionaryService.getCategoryByParentId(categoryId);
List<Good> goods = await _dictionaryService.getGoodsByCategoryId(categoryId);
setState(() {
_categories = categories;
_goods = goods;
});
}
void searchByField(String query) async {
List<Category> categories = [];
List<Good> goods = await _dictionaryService.getGoodsByNameOrEan(query);
setState(() {
_categories = categories;
_goods = goods;
});
}
}