diff --git a/lib/core/entity/Goods.dart b/lib/core/entity/Goods.dart index 11b1b3e..36b7ed9 100644 --- a/lib/core/entity/Goods.dart +++ b/lib/core/entity/Goods.dart @@ -14,7 +14,7 @@ const String GoodColumnAppCompanyId = 'app_company_id'; class Good { int? id; int? categoryId; - String? name; + String name = ''; String? ean; int? articul; num? price; diff --git a/lib/core/models/dictionary/good_response.dart b/lib/core/models/dictionary/good_response.dart index bea75cb..cd9a317 100644 --- a/lib/core/models/dictionary/good_response.dart +++ b/lib/core/models/dictionary/good_response.dart @@ -12,7 +12,7 @@ class GoodResponse { int? id; int? categoryId; - String? name; + String name = ''; String? ean; int? articul; int? price; diff --git a/lib/core/models/flow/product_dao.dart b/lib/core/models/flow/product_dao.dart index b103c42..7bfea5b 100644 --- a/lib/core/models/flow/product_dao.dart +++ b/lib/core/models/flow/product_dao.dart @@ -3,7 +3,7 @@ class ProductDao { int? categoryId; num? count; num? price; - String? productName; + String productName = ''; String? categoryName; String? eanCode; int? article; diff --git a/lib/views/add_by_barcode/add_by_barcode_view.dart b/lib/views/add_by_barcode/add_by_barcode_view.dart index 5034cbc..fdb560a 100644 --- a/lib/views/add_by_barcode/add_by_barcode_view.dart +++ b/lib/views/add_by_barcode/add_by_barcode_view.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:satu/views/work/tabs/component/products_app_bar.dart'; +import 'package:satu/widgets/bar/products_app_bar.dart'; import 'package:satu/widgets/tools/app_barcode_scanner_widget.dart'; class AddByBarcodeView extends StatefulWidget { diff --git a/lib/views/add_product/add_product_view.dart b/lib/views/add_product/add_product_view.dart index 2043ad0..7d380f3 100644 --- a/lib/views/add_product/add_product_view.dart +++ b/lib/views/add_product/add_product_view.dart @@ -9,7 +9,8 @@ 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/bar/products_app_bar.dart'; +import 'package:satu/widgets/bar/products_title_bar.dart'; import 'package:satu/widgets/fields/input_field.dart'; import 'component/add_product_list_item.dart'; @@ -62,44 +63,42 @@ class _AddProductViewState extends State { int catSize = _categories?.length ?? 0; int goodSize = _goods?.length ?? 0; return Scaffold( - appBar: AddProductAppBar(title: 'Товар', actions: actions(),), + appBar: ProductsAppBar( title: 'Категория',), body: Column( children: [ - InputField(placeholder: 'Поиск по наименованию и коду товара', + InputField(placeholder: 'Поиск по наименованию или коду товара', search: true, controller: _searchTextController, fieldFocusNode: _searchFocusNode,), verticalSpaceTiny, + ProductsTitleBarBar(title: goodSize > 0 ? 'Выберите товар' : 'Выберите категорию',), 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); - } , + child: ListView.separated( + physics: BouncingScrollPhysics(), + itemCount: catSize + goodSize, + itemBuilder: (BuildContext context, int index) { + if (index < catSize) { + Category category = _categories![index]; + return AddCategoryListItem( + name: category.name, + key: Key('category_${category.id}'), + onPress: () => onCategoryPress(category), ); - }, - ), + } + Good good = _goods![index - catSize]; + return AddProductListItem( + key: Key('product_${good.id}'), + ean: good.ean, + name: good.name, + price: good.price, + categoryName: _history?.last?.name, + onPress: () { + onGoodPress(good); + } , + ); + }, separatorBuilder: (BuildContext context, int index) { + return Divider(height: 1.0, color: disableColor,); + }, ), ), @@ -118,18 +117,6 @@ class _AddProductViewState extends State { _navigatorService.pop(); } - List actions() { - return [ - if(_history!.length > 1) - TextButton(onPressed: () { - _history!.removeLast(); - navigateCategory(_history!.last.id!); - }, child: Text('Назад', style: TextStyle(color: Colors.black),),), - - TextButton(onPressed: reset, child: Text('Сбросить', style: TextStyle(color: Colors.black),),) - ]; - } - void reset() { _history = [Category() ..id = 0 diff --git a/lib/views/add_product/component/add_category_list_item.dart b/lib/views/add_product/component/add_category_list_item.dart index b97b2fa..5876fdb 100644 --- a/lib/views/add_product/component/add_category_list_item.dart +++ b/lib/views/add_product/component/add_category_list_item.dart @@ -6,10 +6,9 @@ import 'package:satu/shared/ui_helpers.dart'; class AddCategoryListItem extends StatelessWidget { final String? name; - final bool? isOdd; final Function? onPress; - const AddCategoryListItem({Key? key, this.name, this.isOdd, this.onPress }) : super(key: key); + const AddCategoryListItem({Key? key, this.name, this.onPress }) : super(key: key); @override Widget build(BuildContext context) { @@ -32,7 +31,6 @@ class AddCategoryListItem extends StatelessWidget { ) ), ), - tileColor: !isOdd! ? whiteColor : backgroundColor, trailing: Icon( Icons.arrow_right, color: primaryColor, diff --git a/lib/views/add_product/component/add_product_list_item.dart b/lib/views/add_product/component/add_product_list_item.dart index 559521c..582a322 100644 --- a/lib/views/add_product/component/add_product_list_item.dart +++ b/lib/views/add_product/component/add_product_list_item.dart @@ -1,63 +1,56 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:satu/shared/app_colors.dart'; import 'package:satu/shared/shared_styles.dart'; import 'package:satu/shared/ui_helpers.dart'; +import 'package:satu/widgets/ui/product_title_widget.dart'; class AddProductListItem extends StatelessWidget { - final String? name; + final String name; final String? ean; final String? categoryName; final num? price; final num? count; - final bool? isOdd; + final Function? onPress; - const AddProductListItem({Key? key, this.name, this.ean, this.categoryName, this.price, this.count, this.isOdd, this.onPress}) : super(key: key); + const AddProductListItem({Key? key, required this.name, this.ean, this.categoryName, this.price, this.count, this.onPress}) : super(key: key); @override Widget build(BuildContext context) { - return Card( - child: ListTile( + return Material( + color: Colors.transparent, + child: InkWell( onTap: () => onPress!(), - contentPadding: const EdgeInsets.symmetric( horizontal: 8.0 ,vertical: 4.0 ), - title: Padding( - padding: const EdgeInsets.all(4.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Flexible( - flex: 3, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(name! , style: TextStyle( - fontWeight: FontWeight.w600, color: Colors.black, fontSize: 15), overflow: TextOverflow.ellipsis, maxLines: 2,), - verticalSpaceTiny, - if(ean!=null) - Text('Штрих-код: $ean' , style: TextStyle( - fontWeight: FontWeight.w600, color: Colors.black, fontSize: 12),), - if(categoryName!=null) - Text(categoryName!, style: TextStyle( - fontWeight: FontWeight.w600, color: Colors.black, fontSize: 12),), - ], + child: Container( + decoration: BoxDecoration( + color: whiteColor + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + flex: 3, + child: ProductTitleWidget( name: name, ean: ean, categoryName: categoryName, ), ), - ), - Flexible( - flex: 1, - child: Column( - crossAxisAlignment: CrossAxisAlignment.end, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text('${price} ₸', style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold ),), - ], + Flexible( + flex: 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('${price} ₸', style: TextStyle( fontSize: ScreenUtil().setSp(18.0), fontWeight: FontWeight.bold ),), + ], + ), ), - ), - ], + ], + ), ), ), - tileColor: !isOdd! ? whiteColor : backgroundColor, ), ); } diff --git a/lib/views/add_product/component/app_bar.dart b/lib/views/add_product/component/app_bar.dart deleted file mode 100644 index ed24588..0000000 --- a/lib/views/add_product/component/app_bar.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:satu/core/services/navigator_service.dart'; -import 'package:satu/core/utils/locator.dart'; -import 'package:satu/shared/app_colors.dart'; - -class AddProductAppBar extends StatelessWidget implements PreferredSizeWidget { - final String? title; - final List? actions; - - const AddProductAppBar({Key? key, this.title, this.actions}) : super(key: key); - @override - Widget build(BuildContext context) { - return AppBar( - title: Text(title!, style: const TextStyle(fontWeight: FontWeight.w700, color: Colors.black, fontSize: 25)), - backgroundColor: Colors.transparent, - elevation: 0.0, - actions: actions - , - ); - } - - @override - Size get preferredSize { - return new Size.fromHeight(60.0); - } -} diff --git a/lib/views/settings/setting_view.dart b/lib/views/settings/setting_view.dart index b1c8f5a..2152bec 100644 --- a/lib/views/settings/setting_view.dart +++ b/lib/views/settings/setting_view.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.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/views/work/tabs/component/products_app_bar.dart'; +import 'package:satu/widgets/bar/products_app_bar.dart'; import 'component/setting_item.dart'; diff --git a/lib/views/work/tabs/buy_view.dart b/lib/views/work/tabs/buy_view.dart index 39d9dbe..0f2e137 100644 --- a/lib/views/work/tabs/buy_view.dart +++ b/lib/views/work/tabs/buy_view.dart @@ -3,7 +3,7 @@ import 'package:satu/core/services/navigator_service.dart'; import 'package:satu/core/utils/locator.dart'; import 'package:satu/shared/shared_styles.dart'; -import 'component/products_app_bar.dart'; +import '../../../widgets/bar/products_app_bar.dart'; class BuyView extends StatelessWidget { @override diff --git a/lib/views/work/tabs/component/product_list_item.dart b/lib/views/work/tabs/component/product_list_item.dart index 33a6a55..ffaf16d 100644 --- a/lib/views/work/tabs/component/product_list_item.dart +++ b/lib/views/work/tabs/component/product_list_item.dart @@ -10,9 +10,10 @@ import 'package:satu/shared/app_colors.dart'; import 'package:satu/shared/shared_styles.dart'; import 'package:satu/shared/ui_helpers.dart'; import 'package:satu/views/add_by_barcode/add_by_barcode_view.dart'; +import 'package:satu/widgets/ui/product_title_widget.dart'; class ProductListItem extends StatefulWidget { - final String? name; + final String name; final String? ean; final String? categoryName; final num? price; @@ -21,7 +22,7 @@ class ProductListItem extends StatefulWidget { final int? transactionId; const ProductListItem( - {Key? key, this.name, this.ean, this.categoryName, this.price, this.count, this.isOdd, this.transactionId}) + {Key? key, this.name = '', this.ean, this.categoryName, this.price, this.count, this.isOdd, this.transactionId}) : super(key: key); @override @@ -73,7 +74,7 @@ class _ProductListItemState extends State { print(direction); Redux.store!.dispatch(removeSellItem(transactionId: this.widget.transactionId!)); }, - key: Key(widget.name ?? ''), + key: Key(widget.name ), child: ListTile( //onTap: () => _onItemTapped(context), onTap: () {}, @@ -83,27 +84,7 @@ class _ProductListItemState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.name ?? '', - style: TextStyle(fontSize: 12.sp, color: textColor), - overflow: TextOverflow.ellipsis, - maxLines: 2, - ), - verticalSpaceTiny, - Text( - 'Штрих-код: ${widget.ean}', - style: TextStyle(color: placeholderColor, fontSize: 8.sp), - ), - if (widget.categoryName != null) - Text( - 'Категория: ${widget.categoryName}', - style: TextStyle(color: placeholderColor, fontSize: 8.sp), - ) - ], - ), + child: ProductTitleWidget(name: widget.name, ean: widget.ean, categoryName: widget.categoryName, ), ), SizedBox( width: 100.w, @@ -131,7 +112,7 @@ class _ProductListItemState extends State { }, child: Container( decoration: BoxDecoration( - color: whiteColor, + //color: whiteColor, borderRadius: BorderRadius.circular(ScreenUtil().radius(5)), border: Border.all(width: 1.0.sp, color: successColor)), child: Icon( @@ -171,7 +152,7 @@ class _ProductListItemState extends State { }, child: Container( decoration: BoxDecoration( - color: whiteColor, + //color: whiteColor, borderRadius: BorderRadius.circular(ScreenUtil().radius(5)), border: Border.all( width: 1.0.sp, color: widget.count! <= 1.0 ? disableColor : dangerColor)), @@ -195,3 +176,5 @@ class _ProductListItemState extends State { ); } } + + diff --git a/lib/views/work/tabs/journal_view.dart b/lib/views/work/tabs/journal_view.dart index a190ec4..642ea9d 100644 --- a/lib/views/work/tabs/journal_view.dart +++ b/lib/views/work/tabs/journal_view.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:satu/views/work/tabs/component/products_app_bar.dart'; +import 'package:satu/widgets/bar/products_app_bar.dart'; import 'component/custom_field.dart'; import 'component/option_pill.dart'; diff --git a/lib/views/work/tabs/sell_view.dart b/lib/views/work/tabs/sell_view.dart index 5badf4b..f039ca4 100644 --- a/lib/views/work/tabs/sell_view.dart +++ b/lib/views/work/tabs/sell_view.dart @@ -14,9 +14,9 @@ import 'package:satu/routes/route_names.dart'; import 'package:satu/shared/app_colors.dart'; import 'package:satu/shared/ui_helpers.dart'; import 'package:satu/views/work/tabs/component/product_list_item.dart'; -import 'package:satu/views/work/tabs/component/products_app_bar.dart'; -import 'package:satu/views/work/tabs/component/products_header_bar.dart'; -import 'package:satu/views/work/tabs/component/products_title_bar.dart'; +import 'package:satu/widgets/bar/products_app_bar.dart'; +import 'package:satu/widgets/bar/products_header_bar.dart'; +import 'package:satu/widgets/bar/products_title_bar.dart'; import 'package:satu/views/work/tabs/utils/ProductUtils.dart'; import 'component/contagent_select_bar.dart'; @@ -43,7 +43,7 @@ class SellView extends StatelessWidget { ContragentSelectBar( value: 'Частное лицо', ), - Visibility(child: ProductsTitleBarBar(itemsExist: true), visible: state.items!.isNotEmpty,), + Visibility(child: ProductsTitleBarBar(itemsExist: true, title: 'Товары',), visible: state.items!.isNotEmpty,), ListView.separated( shrinkWrap: true, physics: BouncingScrollPhysics(), diff --git a/lib/views/work/tabs/component/products_app_bar.dart b/lib/widgets/bar/products_app_bar.dart similarity index 96% rename from lib/views/work/tabs/component/products_app_bar.dart rename to lib/widgets/bar/products_app_bar.dart index c0b2cc9..0c55bef 100644 --- a/lib/views/work/tabs/component/products_app_bar.dart +++ b/lib/widgets/bar/products_app_bar.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.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/views/work/tabs/component/products_header_bar.dart'; +import 'package:satu/widgets/bar/products_header_bar.dart'; class ProductsAppBar extends StatelessWidget implements PreferredSizeWidget { final String? title; diff --git a/lib/views/work/tabs/component/products_header_bar.dart b/lib/widgets/bar/products_header_bar.dart similarity index 100% rename from lib/views/work/tabs/component/products_header_bar.dart rename to lib/widgets/bar/products_header_bar.dart diff --git a/lib/views/work/tabs/component/products_title_bar.dart b/lib/widgets/bar/products_title_bar.dart similarity index 90% rename from lib/views/work/tabs/component/products_title_bar.dart rename to lib/widgets/bar/products_title_bar.dart index 46ca634..649b19e 100644 --- a/lib/views/work/tabs/component/products_title_bar.dart +++ b/lib/widgets/bar/products_title_bar.dart @@ -8,8 +8,9 @@ import 'package:satu/widgets/dialog/modal_select_dialog.dart'; class ProductsTitleBarBar extends StatelessWidget { final bool itemsExist; + final String title; - const ProductsTitleBarBar({Key? key, required this.itemsExist}) : super(key: key); + const ProductsTitleBarBar({Key? key, this.itemsExist = false, required this.title}) : super(key: key); @override Widget build(BuildContext context) { @@ -20,9 +21,9 @@ class ProductsTitleBarBar extends StatelessWidget { children: [ Expanded( child: Padding( - padding: EdgeInsets.symmetric( vertical: 16.w ), + padding: EdgeInsets.symmetric( vertical: 10.w ), child: Text( - 'Товары', + title, style: TextStyle(fontSize: ScreenUtil().setSp(14), color: placeholderColor), ), )), diff --git a/lib/widgets/fields/input_field.dart b/lib/widgets/fields/input_field.dart index 3206f06..80cb2b9 100644 --- a/lib/widgets/fields/input_field.dart +++ b/lib/widgets/fields/input_field.dart @@ -54,7 +54,7 @@ class InputField extends StatefulWidget { class _InputFieldState extends State { late bool isPassword; late bool isSearch; - double fieldHeight = 45; + double fieldHeight = 40; @override void initState() { @@ -87,6 +87,29 @@ class _InputFieldState extends State { widget.isReadOnly ? disabledFieldDecoration : fieldDecoration, child: Row( children: [ + GestureDetector( + onTap: () { + if(isSearch) { + widget.fieldFocusNode!.requestFocus(); + } else { + setState(() { + isSearch = !isSearch; + }); + FocusScope.of(context).requestFocus(new FocusNode()); //remove focus + WidgetsBinding.instance!.addPostFrameCallback((_) => widget.controller.clear()); // clear content + } + + }, + child: widget.search + ? Container( + width: fieldHeight, + height: fieldHeight, + alignment: Alignment.center, + child: Icon(isSearch + ? Icons.search + : Icons.search_off, color: placeholderColor)) + : Container(), + ), Expanded( child: TextFormField( style: TextStyle( color: textColor, fontSize: widget.smallVersion ? ScreenUtil().setSp(12) : ScreenUtil().setSp(15) ), @@ -135,28 +158,6 @@ class _InputFieldState extends State { : Icons.visibility_off, color: textColor)) : Container(), ), - GestureDetector( - onTap: () { - if(isSearch) { - widget.fieldFocusNode!.requestFocus(); - } else { - FocusScope.of(context).requestFocus(new FocusNode()); //remove focus - WidgetsBinding.instance!.addPostFrameCallback((_) => widget.controller.clear()); // clear content - } - setState(() { - isSearch = !isSearch; - }); - }, - child: widget.search - ? Container( - width: fieldHeight, - height: fieldHeight, - alignment: Alignment.center, - child: Icon(isSearch - ? Icons.search - : Icons.search_off, color: textColor)) - : Container(), - ), ], ), ), diff --git a/lib/widgets/ui/product_title_widget.dart b/lib/widgets/ui/product_title_widget.dart new file mode 100644 index 0000000..58b0bad --- /dev/null +++ b/lib/widgets/ui/product_title_widget.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:satu/shared/app_colors.dart'; +import 'package:satu/shared/ui_helpers.dart'; +import 'package:satu/views/work/tabs/component/product_list_item.dart'; + +class ProductTitleWidget extends StatelessWidget { + const ProductTitleWidget({Key? key, required this.name, this.ean, this.categoryName}) : super(key: key); + + final String name; + final String? ean; + final String? categoryName; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: TextStyle(fontSize: 12.sp, color: textColor), + overflow: TextOverflow.ellipsis, + maxLines: 2, + ), + verticalSpaceTiny, + if (ean != null) + Text( + 'Штрих-код: ${ean}', + style: TextStyle(color: placeholderColor, fontSize: 8.sp), + ), + if (categoryName != null) + Text( + 'Категория: ${categoryName}', + style: TextStyle(color: placeholderColor, fontSize: 8.sp), + ) + ], + ); + } +}