add pickup and fix term
This commit is contained in:
@@ -23,6 +23,7 @@ import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/package/model/package_model.dart';
|
||||
import 'package:fcs/pages/package/package_info.dart';
|
||||
import 'package:fcs/pages/package/package_list.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_list.dart';
|
||||
import 'package:fcs/pages/processing/processing_list.dart';
|
||||
import 'package:fcs/pages/rates/shipment_rates.dart';
|
||||
import 'package:fcs/pages/receiving/receiving_list.dart';
|
||||
@@ -266,6 +267,11 @@ class _HomePageState extends State<HomePage> {
|
||||
forCustomer: false,
|
||||
))));
|
||||
|
||||
final pickupBtnFcs = TaskButton("pickup.title",
|
||||
icon: SimpleLineIcons.direction,
|
||||
btnCallback: () => Navigator.of(context).push<void>(
|
||||
CupertinoPageRoute(builder: (context) => PickupList())));
|
||||
|
||||
final fcsShipmentBtn = TaskButton("FCSshipment.title",
|
||||
icon: Ionicons.ios_airplane,
|
||||
btnCallback: () => Navigator.of(context).push(CupertinoPageRoute(
|
||||
@@ -335,6 +341,7 @@ class _HomePageState extends State<HomePage> {
|
||||
if (user.hasAdmin() || user.hasSupport()) widgetsFcs.add(rateBtnFcs);
|
||||
if (user.hasPackages()) widgetsFcs.add(packagesBtnFcs);
|
||||
if (user.hasShipment()) widgetsFcs.add(shipmentBtnFcs);
|
||||
if (user.hasShipment()) widgetsFcs.add(pickupBtnFcs);
|
||||
if (user.hasInvoices()) widgetsFcs.add(invoicesBtnFcs);
|
||||
|
||||
if (user.hasFcsShipments()) widgetsFcs.add(fcsShipmentBtn);
|
||||
|
||||
30
lib/pages/pickup/model/processing_model.dart
Normal file
30
lib/pages/pickup/model/processing_model.dart
Normal file
@@ -0,0 +1,30 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/domain/entities/processing.dart';
|
||||
import 'package:fcs/pages/main/model/base_model.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
|
||||
class ProcessingModel extends BaseModel {
|
||||
List<Processing> processings = [];
|
||||
final log = Logger('ProcessingModel');
|
||||
|
||||
StreamSubscription<QuerySnapshot>? listener;
|
||||
|
||||
void initUser(user) {
|
||||
super.initUser(user);
|
||||
}
|
||||
|
||||
@override
|
||||
logout() async {
|
||||
if (listener != null) await listener!.cancel();
|
||||
|
||||
processings = [];
|
||||
}
|
||||
|
||||
Future<void> createProcessing(Processing processing) async {}
|
||||
|
||||
Future<void> updateProcessing(Processing processing) async {}
|
||||
}
|
||||
286
lib/pages/pickup/pickup_editor.dart
Normal file
286
lib/pages/pickup/pickup_editor.dart
Normal file
@@ -0,0 +1,286 @@
|
||||
import 'package:fcs/domain/entities/market.dart';
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/domain/entities/user.dart';
|
||||
import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/market/market_editor.dart';
|
||||
import 'package:fcs/pages/market/model/market_model.dart';
|
||||
import 'package:fcs/pages/package/model/package_model.dart';
|
||||
import 'package:fcs/pages/package/tracking_id_page.dart';
|
||||
import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/user_search/user_serach.dart';
|
||||
import 'package:fcs/pages/widgets/display_text.dart';
|
||||
import 'package:fcs/pages/widgets/fcs_id_icon.dart';
|
||||
import 'package:fcs/pages/widgets/input_text.dart';
|
||||
import 'package:fcs/pages/widgets/local_text.dart';
|
||||
import 'package:fcs/pages/widgets/multi_img_controller.dart';
|
||||
import 'package:fcs/pages/widgets/multi_img_file.dart';
|
||||
import 'package:fcs/pages/widgets/progress.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class PickupEditor extends StatefulWidget {
|
||||
final Package? package;
|
||||
PickupEditor({this.package});
|
||||
|
||||
@override
|
||||
_PickupEditorState createState() => _PickupEditorState();
|
||||
}
|
||||
|
||||
class _PickupEditorState extends State<PickupEditor> {
|
||||
TextEditingController _remarkCtl = new TextEditingController();
|
||||
TextEditingController _descCtl = new TextEditingController();
|
||||
|
||||
Package? _package;
|
||||
User? _user;
|
||||
bool _isLoading = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_package = widget.package;
|
||||
selectedMarket = _package!.market ?? "";
|
||||
_descCtl.text = _package!.desc ?? "";
|
||||
_remarkCtl.text = _package!.remark ?? "";
|
||||
multiImgController.setImageUrls = _package!.photoUrls;
|
||||
_user = User(
|
||||
fcsID: _package!.fcsID ?? "",
|
||||
name: _package!.userName ?? "",
|
||||
phoneNumber: _package!.phoneNumber ?? "");
|
||||
}
|
||||
|
||||
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||
|
||||
bool isNew = false;
|
||||
MultiImgController multiImgController = MultiImgController();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var timeBox = Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: 150,
|
||||
child: DisplayText(
|
||||
text: '',
|
||||
labelTextKey: "pickup.time",
|
||||
iconData: Icons.timer,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: 150,
|
||||
child: DisplayText(
|
||||
text: '',
|
||||
labelTextKey: "pickup.time",
|
||||
iconData: Icons.timer,
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
|
||||
final pickupDateBox = DisplayText(
|
||||
text: "12-05-2021",
|
||||
labelTextKey: "pickup.date",
|
||||
iconData: Icons.date_range,
|
||||
);
|
||||
|
||||
final pickupNumberBox = DisplayText(
|
||||
text: "210502-ASDFRE",
|
||||
labelTextKey: "pickup.pickup_number",
|
||||
iconData: SimpleLineIcons.direction,
|
||||
);
|
||||
final completeProcessingBtn = fcsButton(
|
||||
context,
|
||||
getLocalString(context, 'pickup.edit.complete.btn'),
|
||||
callack: _completeProcessing,
|
||||
);
|
||||
final descBox = DisplayText(
|
||||
text: _package!.desc ?? "",
|
||||
labelTextKey: 'processing.desc',
|
||||
iconData: MaterialCommunityIcons.message_text_outline,
|
||||
);
|
||||
final remarkBox = InputText(
|
||||
labelTextKey: 'pickup.remark',
|
||||
iconData: Entypo.new_message,
|
||||
controller: _remarkCtl);
|
||||
|
||||
final img = MultiImageFile(
|
||||
enabled: true,
|
||||
controller: multiImgController,
|
||||
title: "Receipt File",
|
||||
);
|
||||
return LocalProgress(
|
||||
inAsyncCall: _isLoading,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
leading: new IconButton(
|
||||
icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30),
|
||||
onPressed: () {
|
||||
if (isDataChanged()) {
|
||||
showConfirmDialog(context, "back.button_confirm", () {
|
||||
Navigator.of(context).pop();
|
||||
});
|
||||
} else {
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
},
|
||||
),
|
||||
shadowColor: Colors.transparent,
|
||||
backgroundColor: Colors.white,
|
||||
title: LocalText(
|
||||
context,
|
||||
"pickup.edit.title",
|
||||
fontSize: 20,
|
||||
color: primaryColor,
|
||||
),
|
||||
),
|
||||
body: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: ListView(
|
||||
children: [
|
||||
pickupNumberBox,
|
||||
pickupDateBox,
|
||||
timeBox,
|
||||
descBox,
|
||||
remarkBox,
|
||||
img,
|
||||
_package!.status == 'packed'
|
||||
? completeProcessingBtn
|
||||
: Container(),
|
||||
SizedBox(
|
||||
height: 20,
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
String? selectedMarket;
|
||||
Widget marketDropdown() {
|
||||
List<Market> _markets = Provider.of<MarketModel>(context).markets;
|
||||
List<String?> markets = _markets.map((e) => e.name).toList();
|
||||
markets.insert(0, MANAGE_MARKET);
|
||||
if (!markets.contains(selectedMarket)) {
|
||||
markets.insert(0, selectedMarket!);
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(left: 5.0, right: 0),
|
||||
child: Row(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 0, right: 10),
|
||||
child: Icon(Icons.store, color: primaryColor),
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 18.0),
|
||||
child: LocalText(
|
||||
context,
|
||||
"processing.market",
|
||||
color: Colors.black54,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
DropdownButton<String>(
|
||||
isDense: true,
|
||||
value: selectedMarket,
|
||||
style: TextStyle(color: Colors.black, fontSize: 14),
|
||||
underline: Container(
|
||||
height: 1,
|
||||
color: Colors.grey,
|
||||
),
|
||||
onChanged: (String? newValue) {
|
||||
setState(() {
|
||||
if (newValue == MANAGE_MARKET) {
|
||||
selectedMarket = null;
|
||||
_manageMarket();
|
||||
return;
|
||||
}
|
||||
selectedMarket = newValue;
|
||||
});
|
||||
},
|
||||
isExpanded: true,
|
||||
items: markets.map<DropdownMenuItem<String>>((String? value) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: value,
|
||||
child: Text(value ?? "",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: value == MANAGE_MARKET
|
||||
? secondaryColor
|
||||
: primaryColor)),
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
_manageMarket() {
|
||||
Navigator.push<Package>(
|
||||
context,
|
||||
CupertinoPageRoute(builder: (context) => MarketEditor()),
|
||||
);
|
||||
}
|
||||
|
||||
_completeProcessing() async {
|
||||
if (_user!.fcsID == null || _user!.fcsID == "") {
|
||||
showMsgDialog(context, "Error", "Expected FCS-ID");
|
||||
return;
|
||||
}
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
});
|
||||
PackageModel packageModel =
|
||||
Provider.of<PackageModel>(context, listen: false);
|
||||
try {
|
||||
_package!.fcsID = _user!.fcsID;
|
||||
_package!.desc = _descCtl.text;
|
||||
_package!.remark = _remarkCtl.text;
|
||||
_package!.market = selectedMarket!;
|
||||
await packageModel.updateProcessing(_package!,
|
||||
multiImgController.getAddedFile, multiImgController.getDeletedUrl);
|
||||
Navigator.pop(context);
|
||||
} catch (e) {
|
||||
showMsgDialog(context, "Error", e.toString());
|
||||
} finally {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
isDataChanged() {
|
||||
if (isNew) {
|
||||
return _user!.fcsID != "" ||
|
||||
selectedMarket != null ||
|
||||
_descCtl.text != "" ||
|
||||
_remarkCtl.text != "" ||
|
||||
multiImgController.getAddedFile.isNotEmpty;
|
||||
} else {
|
||||
var _package = Package(
|
||||
trackingID: widget.package!.trackingID,
|
||||
fcsID: _user!.fcsID,
|
||||
market: selectedMarket!,
|
||||
desc: _descCtl.text,
|
||||
remark: _remarkCtl.text,
|
||||
photoUrls: widget.package!.photoUrls);
|
||||
return widget.package!.isChangedForEditProcessing(_package) ||
|
||||
multiImgController.getAddedFile.isNotEmpty ||
|
||||
multiImgController.getDeletedUrl.isNotEmpty;
|
||||
}
|
||||
}
|
||||
}
|
||||
253
lib/pages/pickup/pickup_info.dart
Normal file
253
lib/pages/pickup/pickup_info.dart
Normal file
@@ -0,0 +1,253 @@
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/package/model/package_model.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_editor.dart';
|
||||
import 'package:fcs/pages/widgets/display_text.dart';
|
||||
import 'package:fcs/pages/widgets/fcs_id_icon.dart';
|
||||
import 'package:fcs/pages/widgets/local_text.dart';
|
||||
import 'package:fcs/pages/widgets/multi_img_controller.dart';
|
||||
import 'package:fcs/pages/widgets/multi_img_file.dart';
|
||||
import 'package:fcs/pages/widgets/progress.dart';
|
||||
import 'package:fcs/pages/widgets/status_tree.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
final DateFormat dateFormat = DateFormat("d MMM yyyy");
|
||||
|
||||
class PickupInfo extends StatefulWidget {
|
||||
final Package? package;
|
||||
PickupInfo({this.package});
|
||||
|
||||
@override
|
||||
_PickupInfoState createState() => _PickupInfoState();
|
||||
}
|
||||
|
||||
class _PickupInfoState extends State<PickupInfo> {
|
||||
var dateFormatter = new DateFormat('dd MMM yyyy');
|
||||
Package? _package;
|
||||
bool _isLoading = false;
|
||||
MultiImgController multiImgController = MultiImgController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
initPackage(widget.package!);
|
||||
}
|
||||
|
||||
initPackage(Package? package) {
|
||||
if (package == null) return;
|
||||
setState(() {
|
||||
_package = package;
|
||||
multiImgController.setImageUrls = package.photoUrls;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final pickupNumberBox = DisplayText(
|
||||
text: _package != null ? _package!.trackingID : '',
|
||||
labelTextKey: "pickup.pickup_number",
|
||||
iconData: SimpleLineIcons.direction,
|
||||
);
|
||||
var fcsIDBox = DisplayText(
|
||||
text: _package != null ? _package!.fcsID : "",
|
||||
labelTextKey: "pickup.fcs.id",
|
||||
icon: FcsIDIcon(),
|
||||
);
|
||||
final phoneNumberBox = DisplayText(
|
||||
text: _package != null ? _package!.phoneNumber : "",
|
||||
labelTextKey: "pickup.phone",
|
||||
iconData: Icons.phone,
|
||||
);
|
||||
final customerNameBox = DisplayText(
|
||||
text: _package != null ? _package!.userName : "",
|
||||
labelTextKey: "pickup.consignee.name",
|
||||
iconData: Icons.perm_identity,
|
||||
);
|
||||
var senderFcsIDBox = DisplayText(
|
||||
text: _package != null ? _package!.senderFCSID : "",
|
||||
labelTextKey: "pickup.fcs.id",
|
||||
icon: FcsIDIcon(),
|
||||
);
|
||||
final senderPhoneNumberBox = DisplayText(
|
||||
text: _package != null ? _package!.senderPhoneNumber : "",
|
||||
labelTextKey: "pickup.phone",
|
||||
iconData: Icons.phone,
|
||||
);
|
||||
final senderNameBox = DisplayText(
|
||||
text: _package != null ? _package!.senderName : "",
|
||||
labelTextKey: "pickup.shipper.name",
|
||||
iconData: Icons.perm_identity,
|
||||
);
|
||||
final marketBox = DisplayText(
|
||||
text: _package != null ? _package!.market : "-",
|
||||
labelTextKey: "pickup.market",
|
||||
iconData: Icons.store,
|
||||
);
|
||||
final descBox = DisplayText(
|
||||
text: _package != null ? _package!.desc : "-",
|
||||
labelTextKey: "pickup.desc",
|
||||
iconData: MaterialCommunityIcons.message_text_outline,
|
||||
);
|
||||
final remarkBox = DisplayText(
|
||||
text: _package != null ? _package!.remark : "-",
|
||||
labelTextKey: "pickup.remark",
|
||||
iconData: Entypo.new_message,
|
||||
);
|
||||
final img = MultiImageFile(
|
||||
enabled: false,
|
||||
controller: multiImgController,
|
||||
title: "Receipt File",
|
||||
);
|
||||
|
||||
var timeBox = Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
width: 150,
|
||||
child: DisplayText(
|
||||
text: '',
|
||||
labelTextKey: "pickup.time",
|
||||
iconData: Icons.timer,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: 150,
|
||||
child: DisplayText(
|
||||
text: '',
|
||||
labelTextKey: "pickup.time",
|
||||
iconData: Icons.timer,
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
|
||||
final consigneeBox = Container(
|
||||
child: Column(
|
||||
children: [
|
||||
fcsIDBox,
|
||||
phoneNumberBox,
|
||||
customerNameBox,
|
||||
],
|
||||
),
|
||||
);
|
||||
final shipperBox = Container(
|
||||
child: Column(
|
||||
children: [
|
||||
senderFcsIDBox,
|
||||
senderPhoneNumberBox,
|
||||
senderNameBox,
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
final pickupDateBox = DisplayText(
|
||||
text: "12-05-2021",
|
||||
labelTextKey: "pickup.date",
|
||||
iconData: Icons.date_range,
|
||||
);
|
||||
|
||||
return LocalProgress(
|
||||
inAsyncCall: _isLoading,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
leading: new IconButton(
|
||||
icon: new Icon(CupertinoIcons.back, color: primaryColor, size: 30),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
),
|
||||
shadowColor: Colors.transparent,
|
||||
backgroundColor: Colors.white,
|
||||
title: LocalText(
|
||||
context,
|
||||
"pickup.info.title",
|
||||
fontSize: 20,
|
||||
color: primaryColor,
|
||||
),
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
icon: Icon(Icons.delete, color: primaryColor),
|
||||
onPressed: _delete,
|
||||
),
|
||||
IconButton(
|
||||
icon: Icon(Icons.edit, color: primaryColor),
|
||||
onPressed: _gotoEditor,
|
||||
),
|
||||
],
|
||||
),
|
||||
body: Card(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(10.0),
|
||||
child: ListView(children: <Widget>[
|
||||
pickupNumberBox,
|
||||
pickupDateBox,
|
||||
timeBox,
|
||||
descBox,
|
||||
remarkBox,
|
||||
_package!.photoUrls.length == 0 ? Container() : img,
|
||||
StatusTree(
|
||||
shipmentHistory: _package!.shipmentHistory,
|
||||
currentStatus: _package!.status ?? ""),
|
||||
SizedBox(
|
||||
height: 20,
|
||||
)
|
||||
]),
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
_delete() {
|
||||
showConfirmDialog(context, "pickup.delete.confirm", _deletePackage);
|
||||
}
|
||||
|
||||
_deletePackage() async {
|
||||
setState(() {
|
||||
_isLoading = true;
|
||||
});
|
||||
PackageModel packageModel =
|
||||
Provider.of<PackageModel>(context, listen: false);
|
||||
try {
|
||||
await packageModel.deleteProcessing(_package!);
|
||||
Navigator.pop<bool>(context, true);
|
||||
} catch (e) {
|
||||
showMsgDialog(context, "Error", e.toString());
|
||||
} finally {
|
||||
setState(() {
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
_gotoEditor() async {
|
||||
bool? deleted = await Navigator.push<bool>(
|
||||
context,
|
||||
CupertinoPageRoute(
|
||||
builder: (context) => PickupEditor(
|
||||
package: widget.package,
|
||||
)));
|
||||
if (deleted ?? false) {
|
||||
Navigator.pop(context);
|
||||
} else {
|
||||
PackageModel packageModel =
|
||||
Provider.of<PackageModel>(context, listen: false);
|
||||
Package? p = await packageModel.getPackage(_package!.id!);
|
||||
initPackage(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
86
lib/pages/pickup/pickup_list.dart
Normal file
86
lib/pages/pickup/pickup_list.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/package/model/package_model.dart';
|
||||
import 'package:fcs/pages/package_search/package_serach.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_editor.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_info.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_list_row.dart';
|
||||
import 'package:fcs/pages/widgets/local_text.dart';
|
||||
import 'package:fcs/pages/widgets/progress.dart';
|
||||
import 'package:fcs/pagination/paginator_listview.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class PickupList extends StatefulWidget {
|
||||
@override
|
||||
_PickupListState createState() => _PickupListState();
|
||||
}
|
||||
|
||||
class _PickupListState extends State<PickupList> {
|
||||
bool _isLoading = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var packageModel = Provider.of<PackageModel>(context);
|
||||
var packages = packageModel.activePackages;
|
||||
|
||||
return LocalProgress(
|
||||
inAsyncCall: _isLoading,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
centerTitle: true,
|
||||
leading: new IconButton(
|
||||
icon: new Icon(CupertinoIcons.back),
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
),
|
||||
backgroundColor: primaryColor,
|
||||
title: LocalText(
|
||||
context,
|
||||
"pickup.title",
|
||||
fontSize: 20,
|
||||
color: Colors.white,
|
||||
),
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
icon: Icon(
|
||||
Icons.search,
|
||||
color: Colors.white,
|
||||
),
|
||||
iconSize: 30,
|
||||
onPressed: () => searchPackage(context,
|
||||
callbackPackageSelect: _searchCallback),
|
||||
),
|
||||
],
|
||||
),
|
||||
body: PaginatorListView<Package>(
|
||||
paginatorListener: packages!,
|
||||
rowBuilder: (p) => PickupListRow(
|
||||
key: ValueKey(p.id),
|
||||
package: p,
|
||||
),
|
||||
color: primaryColor,
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
_searchCallback(Package package) async {
|
||||
var packageModel = Provider.of<PackageModel>(context, listen: false);
|
||||
Package? _package = await packageModel.getPackage(package.id!);
|
||||
if (_package == null) return;
|
||||
Navigator.push(
|
||||
context,
|
||||
CupertinoPageRoute(builder: (context) => PickupInfo(package: _package)),
|
||||
);
|
||||
}
|
||||
}
|
||||
101
lib/pages/pickup/pickup_list_row.dart
Normal file
101
lib/pages/pickup/pickup_list_row.dart
Normal file
@@ -0,0 +1,101 @@
|
||||
import 'package:fcs/domain/entities/package.dart';
|
||||
import 'package:fcs/helpers/theme.dart';
|
||||
import 'package:fcs/pages/main/util.dart';
|
||||
import 'package:fcs/pages/pickup/pickup_info.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_vector_icons/flutter_vector_icons.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
typedef CallbackPackageSelect(Package package);
|
||||
|
||||
class PickupListRow extends StatelessWidget {
|
||||
final Package? package;
|
||||
final CallbackPackageSelect? callbackPackageSelect;
|
||||
final double dotSize = 15.0;
|
||||
final DateFormat dateFormat = new DateFormat("dd MMM yyyy");
|
||||
|
||||
PickupListRow({Key? key, this.package, this.callbackPackageSelect})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
if (callbackPackageSelect != null) {
|
||||
callbackPackageSelect!(package!);
|
||||
return;
|
||||
}
|
||||
Navigator.push(
|
||||
context,
|
||||
CupertinoPageRoute(
|
||||
builder: (context) => PickupInfo(package: package)),
|
||||
);
|
||||
},
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(left: 15, right: 15),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: new Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 16.0),
|
||||
child: new Row(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: EdgeInsets.only(left: 5, right: 10),
|
||||
child: Icon(
|
||||
SimpleLineIcons.direction,
|
||||
color: primaryColor,
|
||||
size: 30,
|
||||
),
|
||||
),
|
||||
new Expanded(
|
||||
child: new Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8.0),
|
||||
child: new Text(
|
||||
package!.id == null ? '' : package!.trackingID!,
|
||||
style: new TextStyle(
|
||||
fontSize: 15.0, color: Colors.black),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 8.0),
|
||||
child: new Text(
|
||||
package!.market == null ? '' : package!.market!,
|
||||
style: new TextStyle(
|
||||
fontSize: 15.0, color: Colors.black),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Column(
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(3.0),
|
||||
child: getStatus(package!.status ?? ""),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(0),
|
||||
child: new Text(
|
||||
package!.currentStatusDate != null
|
||||
? dateFormat.format(package!.currentStatusDate!)
|
||||
: '',
|
||||
style: new TextStyle(fontSize: 15.0, color: Colors.grey),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -10,12 +10,13 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_icons_null_safety/flutter_icons_null_safety.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:zefyrka/zefyrka.dart';
|
||||
// import 'package:zefyr/zefyr.dart';
|
||||
|
||||
typedef void ProfileCallback();
|
||||
|
||||
class TermEdit extends StatefulWidget {
|
||||
final Term term;
|
||||
final Term? term;
|
||||
TermEdit({required this.term});
|
||||
@override
|
||||
_TermEditState createState() => _TermEditState();
|
||||
@@ -23,12 +24,12 @@ class TermEdit extends StatefulWidget {
|
||||
|
||||
class _TermEditState extends State<TermEdit> {
|
||||
/// Allows to control the editor and the document.
|
||||
// ZefyrController _controllerEng;
|
||||
// ZefyrController _controllerMm;
|
||||
late ZefyrController _controllerEng;
|
||||
late ZefyrController _controllerMm;
|
||||
|
||||
/// Zefyr editor like any other input field requires a focus node.
|
||||
// FocusNode _focusNodeEng;
|
||||
// FocusNode _focusNodeMm;
|
||||
late FocusNode _focusNodeEng;
|
||||
late FocusNode _focusNodeMm;
|
||||
bool _isLoading = false;
|
||||
|
||||
@override
|
||||
@@ -37,23 +38,23 @@ class _TermEditState extends State<TermEdit> {
|
||||
_isLoading = false;
|
||||
|
||||
// Here we must load the document and pass it to Zefyr controller.
|
||||
// _controllerEng = ZefyrController(_loadDocument(widget.term.termEng));
|
||||
// _controllerMm = ZefyrController(_loadDocument(widget.term.termMm));
|
||||
// _focusNodeEng = FocusNode();
|
||||
// _focusNodeMm = FocusNode();
|
||||
_controllerEng = ZefyrController(_loadDocument(widget.term!.termEng ?? ""));
|
||||
_controllerMm = ZefyrController(_loadDocument(widget.term!.termMm ?? ""));
|
||||
_focusNodeEng = FocusNode();
|
||||
_focusNodeMm = FocusNode();
|
||||
}
|
||||
|
||||
/// Loads the document to be edited in Zefyr.
|
||||
// NotusDocument _loadDocument(String data) {
|
||||
// NotusDocument doc;
|
||||
// try {
|
||||
// doc = NotusDocument.fromJson(jsonDecode(data));
|
||||
// } catch (e) {}
|
||||
// if (doc == null) {
|
||||
// doc = NotusDocument();
|
||||
// }
|
||||
// return doc;
|
||||
// }
|
||||
NotusDocument _loadDocument(String data) {
|
||||
late NotusDocument doc;
|
||||
try {
|
||||
doc = NotusDocument.fromJson(jsonDecode(data));
|
||||
} catch (e) {}
|
||||
if (doc == null) {
|
||||
doc = NotusDocument();
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -116,8 +117,8 @@ class _TermEditState extends State<TermEdit> {
|
||||
height: MediaQuery.of(context).size.height - 200,
|
||||
child: TabBarView(
|
||||
children: [
|
||||
// textEditor(_controllerEng, _focusNodeEng),
|
||||
// textEditor(_controllerMm, _focusNodeMm),
|
||||
textEditor(_controllerEng, _focusNodeEng),
|
||||
textEditor(_controllerMm, _focusNodeMm),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -129,35 +130,24 @@ class _TermEditState extends State<TermEdit> {
|
||||
);
|
||||
}
|
||||
|
||||
// Widget textEditor(ZefyrController controller, FocusNode focusNode) {
|
||||
// return ListView(
|
||||
// children: [
|
||||
// Container(
|
||||
// height: MediaQuery.of(context).size.height - 200,
|
||||
// child: ZefyrScaffold(
|
||||
// child: ZefyrTheme(
|
||||
// data: ZefyrThemeData().copyWith(
|
||||
// defaultLineTheme: LineTheme(
|
||||
// padding: EdgeInsets.all(0),
|
||||
// textStyle: TextStyle(fontFamily: "Myanmar3"),
|
||||
// ),
|
||||
// ),
|
||||
// child: ZefyrEditor(
|
||||
// autofocus: false,
|
||||
// padding: EdgeInsets.all(16),
|
||||
// controller: controller,
|
||||
// focusNode: focusNode,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// // savebtn,
|
||||
// SizedBox(
|
||||
// height: 10,
|
||||
// )
|
||||
// ],
|
||||
// );
|
||||
// }
|
||||
Widget textEditor(ZefyrController controller, FocusNode focusNode) {
|
||||
return ListView(
|
||||
children: [
|
||||
Container(
|
||||
height: MediaQuery.of(context).size.height - 200,
|
||||
child: ZefyrEditor(
|
||||
autofocus: false,
|
||||
padding: EdgeInsets.all(16),
|
||||
controller: controller,
|
||||
focusNode: focusNode,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 10,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
_unfocus() {
|
||||
FocusScope.of(context).unfocus();
|
||||
@@ -168,11 +158,11 @@ class _TermEditState extends State<TermEdit> {
|
||||
_isLoading = true;
|
||||
});
|
||||
try {
|
||||
// final contentsEng = jsonEncode(_controllerEng.document);
|
||||
// final contentsMm = jsonEncode(_controllerMm.document);
|
||||
final contentsEng = jsonEncode(_controllerEng.document);
|
||||
final contentsMm = jsonEncode(_controllerMm.document);
|
||||
// print('contents => $contentsEng');
|
||||
// TermModel termModel = Provider.of<TermModel>(context, listen: false);
|
||||
// await termModel.saveTerm(Term(termEng: contentsEng, termMm: contentsMm));
|
||||
TermModel termModel = Provider.of<TermModel>(context, listen: false);
|
||||
await termModel.saveTerm(Term(termEng: contentsEng, termMm: contentsMm));
|
||||
} catch (e) {
|
||||
showMsgDialog(context, "Error", e.toString());
|
||||
} finally {
|
||||
|
||||
@@ -10,7 +10,7 @@ import 'package:fcs/pages/widgets/local_text.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
// import 'package:zefyr/zefyr.dart';
|
||||
import 'package:zefyrka/zefyrka.dart';
|
||||
|
||||
typedef void ProfileCallback();
|
||||
|
||||
@@ -23,29 +23,29 @@ class TermPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _TermPageState extends State<TermPage> {
|
||||
// ZefyrController _controller;
|
||||
// FocusNode _focusNode;
|
||||
// NotusDocument document = new NotusDocument();
|
||||
late ZefyrController _controller;
|
||||
late FocusNode _focusNode;
|
||||
late NotusDocument document = new NotusDocument();
|
||||
bool isLoading = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
// _focusNode = FocusNode();
|
||||
_focusNode = FocusNode();
|
||||
}
|
||||
|
||||
// NotusDocument _loadDocument(Setting setting) {
|
||||
// bool isEng = Provider.of<LanguageModel>(context).isEng;
|
||||
// String term = isEng ? setting.termsEng : setting.termsMm;
|
||||
// NotusDocument doc;
|
||||
// try {
|
||||
// doc = NotusDocument.fromJson(jsonDecode(term));
|
||||
// } catch (e) {}
|
||||
// if (doc == null) {
|
||||
// doc = NotusDocument();
|
||||
// }
|
||||
// return doc;
|
||||
// }
|
||||
NotusDocument _loadDocument(Setting? setting) {
|
||||
bool isEng = Provider.of<LanguageModel>(context).isEng;
|
||||
String? term = isEng ? (setting!.termsEng ?? "") : (setting!.termsMm ?? "");
|
||||
late NotusDocument doc;
|
||||
try {
|
||||
doc = NotusDocument.fromJson(jsonDecode(term));
|
||||
} catch (e) {}
|
||||
if (doc == null) {
|
||||
doc = NotusDocument();
|
||||
}
|
||||
return doc;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -79,31 +79,17 @@ class _TermPageState extends State<TermPage> {
|
||||
TermEdit(term: Term.fromSetting(setting!)),
|
||||
)),
|
||||
icon: Icon(
|
||||
CupertinoIcons.pen,
|
||||
Icons.edit,
|
||||
color: primaryColor,
|
||||
))
|
||||
]
|
||||
: [],
|
||||
),
|
||||
// body: ZefyrTheme(
|
||||
// data: ZefyrThemeData().copyWith(
|
||||
// defaultLineTheme: LineTheme(
|
||||
// padding: EdgeInsets.all(0),
|
||||
// textStyle: TextStyle(fontFamily: "Myanmar3"),
|
||||
// ),
|
||||
// ),
|
||||
// // data: ZefyrThemeData().copyWith(
|
||||
// // defaultLineTheme: LineTheme(
|
||||
// // textStyle: TextStyle(color: Colors.black),
|
||||
// // padding: EdgeInsets.all(0))),
|
||||
// child: ZefyrScaffold(
|
||||
// child: ZefyrEditor(
|
||||
// mode: ZefyrMode.view,
|
||||
// padding: EdgeInsets.all(16),
|
||||
// controller: ZefyrController(_loadDocument(setting)),
|
||||
// focusNode: _focusNode,
|
||||
// ),
|
||||
// )),
|
||||
body: ZefyrEditor(
|
||||
padding: EdgeInsets.all(16),
|
||||
controller: ZefyrController(_loadDocument(setting)),
|
||||
focusNode: _focusNode,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user