import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:inventree/api.dart'; import 'package:inventree/inventree/company.dart'; import 'package:inventree/inventree/sentry.dart'; import 'package:inventree/widget/paginator.dart'; import 'package:inventree/widget/refreshable_state.dart'; import 'package:inventree/widget/company_detail.dart'; import '../l10.dart'; class CompanyListWidget extends StatefulWidget { CompanyListWidget(this.title, this.filters, {Key? key}) : super(key: key); String title; Map filters; @override _CompanyListWidgetState createState() => _CompanyListWidgetState(title, filters); } class _CompanyListWidgetState extends RefreshableState { _CompanyListWidgetState(this.title, this.filters); final String title; final Map filters; @override String getAppBarTitle(BuildContext context) => title; @override Widget getBody(BuildContext context) { return PaginatedCompanyList(filters); } } class PaginatedCompanyList extends StatefulWidget { PaginatedCompanyList(this.filters, {this.onTotalChanged}); final Map filters; Function(int)? onTotalChanged; @override _CompanyListState createState() => _CompanyListState(filters, onTotalChanged); } class _CompanyListState extends State { _CompanyListState(this.filters, this.onTotalChanged); static const _pageSize = 25; String _searchTerm = ""; Function(int)? onTotalChanged; final Map filters; final PagingController _pagingController = PagingController(firstPageKey: 0); final TextEditingController searchController = TextEditingController(); @override void initState() { _pagingController.addPageRequestListener((pageKey) { _fetchPage(pageKey); }); super.initState(); } @override void dispose() { _pagingController.dispose(); super.dispose(); } int resultCount = 0; Future _fetchPage(int pageKey) async { try { Map params = filters; params["search"] = _searchTerm; final page = await InvenTreeCompany().listPaginated( _pageSize, pageKey, filters: params); int pageLength = page?.length ?? 0; int pageCount = page?.count ?? 0; final isLastPage = pageLength < _pageSize; List companies = []; if (page != null) { for (var result in page.results) { if (result is InvenTreeCompany) { companies.add(result); } else { print(result.jsondata); } } } if (isLastPage) { _pagingController.appendLastPage(companies); } else { final int nextPageKey = pageKey + pageLength; _pagingController.appendPage(companies, nextPageKey); } if (onTotalChanged != null) { onTotalChanged!(pageCount); } setState(() { resultCount = pageCount; }); } catch (error, stackTrace) { print("Error! - ${error.toString()}"); _pagingController.error = error; sentryReportError(error, stackTrace); } } void updateSearchTerm() { _searchTerm = searchController.text; _pagingController.refresh(); } Widget _buildCompany(BuildContext context, InvenTreeCompany company) { return ListTile( title: Text(company.name), subtitle: Text(company.description), leading: InvenTreeAPI().getImage( company.image, width: 40, height: 40 ), onTap: () async { Navigator.push(context, MaterialPageRoute(builder: (context) => CompanyDetailWidget(company))); }, ); } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.start, children: [ PaginatedSearchWidget(searchController, updateSearchTerm, resultCount), Expanded( child: CustomScrollView( shrinkWrap: true, physics: ClampingScrollPhysics(), scrollDirection: Axis.vertical, slivers: [ PagedSliverList.separated( pagingController: _pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, item, index) { return _buildCompany(context, item); }, noItemsFoundIndicatorBuilder: (context) { return NoResultsWidget(L10().companyNoResults); } ), separatorBuilder: (context, index) => const Divider(height: 1), ) ], ) ) ], ); } }