diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 850babd..fd0f4b6 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -11,6 +11,8 @@ "btn.select":"Select", "btn.cancel":"Cancel", "btn.ok": "Ok", + "feet":"Feet", + "inch":"Inch", "Buttons End ================================================================":"", "Offline Start ================================================================":"", @@ -294,23 +296,24 @@ "Shipment Start ================================================================":"", "shipment": "Shipments", "shipment.title": "Shipments", - "shipment.new": "Request Shipment", + "shipment.new": "Request shipment", "shipment.new.title": "New Shipment", "shipment.edit.title": "Edit Shipment", - "shipment.type": "Pickup/Drop-off", - "shipment.date": "Pickup Date", - "shipment.time": "Pickup Time", - "shipment.location": "Pickup Location", + "shipment.type": "Pickup/drop-off", + "shipment.date": "Pickup date", + "shipment.date.time": "Pickup date/time", + "shipment.time": "Pickup time", + "shipment.location": "Pickup address", "shipment.location_time": "Pickup Location / Time", - "shipment.information": "Pickup Informations", + "shipment.information": "Pickup information", "shipment.recipient_information": "Recipient Informations", - "shipment.from":"From", - "shipment.to":"To", + "shipment.from":"Ready time", + "shipment.to":"Latest time available", "shipment.box.delivery":"Delivery Address", "shipment.handling.fee":"Handling Fee/Courier Fee", "shipment.box.cargo.type":"Cargo Types", "shipment.box.dimemsion":"Dimension", - "shipment.box.shipment.weight":"Shipment Weight", + "shipment.box.shipment.weight":"Shipment weight", "shipment.box.length":"Length", "shipment.box.width":"Width", "shipment.box.height":"Height", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index f9c49f6..8c17fb8 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -10,6 +10,8 @@ "btn.select":"ရွေးချယ်ပါ", "btn.cancel":"မလုပ်နဲ့", "btn.ok": "အိုကေ", + "feet":"ပေ", + "inch":"လက်မ", "Buttons End ================================================================":"", "Offline Start ================================================================":"", @@ -298,11 +300,12 @@ "shipment.new.title": "ပို့ဆောင်ခြင်း အသစ်", "shipment.edit.title": "ပို့ဆောင်ခြင်း ပြင်ဆင်ခြင်း", "shipment.type": "Pickup/Drop-off", - "shipment.date": "Pickup Date", + "shipment.date": "Pickup date", + "shipment.date.time": "Pickup date/time", "shipment.time": "Pickup Time", "shipment.location_time": "Pickup Location / Time", - "shipment.location": "Pickup Location", - "shipment.information": "Pickup Informations", + "shipment.location": "Pickup location", + "shipment.information": "Pickup informations", "shipment.recipient_information": "Recipient Informations", "shipment.from":"From", "shipment.to":"To", @@ -310,7 +313,7 @@ "shipment.handling.fee":"Handling Fee/Courier Fee", "shipment.box.cargo.type":"Cargo Types", "shipment.box.dimemsion":"Dimension", - "shipment.box.shipment.weight":"Shipment Weight", + "shipment.box.shipment.weight":"Shipment weight", "shipment.box.length":"Length", "shipment.box.width":"Width", "shipment.box.height":"Height", @@ -437,4 +440,6 @@ "processing.edit.sub_title":"မွမ်းမံခြင်း", "processing.edit.complete.btn":"မွမ်းမံခြင်း ပြီးဆုံးသည်", "Processing End ================================================================":"" + + } \ No newline at end of file diff --git a/lib/pages/delivery_address/delivery_address_row.dart b/lib/pages/delivery_address/delivery_address_row.dart index b601d0b..e596213 100644 --- a/lib/pages/delivery_address/delivery_address_row.dart +++ b/lib/pages/delivery_address/delivery_address_row.dart @@ -27,7 +27,7 @@ class DeliveryAddressRow extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ line(context, deliveryAddress.fullName, - iconData: MaterialCommunityIcons.account_arrow_left, + iconData: MaterialCommunityIcons.account, color: primaryColor, fontSize: 16), line(context, deliveryAddress.phoneNumber, diff --git a/lib/pages/package/package_info.dart b/lib/pages/package/package_info.dart index 6185a19..d28b718 100644 --- a/lib/pages/package/package_info.dart +++ b/lib/pages/package/package_info.dart @@ -9,6 +9,7 @@ import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/delivery_address_selection.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'; @@ -72,6 +73,11 @@ class _PackageInfoState extends State { labelTextKey: "package.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); + var fcsIDBox = DisplayText( + text: _package.fcsID, + labelTextKey: "processing.fcs.id", + icon: FcsIDIcon(), + ); final customerNameBox = DisplayText( text: _package.userName, labelTextKey: "package.create.name", @@ -145,16 +151,19 @@ class _PackageInfoState extends State { padding: const EdgeInsets.all(10.0), child: ListView(children: [ trackingIdBox, + widget.isSearchResult ? Container() : fcsIDBox, widget.isSearchResult ? Container() : customerNameBox, widget.isSearchResult ? Container() : marketBox, statusBox, _package.photoUrls.length == 0 ? Container() : img, widget.isSearchResult ? Container() : descBox, remarkBox, - deliveryAddressBox, - StatusTree( - shipmentHistory: _package.shipmentHistory, - currentStatus: _package.currentStatus), + widget.isSearchResult ? Container() : deliveryAddressBox, + widget.isSearchResult + ? Container() + : StatusTree( + shipmentHistory: _package.shipmentHistory, + currentStatus: _package.currentStatus), SizedBox( height: 20, ) diff --git a/lib/pages/processing/processing_info.dart b/lib/pages/processing/processing_info.dart index f250adb..aa748e7 100644 --- a/lib/pages/processing/processing_info.dart +++ b/lib/pages/processing/processing_info.dart @@ -4,6 +4,7 @@ import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/widgets/bottom_up_page_route.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'; @@ -57,6 +58,16 @@ class _ProcessingInfoState extends State { labelTextKey: "processing.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); + var fcsIDBox = DisplayText( + text: _package.fcsID, + labelTextKey: "processing.fcs.id", + icon: FcsIDIcon(), + ); + final phoneNumberBox = DisplayText( + text: _package.phoneNumber, + labelTextKey: "processing.phone", + iconData: Icons.phone, + ); final customerNameBox = DisplayText( text: _package.userName, labelTextKey: "processing.name", @@ -119,11 +130,13 @@ class _ProcessingInfoState extends State { padding: const EdgeInsets.all(10.0), child: ListView(children: [ trackingIdBox, + fcsIDBox, customerNameBox, + phoneNumberBox, marketBox, - _package.photoUrls.length == 0 ? Container() : img, descBox, remarkBox, + _package.photoUrls.length == 0 ? Container() : img, StatusTree( shipmentHistory: _package.shipmentHistory, currentStatus: _package.currentStatus), diff --git a/lib/pages/receiving/receiving_editor.dart b/lib/pages/receiving/receiving_editor.dart index f51805a..3cb8514 100644 --- a/lib/pages/receiving/receiving_editor.dart +++ b/lib/pages/receiving/receiving_editor.dart @@ -77,17 +77,28 @@ class _ReceivingEditorState extends State { final trackingIDBox = Container( padding: EdgeInsets.only(left: 6), child: Row( - mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, children: [ Expanded( child: InputText( + iconData: MaterialCommunityIcons.barcode_scan, labelTextKey: "receiving.tracking.id", controller: _trackingIDCtl, )), - IconButton( - icon: Icon(MaterialCommunityIcons.barcode_scan, - color: primaryColor), - onPressed: _scan, + InkWell( + onTap: _scan, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Icon( + MaterialCommunityIcons.barcode_scan, + color: primaryColor, + ), + Text("Scan") + ], + ), + ), ), ], )); @@ -106,11 +117,6 @@ class _ReceivingEditorState extends State { labelTextKey: "receiving.name", iconData: Icons.person, ); - final phoneNumberBox = DisplayText( - text: user != null ? user.phoneNumber : "", - labelTextKey: "receiving.phone", - iconData: Icons.phone, - ); final createButton = fcsButton( context, @@ -150,13 +156,12 @@ class _ReceivingEditorState extends State { SizedBox( height: 10, ), - img, remarkBox, + img, SizedBox( height: 10, ), fcsIDBox, - phoneNumberBox, namebox, SizedBox( height: 20, diff --git a/lib/pages/receiving/receiving_info.dart b/lib/pages/receiving/receiving_info.dart index 407abcb..916bd74 100644 --- a/lib/pages/receiving/receiving_info.dart +++ b/lib/pages/receiving/receiving_info.dart @@ -6,6 +6,7 @@ import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/package_editor.dart'; import 'package:fcs/pages/widgets/bottom_up_page_route.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'; @@ -62,6 +63,11 @@ class _ReceivingInfoState extends State { labelTextKey: "package.tracking.id", iconData: MaterialCommunityIcons.barcode_scan, ); + var fcsIDBox = DisplayText( + text: _package.fcsID, + labelTextKey: "processing.fcs.id", + icon: FcsIDIcon(), + ); final customerNameBox = DisplayText( text: _package.userName, labelTextKey: "package.create.name", @@ -116,9 +122,10 @@ class _ReceivingInfoState extends State { padding: const EdgeInsets.all(10.0), child: ListView(children: [ trackingIdBox, - _package.userID != null ? customerNameBox : Container(), - _package.photoUrls.length == 0 ? Container() : img, + fcsIDBox, + customerNameBox, remarkBox, + _package.photoUrls.length == 0 ? Container() : img, StatusTree( shipmentHistory: _package.shipmentHistory, currentStatus: _package.currentStatus), diff --git a/lib/pages/shipment/shipment_box_editor.dart b/lib/pages/shipment/shipment_box_editor.dart index c26b8bd..9bfa4fb 100644 --- a/lib/pages/shipment/shipment_box_editor.dart +++ b/lib/pages/shipment/shipment_box_editor.dart @@ -1,23 +1,20 @@ import 'package:fcs/domain/entities/box.dart'; import 'package:fcs/domain/entities/cargo.dart'; -import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/vo/delivery_address.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/box/cargo_type_editor.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_list.dart'; -import 'package:fcs/pages/delivery_address/delivery_address_row.dart'; import 'package:fcs/pages/delivery_address/model/delivery_address_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/pages/widgets/defalut_delivery_address.dart'; import 'package:fcs/pages/widgets/delivery_address_selection.dart'; import 'package:fcs/pages/widgets/display_text.dart'; -import 'package:fcs/pages/widgets/input_text.dart'; +import 'package:fcs/pages/widgets/length_picker.dart'; import 'package:fcs/pages/widgets/local_button.dart'; import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/my_data_table.dart'; import 'package:fcs/pages/widgets/progress.dart'; -import 'package:fcs/pages/widgets/title_with_add_button.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:provider/provider.dart'; @@ -38,11 +35,10 @@ class _ShipmentBoxEditorState extends State { Box _box; bool _isLoading = false; bool _isNew; - bool isMixBox = false; - DeliveryAddress _deliveryAddress = new DeliveryAddress(); - double volumetricRatio; - double shipmentWeight; - List cargos; + DeliveryAddress _deliveryAddress; + double volumetricRatio = 0; + double shipmentWeight = 0; + List cargos = []; @override void initState() { @@ -50,13 +46,10 @@ class _ShipmentBoxEditorState extends State { volumetricRatio = Provider.of(context, listen: false).setting.volumetricRatio; - shipmentWeight = 0; - cargos = []; if (widget.box != null) { _box = widget.box; _deliveryAddress = _box.shippingAddress; - _isNew = false; } else { var shipmentModel = @@ -65,6 +58,9 @@ class _ShipmentBoxEditorState extends State { _isNew = true; _box = Box(); + _lengthCtl.text = "0"; + _widthCtl.text = "0"; + _heightCtl.text = "0"; } _lengthCtl.addListener(_calShipmentWeight); _widthCtl.addListener(_calShipmentWeight); @@ -75,6 +71,7 @@ class _ShipmentBoxEditorState extends State { double l = double.parse(_lengthCtl.text, (s) => 0); double w = double.parse(_widthCtl.text, (s) => 0); double h = double.parse(_heightCtl.text, (s) => 0); + print("$l $w $h"); setState(() { shipmentWeight = l * w * h / volumetricRatio; }); @@ -82,30 +79,35 @@ class _ShipmentBoxEditorState extends State { @override Widget build(BuildContext context) { - double iconSize = 32; - final shipmentWeightBox = DisplayText( labelTextKey: "shipment.box.shipment.weight", text: shipmentWeight == null ? "" : shipmentWeight.toStringAsFixed(0), iconData: MaterialCommunityIcons.weight, ); - final lengthBox = InputText( - labelTextKey: "shipment.box.length", + + final lengthBox = LengthPicker( controller: _lengthCtl, - textInputType: TextInputType.number, - iconData: FontAwesome.arrow_circle_right, + lableKey: "shipment.box.length", ); - final widthBox = InputText( - labelTextKey: "shipment.box.width", + final widthBox = LengthPicker( controller: _widthCtl, - textInputType: TextInputType.number, - iconData: FontAwesome.arrow_circle_left, + lableKey: "shipment.box.width", ); - final heightBox = InputText( - labelTextKey: "shipment.box.height", + final heightBox = LengthPicker( controller: _heightCtl, - textInputType: TextInputType.number, - iconData: FontAwesome.arrow_circle_up, + lableKey: "shipment.box.height", + ); + final dimBox = Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon(FontAwesome.arrow_circle_right, color: primaryColor), + ), + SizedBox(child: lengthBox, width: 80), + SizedBox(child: widthBox, width: 80), + SizedBox(child: heightBox, width: 80), + ], ); final createBtn = LocalButton( textKey: "shipment.box.add", @@ -135,18 +137,19 @@ class _ShipmentBoxEditorState extends State { padding: const EdgeInsets.all(8.0), child: ListView( children: [ - TitleWithAddButton( - iconData: MaterialCommunityIcons.briefcase_check, - titleKey: "shipment.box.cargo.type", - onTap: () async { - Cargo cargo = await Navigator.push( - context, BottomUpPageRoute(CargoTypeEditor())); - if (cargo != null) { - setState(() { - cargos.add(cargo); - }); - } - }), + LocalTitle( + textKey: "shipment.box.cargo.type", + trailing: IconButton( + icon: Icon( + Icons.add_circle, + color: primaryColor, + ), + onPressed: () async { + Cargo cargo = await Navigator.push( + context, BottomUpPageRoute(CargoTypeEditor())); + _addCargo(cargo); + }), + ), MyDataTable( headingRowHeight: 40, columns: [ @@ -170,13 +173,10 @@ class _ShipmentBoxEditorState extends State { SizedBox( height: 30, ), - TitleWithAddButton( - titleKey: "shipment.box.dimemsion", - ), + LocalTitle(textKey: "shipment.box.dimemsion"), + dimBox, shipmentWeightBox, - lengthBox, - widthBox, - heightBox, + LocalTitle(textKey: "shipment.box.delivery"), DefaultDeliveryAddress( deliveryAddress: _deliveryAddress, onTap: () async { @@ -199,82 +199,6 @@ class _ShipmentBoxEditorState extends State { ); } - List getRows(BuildContext context) { - if (cargos == null || cargos == null) { - return []; - } - int total = 0; - var rows = cargos.map((c) { - total += c.weight; - return TableRow( - children: [ - Text( - c.type == null ? "" : c.type, - style: textStyle, - ), - Align( - alignment: Alignment.centerRight, - child: Text(c.weight == null ? "0" : c.weight.toString(), - style: textStyle)), - IconButton(icon: Icon(Icons.remove), onPressed: () => {}) - ], - ); - }).toList(); - - var totalRow = TableRow( - children: [ - Align( - alignment: Alignment.centerRight, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text("Total Weight", - style: TextStyle( - fontWeight: FontWeight.bold, - )), - ), - ), - Align( - alignment: Alignment.centerRight, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text(total.toString(), - style: TextStyle(fontWeight: FontWeight.bold)), - )), - Container( - width: 50, - child: - new Text(" ", style: TextStyle(fontWeight: FontWeight.bold))), - ], - ); - rows.add(totalRow); - rows.insert( - 0, - TableRow(children: [ - Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: LocalText( - context, - "cargo.type", - color: Colors.grey, - ), - ), - ), - Center( - child: Padding( - padding: const EdgeInsets.all(8.0), - child: LocalText( - context, - "cargo.weight", - color: Colors.grey, - ), - ), - ), - Text("") - ])); - return rows; - } - List getCargoRows(BuildContext context) { if (cargos == null || cargos == null) { return []; @@ -283,7 +207,14 @@ class _ShipmentBoxEditorState extends State { var rows = cargos.map((c) { total += c.weight; return MyDataRow( - onSelectChanged: (bool selected) {}, + onSelectChanged: (bool selected) async { + Cargo cargo = await Navigator.push( + context, + BottomUpPageRoute(CargoTypeEditor( + cargo: c, + ))); + _addCargo(cargo); + }, cells: [ MyDataCell(new Text( c.type == null ? "" : c.type, @@ -300,7 +231,7 @@ class _ShipmentBoxEditorState extends State { Icons.remove_circle, color: primaryColor, ), - onPressed: () => {}, + onPressed: () => {_removeCargo(c)}, ) ], ), @@ -314,7 +245,7 @@ class _ShipmentBoxEditorState extends State { cells: [ MyDataCell(Align( alignment: Alignment.centerRight, - child: Text("Total Weight", + child: Text("Total", style: TextStyle( fontWeight: FontWeight.bold, )), @@ -333,4 +264,18 @@ class _ShipmentBoxEditorState extends State { rows.add(totalRow); return rows; } + + _addCargo(Cargo cargo) { + if (cargo == null) return; + setState(() { + cargos.remove(cargo); + cargos.add(cargo); + }); + } + + _removeCargo(Cargo cargo) { + setState(() { + cargos.remove(cargo); + }); + } } diff --git a/lib/pages/shipment/shipment_editor.dart b/lib/pages/shipment/shipment_editor.dart index 5ae8d2b..201261f 100644 --- a/lib/pages/shipment/shipment_editor.dart +++ b/lib/pages/shipment/shipment_editor.dart @@ -14,8 +14,11 @@ import 'package:fcs/pages/widgets/delivery_address_selection.dart'; import 'package:fcs/pages/widgets/display_text.dart'; import 'package:fcs/pages/widgets/input_date.dart'; import 'package:fcs/pages/widgets/input_time.dart'; +import 'package:fcs/pages/widgets/local_button.dart'; import 'package:fcs/pages/widgets/local_dropdown.dart'; +import 'package:fcs/pages/widgets/local_radio_buttons.dart'; import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:fcs/pages/widgets/local_title.dart'; import 'package:fcs/pages/widgets/multi_img_controller.dart'; import 'package:fcs/pages/widgets/progress.dart'; import 'package:fcs/pages/widgets/title_with_add_button.dart'; @@ -28,6 +31,8 @@ import 'package:provider/provider.dart'; import 'box_row.dart'; import 'shipment_box_editor.dart'; +enum SingingCharacter { lafayette, jefferson } + class ShipmentEditor extends StatefulWidget { final Shipment shipment; ShipmentEditor({this.shipment}); @@ -64,12 +69,12 @@ class _ShipmentEditorState extends State { DeliveryAddress _pickupAddress = new DeliveryAddress(); int _currVal = 1; - String selectedPickupType; + String _selectedPickupType; @override void initState() { super.initState(); - selectedPickupType = shipment_local_pickup; + _selectedPickupType = shipment_local_pickup; if (widget.shipment != null) { _isNew = false; @@ -84,6 +89,9 @@ class _ShipmentEditorState extends State { _currVal = _pickUp.radioIndex; } else { _isNew = true; + _pickupDate.text = dateFormatter.format(now); + _fromTimeEditingController.text = "${(now.hour)}:${(now.minute)}"; + _toTimeEditingController.text = "${(now.hour)}:${(now.minute)}"; List _cargoTypes = [ Cargo(type: 'General Cargo', weight: 25), Cargo(type: 'Medicine', weight: 20), @@ -101,6 +109,8 @@ class _ShipmentEditorState extends State { super.dispose(); } + SingingCharacter _character = SingingCharacter.lafayette; + @override Widget build(BuildContext context) { MainModel mainModel = Provider.of(context); @@ -111,29 +121,14 @@ class _ShipmentEditorState extends State { iconData: Icons.timer, controller: _fromTimeEditingController); - final toTimeBox = InputTime( - labelTextKey: 'shipment.to', controller: _toTimeEditingController); + final toTimeBox = Container( + width: 150, + child: InputTime( + iconData: Icons.timer_off, + labelTextKey: 'shipment.to', + controller: _toTimeEditingController)); - final pickupTimeBox = Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - child: fromTimeBox, - width: 120, - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text('-'), - ), - Container( - padding: EdgeInsets.only(left: 20), - child: toTimeBox, - width: 120, - ), - ], - ); - - final shipmentDateBox = InputDate( + final pickupDateBox = InputDate( labelTextKey: "shipment.date", iconData: Icons.date_range, controller: _pickupDate, @@ -152,8 +147,9 @@ class _ShipmentEditorState extends State { ), backgroundColor: primaryColor, ); - var deliveryAddressBox = DefaultDeliveryAddress( + final pickupAddressBox = DefaultDeliveryAddress( deliveryAddress: _pickupAddress, + iconData: Icons.location_on, labelKey: "shipment.location", onTap: () async { DeliveryAddress d = await Navigator.push( @@ -176,13 +172,14 @@ class _ShipmentEditorState extends State { var shipmentTypeBox = LocalDropdown( callback: (v) { setState(() { - selectedPickupType = v; + _selectedPickupType = v; }); }, iconData: SimpleLineIcons.direction, - selectedValue: selectedPickupType, + selectedValue: _selectedPickupType, values: pickupModel.pickupTypes, ); + return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( @@ -208,38 +205,47 @@ class _ShipmentEditorState extends State { padding: const EdgeInsets.all(10.0), child: ListView( children: [ - handlingFeeBox, - shipmentTypeBox, - deliveryAddressBox, - shipmentDateBox, - pickupTimeBox, - localDropoffAddress, - curierDropoffAddress, - TitleWithAddButton( - titleKey: "boxes.name", - iconData: MaterialCommunityIcons.package, - onTap: () => Navigator.push( - context, - BottomUpPageRoute(ShipmentBoxEditor()), + LocalTitle(textKey: "shipment.type"), + LocalRadioButtons( + values: pickupModel.pickupTypes, + selectedValue: _selectedPickupType, + callback: (v) { + setState(() { + _selectedPickupType = v; + }); + }), + // handlingFeeBox, + // shipmentTypeBox, + LocalTitle(textKey: "shipment.location"), + pickupAddressBox, + LocalTitle(textKey: "shipment.date.time"), + pickupDateBox, + fromTimeBox, + toTimeBox, + // localDropoffAddress, + // curierDropoffAddress, + LocalTitle( + textKey: "boxes.name", + trailing: IconButton( + icon: Icon( + Icons.add_circle, + color: primaryColor, + ), + onPressed: () { + Navigator.push( + context, + BottomUpPageRoute(ShipmentBoxEditor()), + ); + }, ), ), + Column( children: getBoxList(context, boxModel.boxes), ), - Align( - alignment: Alignment.bottomCenter, - child: Center( - child: Container( - width: 250, - child: FlatButton( - child: Text('Create shipment'), - color: primaryColor, - textColor: Colors.white, - onPressed: () { - Navigator.pop(context); - }, - ), - ))) + LocalButton( + textKey: "shipment.new", + ), ], ), ), @@ -258,4 +264,6 @@ class _ShipmentEditorState extends State { ); }).toList(); } + + _addBox() {} } diff --git a/lib/pages/widgets/defalut_delivery_address.dart b/lib/pages/widgets/defalut_delivery_address.dart index 143d91f..e8ffbc5 100644 --- a/lib/pages/widgets/defalut_delivery_address.dart +++ b/lib/pages/widgets/defalut_delivery_address.dart @@ -13,9 +13,10 @@ class DefaultDeliveryAddress extends StatelessWidget { final DeliveryAddress deliveryAddress; final String labelKey; final OnTap onTap; + final IconData iconData; const DefaultDeliveryAddress( - {Key key, this.deliveryAddress, this.onTap, this.labelKey}) + {Key key, this.deliveryAddress, this.onTap, this.labelKey, this.iconData}) : super(key: key); @override @@ -28,7 +29,7 @@ class DefaultDeliveryAddress extends StatelessWidget { Expanded( child: DisplayText( labelTextKey: this.labelKey ?? "delivery_address", - iconData: MaterialCommunityIcons.truck_fast, + iconData: iconData ?? MaterialCommunityIcons.truck_fast, ), ), onTap == null diff --git a/lib/pages/widgets/input_text.dart b/lib/pages/widgets/input_text.dart index b0bd81a..c94d3ab 100644 --- a/lib/pages/widgets/input_text.dart +++ b/lib/pages/widgets/input_text.dart @@ -15,6 +15,8 @@ class InputText extends StatelessWidget { final Color borderColor; final TextInputType textInputType; final bool autoFocus; + final TextAlign textAlign; + final bool enabled; const InputText( {Key key, @@ -26,7 +28,9 @@ class InputText extends StatelessWidget { this.withBorder = false, this.borderColor, this.autoFocus = false, - this.textInputType}) + this.textInputType, + this.enabled = true, + this.textAlign}) : super(key: key); @override Widget build(BuildContext context) { @@ -35,12 +39,14 @@ class InputText extends StatelessWidget { return Padding( padding: const EdgeInsets.only(top: 15.0, bottom: 5), child: TextFormField( + enabled: enabled, controller: controller, autofocus: autoFocus, cursorColor: primaryColor, style: textStyle, maxLines: maxLines, keyboardType: textInputType, + textAlign: textAlign ?? TextAlign.start, decoration: new InputDecoration( // hintText: '', hintStyle: TextStyle( diff --git a/lib/pages/widgets/length_picker.dart b/lib/pages/widgets/length_picker.dart new file mode 100644 index 0000000..c738e32 --- /dev/null +++ b/lib/pages/widgets/length_picker.dart @@ -0,0 +1,183 @@ +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'input_text.dart'; + +class LengthPicker extends StatefulWidget { + final TextEditingController controller; + final String lableKey; + + const LengthPicker({Key key, this.controller, this.lableKey}) + : super(key: key); + + @override + _LengthPickerState createState() => _LengthPickerState(); +} + +class _LengthPickerState extends State { + TextEditingController _controller = TextEditingController(); + + @override + void initState() { + super.initState(); + if (widget.controller != null) { + _setText(); + widget.controller.addListener(() { + _setText(); + }); + } + } + + _setText() { + int v = int.parse(widget.controller.text, onError: (s) => 0); + int f = (v / 12).round(); + int ins = (v % 12).round(); + _controller.text = "$f' $ins\""; + } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => _showDialog(context), + child: Padding( + padding: EdgeInsets.only(left: 8, right: 8), + child: InputText( + enabled: false, + labelTextKey: widget.lableKey, + controller: _controller, + textInputType: TextInputType.number, + textAlign: TextAlign.end, + )), + ); + } + + void _showDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return LengthPickerDialog( + controller: widget.controller, + ); + }, + ); + } +} + +class LengthPickerDialog extends StatefulWidget { + final TextEditingController controller; + + const LengthPickerDialog({Key key, this.controller}) : super(key: key); + + @override + _LengthPickerDialogState createState() => _LengthPickerDialogState(); +} + +class _LengthPickerDialogState extends State { + double _valueFeet; + double _valueInc; + @override + void initState() { + super.initState(); + _valueFeet = 0; + _valueInc = 0; + if (widget.controller != null) { + double v = double.parse(widget.controller.text, (s) => 0); + _valueFeet = v / 12; + _valueInc = v % 12; + } + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Center( + child: LocalText( + context, + "shipment.box.height", + color: primaryColor, + fontSize: 16, + )), + children: [ + Center(child: Text(_getText(_valueFeet))), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 8.0, left: 8), + child: LocalText( + context, + "feet", + color: primaryColor, + fontSize: 12, + ), + ), + Slider( + activeColor: primaryColor, + value: _valueFeet, + min: 0, + max: 15, + divisions: 100, + label: (_valueFeet ?? 0).round().toString(), + onChanged: (double v) { + _updateFeet(v); + }, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 8.0, left: 8), + child: LocalText( + context, + "inch", + color: primaryColor, + fontSize: 12, + ), + ), + Slider( + activeColor: primaryColor, + value: _valueInc, + min: 0, + max: 11, + divisions: 100, + label: (_valueInc ?? 0).round().toString(), + onChanged: (double v) { + _updateInc(v); + }, + ), + ], + ) + ], + ); + } + + _updateFeet(double v) { + setState(() { + _valueFeet = v; + }); + if (widget.controller != null) { + int _v = _valueInc.round() + _valueFeet.round() * 12; + widget.controller.text = _v.toString(); + } + } + + _updateInc(double v) { + setState(() { + _valueInc = v; + }); + if (widget.controller != null) { + int _v = _valueInc.round() + _valueFeet.round() * 12; + widget.controller.text = _v.toString(); + } + } + + String _getText(double v) { + int ft = _valueFeet.round(); + int ins = _valueInc.round(); + return "$ft\' $ins\""; + } +} diff --git a/lib/pages/widgets/local_radio_buttons.dart b/lib/pages/widgets/local_radio_buttons.dart new file mode 100644 index 0000000..e45baa8 --- /dev/null +++ b/lib/pages/widgets/local_radio_buttons.dart @@ -0,0 +1,41 @@ +import 'package:fcs/helpers/theme.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class LocalRadioButtons extends StatelessWidget { + final Function(T) callback; + final IconData iconData; + final T selectedValue; + final List values; + + const LocalRadioButtons( + {Key key, this.callback, this.iconData, this.selectedValue, this.values}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Column(children: getChildren()); + } + + List getChildren() { + return values + .toList() + .map((e) => SizedBox( + height: 30, + child: InkWell( + onTap: () => callback(e), + child: Row(children: [ + Radio( + activeColor: primaryColor, + groupValue: selectedValue, + value: e, + onChanged: (T value) { + callback(value); + }, + ), + Text(e.toString()), + ]), + ))) + .toList(); + } +} diff --git a/lib/pages/widgets/local_title.dart b/lib/pages/widgets/local_title.dart new file mode 100644 index 0000000..8fc8c72 --- /dev/null +++ b/lib/pages/widgets/local_title.dart @@ -0,0 +1,40 @@ +import 'package:fcs/helpers/theme.dart'; +import 'package:fcs/pages/widgets/local_text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class LocalTitle extends StatelessWidget { + final String textKey; + final Widget trailing; + + const LocalTitle({Key key, this.textKey, this.trailing}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.only(top: 18), + child: Row( + children: [ + LocalText( + context, + textKey, + fontSize: 20, + fontWeight: FontWeight.bold, + color: primaryColor, + ), + trailing != null ? Spacer() : Container(), + trailing != null ? trailing : Container() + ], + ), + ), + Divider( + thickness: 2, + color: primaryColor, + ) + ], + ); + } +} diff --git a/lib/pages/widgets/title_with_add_button.dart b/lib/pages/widgets/title_with_add_button.dart index 79607f1..c006f35 100644 --- a/lib/pages/widgets/title_with_add_button.dart +++ b/lib/pages/widgets/title_with_add_button.dart @@ -38,7 +38,7 @@ class TitleWithAddButton extends StatelessWidget { onTap == null ? Container() : Padding( - padding: const EdgeInsets.only(right: 25.0), + padding: const EdgeInsets.only(right: 0), child: IconButton( onPressed: () => onTap(), icon: Icon(