Files
fcs/lib/pages/carton_search/carton_search.dart

184 lines
5.8 KiB
Dart
Raw Normal View History

2021-01-11 19:35:26 +06:30
import 'package:fcs/domain/constants.dart';
2020-12-10 20:06:15 +06:30
import 'package:fcs/domain/entities/carton.dart';
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/carton/model/carton_model.dart';
2021-01-09 19:11:47 +06:30
import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/widgets/barcode_scanner.dart';
2021-01-11 19:35:26 +06:30
import 'package:fcs/pages/widgets/local_popup_menu_button.dart';
import 'package:fcs/pages/widgets/local_popupmenu.dart';
import 'package:fcs/pages/widgets/local_text.dart';
import 'package:fcs/pages/widgets/popupmenu.dart';
import 'package:fcs/pagination/paginator_listview.dart';
2020-12-10 20:06:15 +06:30
import 'package:flutter/material.dart';
2021-09-10 12:00:08 +06:30
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
2021-01-09 19:11:47 +06:30
import 'package:permission_handler/permission_handler.dart';
2020-12-10 20:06:15 +06:30
import 'package:provider/provider.dart';
import 'carton_list_row.dart';
typedef CallbackCartonSelect(Carton carton);
2021-09-10 12:00:08 +06:30
Future<Carton?> searchCarton(BuildContext context,
{CallbackCartonSelect? callbackCartonSelect}) async =>
2020-12-10 20:06:15 +06:30
await showSearch<Carton>(
context: context,
delegate: PartSearchDelegate(callbackCartonSelect: callbackCartonSelect),
);
class PartSearchDelegate extends SearchDelegate<Carton> {
2021-09-10 12:00:08 +06:30
final CallbackCartonSelect? callbackCartonSelect;
2020-12-10 20:06:15 +06:30
PartSearchDelegate({this.callbackCartonSelect});
@override
2021-01-09 19:11:47 +06:30
String get searchFieldLabel => 'Search by Carton Number';
2020-12-10 20:06:15 +06:30
@override
ThemeData appBarTheme(BuildContext context) {
final ThemeData theme = Theme.of(context);
return theme.copyWith(
inputDecorationTheme: InputDecorationTheme(
hintStyle: TextStyle(
2021-09-10 12:00:08 +06:30
color: theme.primaryTextTheme.caption!.color, fontSize: 14)),
2020-12-10 20:06:15 +06:30
textTheme: theme.textTheme.copyWith(
2021-09-10 12:00:08 +06:30
title: theme.textTheme.title!.copyWith(
color: theme.primaryTextTheme.title!.color, fontSize: 16)),
2020-12-10 20:06:15 +06:30
primaryColor: primaryColor,
);
}
@override
List<Widget> buildActions(BuildContext context) {
2021-01-11 19:35:26 +06:30
var boxModel = Provider.of<CartonModel>(context);
final popupMenu =
StatefulBuilder(builder: (BuildContext context, StateSetter setState) {
return LocalPopupMenuButton(
popmenus: [
LocalPopupMenu(
id: 1,
textKey: "box.weight",
selected: boxModel.selectedIndexFilter == 1),
LocalPopupMenu(
id: 2,
textKey: "box.name",
selected: boxModel.selectedIndexFilter == 2)
],
popupMenuCallback: (p) => setState(() {
boxModel.selectedIndexFilter = p.id;
}));
});
2020-12-10 20:06:15 +06:30
return [
2021-01-09 19:11:47 +06:30
IconButton(
icon: Icon(MaterialCommunityIcons.barcode_scan,
size: 30, color: Colors.white),
onPressed: () => _scan(context),
),
2021-01-11 19:35:26 +06:30
popupMenu,
2020-12-10 20:06:15 +06:30
IconButton(
icon: Icon(Icons.clear),
onPressed: () => query = '',
),
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
2021-09-10 12:00:08 +06:30
onPressed: () => close(context, new Carton()),
2020-12-10 20:06:15 +06:30
);
}
@override
Widget buildResults(BuildContext context) {
final cartonModel = Provider.of<CartonModel>(context);
return FutureBuilder(
future: cartonModel.searchCarton(query),
builder: (context, AsyncSnapshot<List<Carton>> snapshot) {
if (snapshot.hasData) {
2021-09-10 12:00:08 +06:30
if (snapshot.data!.length == 0) {
2020-12-10 20:06:15 +06:30
return Container(
child: Center(
child: Text(
"No result found",
textAlign: TextAlign.center,
),
),
);
}
return Container(
padding: EdgeInsets.only(top: 15),
child: ListView(
2021-09-10 12:00:08 +06:30
children: snapshot.data!
2020-12-10 20:06:15 +06:30
.map((u) => CartonListRow(
2021-01-11 19:35:26 +06:30
key: ValueKey(u.id),
2020-12-10 20:06:15 +06:30
carton: u,
callbackCartonSelect: callbackCartonSelect,
))
.toList(),
),
);
} else if (snapshot.hasError) {
return Container(
child: Center(
child: Text(
'${snapshot.error}',
textAlign: TextAlign.center,
),
),
);
} else {
return Container(
child: Center(
child: CircularProgressIndicator(
valueColor:
new AlwaysStoppedAnimation<Color>(primaryColor)),
),
);
}
});
}
@override
Widget buildSuggestions(BuildContext context) {
2021-01-09 19:11:47 +06:30
final cartonModel = Provider.of<CartonModel>(context);
2021-01-11 19:35:26 +06:30
2020-12-10 20:06:15 +06:30
return Container(
2021-01-09 19:11:47 +06:30
padding: EdgeInsets.only(top: 5),
2021-01-11 19:35:26 +06:30
child: PaginatorListView<Carton>(
paginatorListener: cartonModel.cartonsByFilter,
rowBuilder: (c) => CartonListRow(
key: ValueKey(c.id),
carton: c,
callbackCartonSelect: callbackCartonSelect,
),
color: primaryColor,
2020-12-10 20:06:15 +06:30
),
);
}
2021-01-09 19:11:47 +06:30
_scan(BuildContext context) async {
2021-09-10 12:00:08 +06:30
// PermissionStatus permission =
// await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
// if (permission != PermissionStatus.granted) {
// Map<PermissionGroup, PermissionStatus> permissions =
// await PermissionHandler()
// .requestPermissions([PermissionGroup.camera]);
// if (permissions[PermissionGroup.camera] != PermissionStatus.granted) {
// showMsgDialog(context, "Error", "Camera permission is not granted");
// return null;
// }
// }
2021-01-09 19:11:47 +06:30
try {
String barcode = await scanBarcode();
if (barcode != null) {
query = barcode;
showResults(context);
}
} catch (e) {
print('error: $e');
}
}
2020-12-10 20:06:15 +06:30
}