import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:satu/core/entity/category_entity.dart'; import 'package:satu/core/entity/goods_entity.dart'; import 'package:satu/core/models/dictionary/good_row_data.dart'; import 'package:satu/core/redux/actions/sell_actions.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/routes/route_names.dart'; import 'package:satu/shared/app_colors.dart'; import 'package:satu/views/dictionaries/component/dictionary_list_tile.dart'; import 'package:satu/widgets/bar/products_app_bar.dart'; import 'package:satu/widgets/bar/products_title_bar.dart'; import 'package:satu/widgets/fields/input_field.dart'; import 'package:satu/widgets/ui/product_title_widget.dart'; class GoodsDictionaryView extends StatefulWidget { @override _GoodsDictionaryViewState createState() => _GoodsDictionaryViewState(); } class _GoodsDictionaryViewState extends State { final DictionaryService _dictionaryService = locator(); final NavigatorService _navigatorService = locator(); late TextEditingController _searchTextController; final FocusNode _searchFocusNode = FocusNode(); late List _goods = []; late List _categories = []; late List items = []; @override void initState() { _searchTextController = TextEditingController(); _searchTextController.addListener(() { if (_searchTextController.text.isNotEmpty) { searchByField(_searchTextController.text); } else { reset(); } }); initQuery(); super.initState(); } Future initQuery() async { _goods = await _dictionaryService.getGoodsByNameOrEan(''); _categories = await _dictionaryService.getCategoriesAll(); searchByField(''); } @override void dispose() { _searchTextController.dispose(); _searchFocusNode.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: ProductsAppBar( title: 'Товары', drawerShow: true, actions: [ ClipRRect( borderRadius: BorderRadius.circular(90), child: Material( color: Colors.transparent, child: InkWell( onTap: () {}, child: Padding( padding: const EdgeInsets.all(16.0), child: SvgPicture.asset( 'assets/images/svg/options.svg', height: 20, width: 20, color: textColor, ), ), ), ), ), ], ), body: Column( children: [ InputField( placeholder: 'Поиск по наименованию товара или штрих-код', search: true, controller: _searchTextController, fieldFocusNode: _searchFocusNode, ), const ProductsTitleBarBar(title: 'Список товаров'), Expanded( child: ListView.separated( physics: const BouncingScrollPhysics(), itemCount: items.length, itemBuilder: (BuildContext context, int index) { final GoodRowDao good = items[index]; return DictionaryTile( onPress: () { locator() .push(goodsEditRoute, arguments: good); }, child: ProductTitleWidget( name: good.name, categoryName: good.categoryName, ean: good.ean, ), ); }, separatorBuilder: (BuildContext context, int index) { return const Divider( height: 1.0, color: disableColor, ); }, ), ), ], ), floatingActionButton: FloatingActionButton( elevation: 2, onPressed: () => locator() .push(goodsEditRoute, arguments: GoodRowDao('', '')), child: const Icon( Icons.add_rounded, size: 34.0, color: whiteColor, ), ), ); } void reset() { _searchTextController.clear(); searchByField(''); } Future searchByField(String query) async { log.i(query); final List list = []; final Iterable filtered = query == '' ? _goods : _goods.where((element) => element.name.toLowerCase().contains(query.toLowerCase()) || (element.ean != null && element.ean!.contains(query.toLowerCase()))); filtered.forEach((element) { final Category category = _categories .firstWhere((parent) => parent.id == element.categoryId, orElse: () { return Category(); }); final String parentName = category.name; final GoodRowDao rowDao = GoodRowDao(element.name, parentName, ean: element.ean, id: element.id, categoryId: element.categoryId); list.add(rowDao); }); setState(() { items = list; }); } }