aman-satu-flutter/lib/views/dictionaries/contragents/contragents_view.dart

142 lines
4.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import 'package:satu/core/models/dictionary/contragent/contragent_response_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';
class ContragentsDictionaryView extends StatefulWidget {
@override
_ContragentsDictionaryViewState createState() =>
_ContragentsDictionaryViewState();
}
class _ContragentsDictionaryViewState extends State<ContragentsDictionaryView> {
final DictionaryService _dictionaryService = locator<DictionaryService>();
final NavigatorService _navigatorService = locator<NavigatorService>();
late TextEditingController _searchTextController;
final FocusNode _searchFocusNode = FocusNode();
late List<ContragentResponseEntity> items = [];
static const _pageSize = 20;
final PagingController<int, ContragentResponseEntity> _pagingController =
PagingController(firstPageKey: 0);
@override
void initState() {
_searchTextController = TextEditingController();
_searchTextController.addListener(() {
if (_searchTextController.text.isNotEmpty) {
//searchByField(_searchTextController.text);
} else {
reset();
}
});
_pagingController.addPageRequestListener((pageKey) {
_fetchData(pageKey, _pageSize, null);
});
super.initState();
}
Future<void> initQuery() async {
//searchByField('');
}
@override
void dispose() {
_searchTextController.dispose();
_searchFocusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ProductsAppBar(
title: 'Контрагенты',
drawerShow: true,
),
body: Column(
children: [
InputField(
placeholder: 'Поиск по наименованию',
search: true,
controller: _searchTextController,
fieldFocusNode: _searchFocusNode,
),
const ProductsTitleBarBar(title: 'Список контрагентов'),
Expanded(
child: PagedListView<int, ContragentResponseEntity>(
pagingController: _pagingController,
builderDelegate:
PagedChildBuilderDelegate<ContragentResponseEntity>(
itemBuilder: (BuildContext context,
ContragentResponseEntity entity, int index) {
return DictionaryTile(
key: Key('contragent_${entity.id}'),
onPress: () async {
final dynamic result = await _navigatorService
.push(contragentEditRoute, arguments: entity);
if (result != null && true == (result as bool)) {
//searchByField('');
}
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
entity.name ?? '',
style: const TextStyle(fontSize: 12, color: textColor),
),
Text('БИН/ИИН: ${entity.biniin}',
style: const TextStyle(
fontSize: 10, color: placeholderColor)),
],
),
);
},
),
))
],
),
floatingActionButton: FloatingActionButton(
elevation: 2,
onPressed: () => locator<NavigatorService>().push(contragentEditRoute,
arguments: ContragentResponseEntity()..refAppCompanyTypeId = 5),
child: const Icon(
Icons.add_rounded,
size: 34.0,
color: whiteColor,
),
),
);
}
void reset() {
_searchTextController.clear();
}
Future<void> _fetchData(int pageKey, int perPage, String? query) async {
final List<ContragentResponseEntity> newItems = await _dictionaryService
.getContragents(page: pageKey, query: query, perpage: perPage);
final isLastPage = newItems.length < _pageSize;
if (isLastPage) {
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + newItems.length;
_pagingController.appendPage(newItems, nextPageKey);
}
}
}