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';
|
|
|
|
|
import 'package:flutter_icons/flutter_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);
|
|
|
|
|
|
|
|
|
|
Future<Carton> searchCarton(BuildContext context,
|
|
|
|
|
{CallbackCartonSelect callbackCartonSelect}) async =>
|
|
|
|
|
await showSearch<Carton>(
|
|
|
|
|
context: context,
|
|
|
|
|
delegate: PartSearchDelegate(callbackCartonSelect: callbackCartonSelect),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
class PartSearchDelegate extends SearchDelegate<Carton> {
|
|
|
|
|
final CallbackCartonSelect callbackCartonSelect;
|
|
|
|
|
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(
|
|
|
|
|
color: theme.primaryTextTheme.caption.color, fontSize: 14)),
|
|
|
|
|
textTheme: theme.textTheme.copyWith(
|
|
|
|
|
title: theme.textTheme.title.copyWith(
|
|
|
|
|
color: theme.primaryTextTheme.title.color, fontSize: 16)),
|
|
|
|
|
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),
|
|
|
|
|
onPressed: () => close(context, null),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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) {
|
|
|
|
|
if (snapshot.data.length == 0) {
|
|
|
|
|
return Container(
|
|
|
|
|
child: Center(
|
|
|
|
|
child: Text(
|
|
|
|
|
"No result found",
|
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return Container(
|
|
|
|
|
padding: EdgeInsets.only(top: 15),
|
|
|
|
|
child: ListView(
|
|
|
|
|
children: snapshot.data
|
|
|
|
|
.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 {
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
}
|