From d41d48b40543b7e3d50f6b7f5235c9fbe0632d75 Mon Sep 17 00:00:00 2001 From: sainw Date: Tue, 2 Jun 2020 16:19:10 +0630 Subject: [PATCH 1/3] add package --- lib/model_fcs/message_model.dart | 40 +++++- lib/model_fcs/package_model.dart | 2 +- lib/pages/home_page.dart | 4 +- lib/pages_fcs/package_editor.dart | 232 +++++++++++++++++++----------- lib/vo/package.dart | 4 +- 5 files changed, 191 insertions(+), 91 deletions(-) diff --git a/lib/model_fcs/message_model.dart b/lib/model_fcs/message_model.dart index cc8c995..23a51cb 100644 --- a/lib/model_fcs/message_model.dart +++ b/lib/model_fcs/message_model.dart @@ -17,20 +17,34 @@ class MessageModel extends BaseModel { receiverName: "Online Buyer", date: DateTime(2020, 6, 1, 1, 1, 1), message: - "Hi Online Buyer, we received your goods. Please see in 'A202-3 #1'", + "Hi Online Buyer, we received your goods. Please see the following link", + ), + Message( + senderName: "FCS System", + receiverName: "Online Buyer", + date: DateTime(2020, 6, 1, 1, 1, 1), + message: + "'A202-3 #1'", ), Message( senderName: "FCS System", receiverName: "Online Buyer", date: DateTime(2020, 6, 1, 1, 5, 1), - message: "Thank you. Will see the photos and check.", + message: "Thank you. Will check the photos.", isMe: false), Message( senderName: "FCS System", receiverName: "Online Buyer", date: DateTime(2020, 6, 1, 2, 1, 1), message: - "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in 'INV202005010387'", + "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.", + ), + Message( + senderName: "FCS System", + receiverName: "Online Buyer", + date: DateTime(2020, 6, 1, 2, 1, 1), + message: + "'INV202005010387'", ), Message( senderName: "FCS System", @@ -44,14 +58,28 @@ class MessageModel extends BaseModel { receiverName: "Shipper", date: DateTime(2020, 6, 1, 1, 1, 1), message: - "Hi Online Buyer, we received your goods. Please see in 'A202-3 #1'", + "Hi Online Buyer, we received your goods. Please see in the following link.", + ), + Message( + senderName: "FCS System", + receiverName: "Shipper", + date: DateTime(2020, 6, 1, 1, 1, 1), + message: + "'A202-3 #1'", ), Message( senderName: "FCS System", receiverName: "Shipper", date: DateTime(2020, 6, 1, 2, 1, 1), message: - "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in 'INV202005010387'", + "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.", + ), + Message( + senderName: "FCS System", + receiverName: "Shipper", + date: DateTime(2020, 6, 1, 2, 1, 1), + message: + "'INV202005010387'", ), Message( senderName: "FCS System", @@ -63,7 +91,7 @@ class MessageModel extends BaseModel { ]; List get lastMessage { - return [messages[2], messages[5]]; + return [messages[2], messages[6]]; } List getMessage(String receiver) { diff --git a/lib/model_fcs/package_model.dart b/lib/model_fcs/package_model.dart index dfac67e..ada5414 100644 --- a/lib/model_fcs/package_model.dart +++ b/lib/model_fcs/package_model.dart @@ -39,7 +39,7 @@ class PackageModel extends BaseModel { rate: 7, packageType: "General", weight: 15, - status: "Received", + status: "Waiting for payment", arrivedDate: DateTime(2020, 6, 1), receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 998d49a..a097aaa 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -306,8 +306,8 @@ class _HomePageState extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - _buildSmallButton( - "Policies", FontAwesomeIcons.fileContract), + // _buildSmallButton( + // "Policies", FontAwesomeIcons.fileContract), _buildSmallButton("Support", SimpleLineIcons.support), ], ) diff --git a/lib/pages_fcs/package_editor.dart b/lib/pages_fcs/package_editor.dart index c061044..a4731a9 100644 --- a/lib/pages_fcs/package_editor.dart +++ b/lib/pages_fcs/package_editor.dart @@ -1,5 +1,6 @@ import 'package:fcs/model/main_model.dart'; import 'package:fcs/model/pickup_model.dart'; +import 'package:fcs/pages/util.dart'; import 'package:fcs/vo/package.dart'; import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/widget/progress.dart'; @@ -39,6 +40,8 @@ class _PackageEditorState extends State { // _toTimeEditingController.text = _pickUp.toTime; // _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString(); // _weightEditingController.text = _pickUp.weight.toString(); + } else { + _package = Package(rate: 0, weight: 0); } } @@ -65,93 +68,162 @@ class _PackageEditorState extends State { child: Column( children: [ Expanded( - child: Padding( - padding: const EdgeInsets.all(10.0), - child: ListView(children: [ - DropdownButtonFormField( - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Shipment Number', - icon: Icon(Icons.pages) - // prefixIcon: Icon(Icons.play_arrow) + child: ListView( + children: [ + widget.package == null + ? Center( + child: Container( + padding: EdgeInsets.all(8), + child: Text("New Package"))) + : Center(child: nameWidget(_package.packageNumber)), + ExpansionTile( + title: Text('Package Information'), + children: [ + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: DropdownButtonFormField( + value: _package.shipmentNumber, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Shipment Number', + icon: Icon(Icons.pages) + // prefixIcon: Icon(Icons.play_arrow) + ), + items: ["A102", "A103", "A201", "A202"] + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), ), - items: ["A102", "A103"] - .map((e) => DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, - ), - TextFormField( - initialValue: "FCS383-283-1", - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'FCS_ID', - hintText: 'FCS_ID', - filled: true, - icon: Icon( - Icons.account_box, + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: TextFormField( + initialValue: "FCS383-283-1", + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'FCS_ID', + hintText: 'FCS_ID', + filled: true, + icon: Icon( + Icons.account_box, + ), + suffixIcon: IconButton( + icon: Icon(Icons.search), + onPressed: () {})), + ), ), - suffixIcon: IconButton( - icon: Icon(Icons.search), onPressed: () {})), - ), - DropdownButtonFormField( - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Cargo Type', - icon: Icon(Icons.pages) - // prefixIcon: Icon(Icons.play_arrow) + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: DropdownButtonFormField( + value: _package.packageType, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Cargo Type', + icon: Icon(Icons.pages) + // prefixIcon: Icon(Icons.play_arrow) + ), + items: ["General", "Medicine", "Dangerous"] + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), ), - items: ["General", "Medicine", "Dangerous"] - .map((e) => DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, - ), - TextFormField( - initialValue: "0", - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Weight', - filled: true, - icon: Icon( - FontAwesomeIcons.weightHanging, + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: TextFormField( + initialValue: _package.weight.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Weight', + filled: true, + icon: Icon( + FontAwesomeIcons.weightHanging, + ), + )), ), - )), - TextFormField( - initialValue: "0", - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Rate', - filled: true, - icon: Icon( - FontAwesomeIcons.tag, + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: TextFormField( + initialValue: _package.rate.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Rate', + filled: true, + icon: Icon( + FontAwesomeIcons.tag, + ), + )), ), - )), - TextFormField( - initialValue: "0", - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Amount', - filled: true, - icon: Icon( - FontAwesomeIcons.moneyBill, + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: TextFormField( + initialValue: _package.amount.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Amount', + filled: true, + icon: Icon( + FontAwesomeIcons.moneyBill, + ), + )), ), - )), - TextFormField( - initialValue: "P0203", - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Pickup ID', - filled: true, - icon: Icon( - Icons.account_box, + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: TextFormField( + initialValue: "P0203", + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Pickup ID', + filled: true, + icon: Icon( + Icons.account_box, + ), + suffixIcon: IconButton( + icon: Icon(Icons.search), + onPressed: () {})), + ), ), - suffixIcon: IconButton( - icon: Icon(Icons.search), onPressed: () {})), - ), - ]), - )), + ], + ), + ExpansionTile( + title: Text('Photos'), + children: [ + Container( + height: 130, + width: 500, + child: ListView( + // scrollDirection: Axis.horizontal, + children: [ + Padding( + padding: const EdgeInsets.only(left: 20.0), + child: DropdownButtonFormField( + value: _package.shipmentNumber, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Shipment Number', + icon: Icon(Icons.pages) + // prefixIcon: Icon(Icons.play_arrow) + ), + items: ["A102", "A103", "A201", "A202"] + .map((e) => DropdownMenuItem( + child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), + ), + ], + ), + ), + ], + ) + ], + ), + ), widget.package == null ? Align( alignment: Alignment.bottomCenter, diff --git a/lib/vo/package.dart b/lib/vo/package.dart index 851e142..5133e6f 100644 --- a/lib/vo/package.dart +++ b/lib/vo/package.dart @@ -12,13 +12,14 @@ class Package { int rate; int weight; - int amount; String packageType; String pickUpID; List photos; String remark; DateTime arrivedDate; + int get amount => rate != null && weight != null ? rate * weight : 0; + String get packageNumber => shipmentNumber + "-" + receiverNumber + " #" + boxNumber; double get price => rate.toDouble() * weight; @@ -35,7 +36,6 @@ class Package { this.boxNumber, this.rate, this.weight, - this.amount, this.packageType, this.pickUpID, this.remark, From c84e1beb9d28eb0a0026ed8c40ce5530d6d261b6 Mon Sep 17 00:00:00 2001 From: Sai Naw Wun Date: Wed, 3 Jun 2020 00:42:31 +0630 Subject: [PATCH 2/3] add packages --- assets/local/localization_en.json | 5 +- assets/photos/1.jpg | Bin 0 -> 18216 bytes assets/photos/2.jpg | Bin 0 -> 68368 bytes assets/photos/3.jpg | Bin 0 -> 12249 bytes lib/model/main_model.dart | 12 +- lib/model/shipment_model.dart | 30 +-- lib/model_fcs/message_model.dart | 31 ++- lib/model_fcs/package_model.dart | 55 +++-- lib/pages/customer_list.dart | 2 +- lib/pages/home_page.dart | 25 +- lib/pages/invoice/invoice_editor.dart | 62 +++-- lib/pages/message_detail.dart | 2 +- lib/pages/pickup_editor.dart | 32 +-- lib/pages/pickup_list_row.dart | 2 +- lib/pages/profile_page.dart | 21 -- lib/pages/shipment_editor.dart | 73 +++--- lib/pages/util.dart | 4 +- lib/pages_fcs/package_editor.dart | 321 ++++++++++++++++++-------- lib/vo/invoice.dart | 2 + lib/vo/package.dart | 14 +- pubspec.lock | 7 + pubspec.yaml | 4 + 22 files changed, 439 insertions(+), 265 deletions(-) create mode 100644 assets/photos/1.jpg create mode 100644 assets/photos/2.jpg create mode 100644 assets/photos/3.jpg diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index f63c83f..254bb26 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -104,7 +104,7 @@ "reg.confirm":"Submit Registration?", "reg.date":"Registeration Date", - "profile.title": "FCS Profile", + "profile.title": "Profile", "profile.edit_title": "Edit FCS Profile", "profile.name": "Name", "profile.phone": "Phone", @@ -552,7 +552,8 @@ "contact": "CONTACTS", - "fcs.profile": "PROFILE", + "fcs.btn": "FCS Profile", + "fcs.profile": "FCS PROFILE", "contact.usa.phone": "USA Phone", "contact.mm.phone": "Myanmar Phone" diff --git a/assets/photos/1.jpg b/assets/photos/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3186d794f40117e510429a4d64ee28b63098af8e GIT binary patch literal 18216 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πK2y$|;iiRUK6L1`UfUq` zkbM*R&?|A4;4c9Bh)5N(yL7%dJ$I1AGXV;AZbL`}qnBusq|E{QYr6*YR!H6S%X_E+ z1gKv;0Pg&=2&SLUx>}ANpmHBEf=1T^r-{+|*e9wt6<)jSYP=2pV>!n12T9*2m^%fY5Vym35K|=T!9!o2RLhho)a??XaFqQg}rnpK@fp|@LZm0icr zEEf{{c<$d~zHZAgg`o3m_##akw|r>`?++*YO_nLJ7+h9=5>Bw%u3(K1(XFDBjda_|+P?EC7x74{9n@4Di zqy`2I*$%T{$Lc;fD>@T~2cX1nQKfdvJAj21qjB{bmfyhy@nF*RnQ0Z5*X-Wj1T6ZS zKxQvu``v?;w`dJ}wq+F^A!HjR)fW<$v^)Z|0Ia z%Xz>G88A4+2=;y)&Eo90&%9;5zth4~LV3K*k0x2V-?xUcWqhzFyPyC+qq?#Y*J=Bj ze8vQ{L@_gGI-CCjd?MyeFHJk@H|s&}8nk$5{-t7|BrPY|q^@{9JtAk&Bn@T>na!Q8 zwFC3zXcbdj`Iu8Z^s=0^9;H#CCPZ%ZH*B8TPU(7lJ2P{3AxoWFhKfcER@LS>lD0ws zEM!%akv(V6Zn&@vwYD`yik!F*Z7NKP#j9J8H?(Y>D+~fVfJgHyJ$DK|d|;ilp@)~) zF^Si^cEWJ;m&Ks8IoYKi#m>GNv*@$m6#bLo%^UDElX=BW+#x011&#Te;o+DQci;gO zSUkgoyXpt#w$AF)EQFG{)L#RTbvf2*YQOVXuY58Z$e9o~1kWjDtl#&K<~A2s%bAt9 zdC9}!OsPJ4XnW6yhV#WiNO9@L15j70XMr=;4*5b~E)EAN006n2L}rnpMWtDNyanG3 z*=cbNXTNyxH5kf-)Q&pf4dF!&)2o1AShfJJZ@X+6Ux>W~%THC(&~kQKcrY;$Lv1~{ zatdLFV60`+QYdFfmsJ>e293CrfS|Pe6w~~JWR-a}b7ULnZ?qT1P)bW4vKfn5OpUo; z)^)?{4u?mnO^Yq4X{}&cDxoU5NvpIXN{fT68_i9gak_u?IZ@D7rF}I*s%%9(M_`Zc zb32|Gk5OPg3Xxt~BCU_yDM;T_R%>-?70{EkB4j|aQl?#9Xb_RBcB{Mn2!vg0YjoF( zLLFagZ?gI=jnVYV7~ED^yDdEK8t>Wewu^+LALAP@FCv= z$73Iv1u=0axZpGOB-k^+wtzN6y6<25ob;LYnD7^{b0@HJCpar$u5suyRrM3mNV}p) zt6-DXE|YlsBd6@=1HaVJ8rHF%aY}FA3^~ zv3!FLA)9GxL%$3Wq9gtV;NC&h*{G;Bn3X(&`??RFBMuP`F+Bw7wH82orzW zB6^_Hg_jrDoA!W^zvCvmkgsY*Ka_Y z?i6)}lJ=;O_W5!rxCyFODoKR5oHBpw2VS44!HWllVsrnb$j=JQCqbv~nlyvmEQ5H# zUb2&T`%AJ*^W}!BBZVSAbN7iX6m=H@&7QHGU76*i+SE^5&YcGdLK(sEqYZZXqs~d$ zjt(QVC95v3$sXrpuI!F2B;7QPGcvr&qJr7-u<1+cs&4@I zNkeQH1ya!vJAWwD$=Dw%6!}b*`GHDTyuGzIbvOEHB-op1wuCF^LQ?~o@) zoSEM9SP!Fj&x858FR=DOt>Q&R@5N}_FZo2uf3 z+!RX{XY27bzd@T2nl_~Un8mLat|{+uHz;5t^q<+HB&$vA!-bYc zriMfV7*_!V`0ZB?`|95VQdep`(KSW$?*61c!=FI~Ue3{<1{{*_zdSk*!xVt^G&4w&7JaB&)${d3voS8{-5%>F08V3tipK zphZcHddQ7S#pJs1(tN6-V{}d+tRw?&7m4fL3;(#slS0W2Ue9+q6f^v0TNx8;TD$Bb zzLpk5AF|9g&6}583>$o&D?U#hio*Ob##jr@c7ENZ$a`FA#GifgO}bG+XSk@H+xIdu z*d6*5^$$!9jSm%uJ>*{wcN`&=GguQ1GjvXREbysVoHoJk{qNy8OL>3g<#~fbO}@MW zxl-D-I_+tDALUKPO>6qnk7zBIsq|gV)m_b%T}!mGCJ{grq7zZ{$}IEDSKNEnoKrV4 zZf_W35gh2So=oWDD`);YtTTJEv7&QR(9PVYs(PLM==+_3$y5!u|09(M@x81)gvFD5 zu6*78WJv+f)NkaPbock!87F6#Uop+KJz^5J?{W%rG$+IsYSE3^tZ7d5{Fv^8n1&|g zGDC(cAu)w+7b^u(k2+E`2|&k!Mz0dh!TPxN4OC~23sJ60qPt~AJm{z>za+VBswfj; zS4Fc-e7gaWyEgkkqHMr9YobMYEXyW%dt|q4MXV@h?6>Tw&7Nb94_Z%HsGIP+X_xRN zHp&SVT8=(`vD4SRbDXnol)=9Mr01Li!7n+>DF+8^=D-}o*kZ}Iu<@0L9JcqcDX5+< zw!Ho85|zo}*Q>#kZV-K~G&bIAA^xt8^`0Z3j> z5n|PxK$E^tLVcqB#q&4W1-Dn=x{q^zNqPD^#i5!p{Rf`|hr0(eVK~sw6&>f6VG-d^ zg>;Q{*2#^WzA7QigT?QZhO07_+8Ug1xA+X6FQq!az_yOQFB(E0Zz)q?v~kUV*Do&q zM!MpQ*`;3b0^xSA!JR7lXQs#+u3*)?G7Y{HTro_C&?`$!vH5iU$V;Zzs{B za9r*kGELBz&saNp--75El1Fx9WY0Y#6O5bt^XJ26ku{TYR-GNR#U){l6YdVag0*|G zp8cyHUxM1!qf#ZfCLl|cD$ENV)iF!Hn#d`6>W%v^uPB#CX+=bt88761d4n{DbVqPe z<;HTbTC5){5ul$C;bL#F9VP`x^y#~RQya7*d^MXBlxQ^dsc{et15$845b3dnL zmjsZXezXvk8%p1+Ok*$aM}mNW!9)oq0)AZD39k1nRiVK>4^9Vi^`gO|rP&z0=`F$m zXiXbCIm$OdN%WSd)tJ=j9Is!JR3br8&X=%N`_Ny*H@=gxJ7zo{9K!<8-mngIFvigITJQ+HzcA2)Cew3D3HkD?t9F&Ewqo$`JZ73S`uBV@<6quTU*2%3V zeC3<~%chw&NZQ2wIVy|dzz`d@JaLKj_V?7qMpx61L?j`ji`Znc_qCj_H*2h{u>v4D{FyPh4Pi13xDUu zR==(*Hsw`dZkZ*M_RIldy7NPHn=L8~qa&c{OiWunF~h)PjuXCZj9qC(kvEVfWv_(b zZ9->M6U`%oXAGr+ujeIjKH#4C&pnS|;Ofj@0QRH*DfW!Nvfy(ULV$u7AAxY5s|+#| z$EMSVgF@A+CQ~W=jj1R%OyKF}I|le;Qy(`clKK*DQq01ZfJ6QuPZRjq9EVC~R&D6T z35V@03D;=lA^a;MzH_UVda<=^=9Br)7g64WlySYm&9|QS(U%j!s3n1^oyC?5oqPWW zgp)%5Yd(I2pl@<&O_TJ?2sqk4&`uw90>gF~a-GfCEJ9$p81@5;C7T!E%4(&n+&?TR zP5GvAohw=gNm4w+jRAFDlV%obcNaMGxoxhquyt0&piLlAiYP8HbP+8_q4cT&*{e=S z7Q@qY29PlS5X0?jcHp~y*P}mVs?CzG5#$DiE3W?uHq<9q)U%hWAy%Z-6T2~(S&+=3 zZE=Sjn%9*%thZSWRU*`TmZjy+shNre>_qUXd$5s`t&{$DS-y&5>OyPh_ALe>o?3j{?Ophlw*CVmH!{56J-Mz(^*S)2bI`EN;+=Pudv zPvqY<57>O=ggVQD_ff}x0ei%@ZG@)b>5$-ck{DRLM@b5zPabQ0`Fp-M`!ZoD4RK5G?OG%iU75MAP7s-b`Rv3bJK&Q^`Asn3a9hiK1Oy?8_wO@* zCK6QYoPSEGs`dN1)5#K}5zBr5+93S~9Dv?hDb8tNWLwCdTZzhFaN0j%v8s6e4Pg%w zVg~x&RTLzR>+thFgvu_=AP1#oCyf<{51NBwkIlOitumw8Z+_8s=@Fq$Xya_Y7(@$q zyYKu3j0-4i4g6P~0CyZrGjhFpUY-5|hPdYK`ArD>0?38%skQHI>?_|sv}zhQ`rr)F zyd|J#vJ<9kFW{P{F=)Fu3Z-nII2OVgBiur&Eh{9r7Z((E?(omY%J!N}<(a=Z3ncEO)MZR)HytS1JxfY~(0OGL`ZvNNR8J0mob?*w}|4IT3UC87A`MLFK6L%|!{URs7|6uPi zfK@K-l~4**W?h2yZLRa+${jg%8(Ci3LgpK|`i^7pawpbo1u(S6BxJquh%U<>89ezx z15b#=NF9%3(h1rZd4T}T(8z%l5xa^^z6ia9znV~3B*|&3a-g8;HDDKqhufgAMXI8U z`@*4o#t<6CD$(^LXDWV`8KS(LVZ-N&oAV;Eq{-3lE2OI_^EkeWxe32pkC`t;FUiQf z@7FKAPQyWDm}$MlP62PbSN&1tXE|@!{G=_d*<-_x=~HreO}+xR5Ua7BWRG0JIs67? z3ep?9xYuD<(4y*kwhR3nc|UjgWGfvyoLhLEi-pR0pto1OuB%1+f}I7Z&AMS8BjqEx zbM?K1FrLAle)+lObdSCTC(6y5HFzmMMy|agO=r1n9&jv9kq|2()VYiP1q9KQVO--ND*#Cj_}a_X^e+zs#f@T=*Dk1Hf4utyg5L6_jMTggga&AyNe%5W`fQr$UV z^?=YdPjj|tqUG@~fUf?iCZ-|1a4BrfZ~YG+mQGA`4fMv70ln9jQY^Q9G}5#8CMh&Up~Z&T;8cyNXCb4Q2ZE5 zNbt5M8I$3{1rLH*Ht#i*1%m^m=$B)wb|ftog@sFcJLKWzGvtB=rgoqlmSK^#8TB&n z&o1WYu^g=?e;JeW#ItC*XBsppO?tT&ZvXApWSE?*0#I1)JZx9PQ%Oni5p9YoXV%j) zUq{r+`A>V(5PoooKWq@}`3oV*5%Y zt|H53FO5&tRCr4KETIT>GpdR2jW?*WNbi|BFv&{ue*wa2heedfGj`CBdaJ`K&IhTM zXHL~2{pKAaG4nvAgAeAi?Zu#aL|GOt&(~3DTqUO8WoA!KxyH8!;KIx9bBskA>h05||V>UizLG8gB)g%Fd@=r!(EjI%a~HoK&P3>NCj>5Pyx({7F@ zBX}+0$|*i_6OFrhDsEF9`4k%jIco!_LeD?Kz(X~gri??wieXQeVGgePYDPjFdldYi z;-a*R5zOpX*UKc|<+F=(xBf;-noc-H8DgIZOR_mFQV>-%lrvQrBj`p}j6c_x*~bmwAT;XPES*<_vJ zMi~TNRh{pZGwZbkf$C*l zR!najZ8MC4*yqa0m7-5V@9Z5WRdlZhkx-Ywg|!R=<7xZKc>NfXRV$KZ6xT@=M(tXV zBlzqBgU~o%D-C1CxCT0e%s9? zIBEQ&>G!6b5I5SP;Lw5KELBAweM~}59)qRX!N>BreSn}8oK6pk3VT}9+~wpJ(D!>G zIL}k;>UZuQ6+{OHUqW;Gt%l=-ND4hzi}vd)0&j&?`XPGPn2>MMVB7g5m{RaX5Qe<# zU)b119X(s+T+M22a3@gcz2j+wepMai)EaAdTF${fcq3w>XYsfVCwBSCDojsQ#TSL6s6u;(m5)(9UFb$Ykx((ULZB5m zUqMux1x5!kC{Hbf1QuqLPD@v8-pD{tR(cT=XG^s-;Jdc=+5lC^1*Bi1f$#&BYu2Mh?Fq#!x79{UqMh)boIsj*6JhQpcIeS+ z>^i8Lin}i{yu;_>cCXHaZMiC{1ng(nR`mK;8iT4Llt)vY*O~rtCR9%o@-?a$|>V%PWH^7ryQu~FFJVruR1VU zKL)wU^aH?L&8{YXg0aj|c1uTs#WCIn`J~2O7+zhmwrnkQx7&PAL^*Ro;vwfmvlqif ztj6m@ch8!nk1?%~XkvmM0R$C|5MDm)(5Us#3UH^ci67a7K{J!c@*gsRRh2kU`o=R3#Cu`+-VNtm;_Qhq z6>E)FTwm})tcEeEIb4`a4@E_G?RYt6Ghdrd?p4JqHU+7!jy>qdu^;#zD9h%Cjs>32(OU@8Zk@^N=e)>Bqyx_vm zTi{Xbu~qF0m>UdMGlHB;W}K`zW!{~Fir&SH4oNk^*lX$bZ*h|c57hao;hd;?jOCkKzDQ-3(ma{ zzu9lMK(Z}a2d)krf)d_GH6iRH&T#c2Rb=3$UMKEE&BCX)F{v<{Lb~j)e<{3Wyi@o%Gir_1l-w?2W{`WWMGot4`hzWB*n$ zDvlUuf```dVj-W>&~))Sn#q7L9~A?%1pIiq@63ZVS%TjOwi7wy7iSK+CtI3HHy!fk zTqpHwU z$SOS(qdmgPHr>K{AFTzR?DyW^8lW*V$`hlFSXA+Aq2Q#`F1cz|U-6f`O!L$24oFHu zaQA#H z(u6jbNmQ|fB4^sxx(0Cwm?kYeH`qSD#^gbGj1F#PFOW@`uCDa8@YHGaPAOvM^;uN1SIUg)^#ApVn7IWkAoA?dMpnR_$c~ z#{$uRWXi_X*ouBrE{St9^|GuSz}l^q#pp8s#dBmJ?i`>zYfE=3THNUIkmZ z`kA|${;)~?a-rehRP+g4nwb$`YHm<{v+MQi$F_lY01M(ENb}se9`2SSlv9n@sWkt% z_dys=cGbu1!5+?t@e+BPN%-DXM^nWv98Z`&iy%qr#*_^Ywz*b5kJ6 zfQkG>B30}@f8J*QKuN#hXGPMH^0~Eor4iEC86&zHPcNuw zx`p{lakcW{$(&G&@|*7+<3^?=-y~i#a)P@dTk!Z+M|ZtNgL0LOgrn((Ek4MJCE8gh zM$Pt5JquU@E~r#yo`3D_5B>1;^%!%yX=^Mg{GEfuKE4J07XS{98_;a*!}MZrobxSq#*kD!2g^K5J2K8V6sEK$uCMuN(yvzbo?(dMK($GN{#sf zvdc4vv461i8S^@WfR%;xTJK{La7FI zZUvR+t`*oZuaV(B;)xn{J2yOPDLsi9tDn=u36JO+5Dp7LZV#?;Mcvinqb|F_)>jXzqc*}B9em>TtoU*6sbqNl zqN_I(F7W#TPav|xh%w|l^7yu?0`YH7Df%(o1a0_w3MxBet2%pDrGwd8>O|(g^N8A} zeo8u(+z5iyf7r1-*Be`RE+E1%0Q>;>F7p4XMcvlsHC|kS8hKc&sr5Elfk8D9U9*zT z?7MlI9Nd-Hx8MhJz8}|5nZ8^x9oODSLOhE^EK5dt_NUs5S5&W;NRX-i&S3~SAC=rW zqJ@HuqA5^KsN1`;hd{=1LVwe}uTvQy;9o*e`{#c8?`swcCLNp}E*Y|;E)?yMKdQ3s zvd06l(oDVW#OMg%h{qms@A`%z6=ZQT+AtjN{+d|Lmx9VDF5A9?t87nE-*1396;^_;&S+x#-dNG3Cui_Ael8u=|Q?@XAwwYWeqx zw88}_>*Gs~;s5;X#eZ@W?@wKuKQ|O0$EFD+2_*4kyPUodM=W>>qL<$KQK{^|D>V91 ztqP(SK0Iep?Sj{QzJm}5Ij1>nAHNU%6JByIL4P?P`d9l*Jw|-){{<+!5IJ>ZJ9Q*< zBxK~ofy}|71&bS4gqFLH!^P=yz@T~puuPcRp+ z`(6x%r9$%$nfh;wobG3lOdx$P^#z*)j*_Z|VBdI6FQ4c$)VIX{xArMsQN$)&Sjo1oc)&E14ve^iT(@JH+;+~+CFdDdqj(*v#{_FF`~ zo8Tw=rmk;)&bi7%ZsOgm%e0rR@!hp)Xr)R88EBuFJL|; z1*T45K=8yIJn3 zx)A@#!C?>@*l}=h_*S)=A^h4Wjk+wEBF?AmR{d28>NxnEsM(Vy2L z9gL?=!1pw0%^(R**87QVT&uOz*4{%f^=tCg)-&S#Sz}pecO&U@5>^D;Jnxor>4}x= zlrmHr$>s#O>dk{SNM5)1wPmMQwecJupIqTrHhE&t6_{8gDdh>pyEs#w^|Xno4v*9R zrijjWpzxWT+>#@)A0taO=GDWvOdpa{lN1Z~bcFMkFX!!IYcibT73x`$ypcGY zczBOnT=kOJFXv4M3z-e>{V{IFo1Vl_7K7Fui}eAaH%?TWL~5L#LhK*Z=O4W*xhK`vA+QI$+NGE zUTL)J=8`H?tkPcSo>#XN{I91ZEo`+NoXaZ}N!hM-+VX+OzCoUsDWzNs(KbtP|JIz#dJBjO9g47`6rQcporVQ?}5_H4%M zg27{o&18K;usWY+&dj@3Ptd^O)rB)CWlX_wN|`|TNrG(_E00N0xi%r0U+_NXBK7z0 zB456ISu-)g84_^MEpvE7Ph51%?%8z*wS8_h02l-S1{x9^?!VhUi1&{MflBg~MOf(z zvm&VJlM2P>8P-9fizurYJN)b;V|B{CzWI*Wu5%&F(;i37vMNCT-!pd`1Q&`Q;n z1R*f2U{#IK46AACrhj{??JZ!>k-JI;~6#$ZT2ikMZ-1g@Q)nN2fZ7Yf#nP> zNbF(3eU1Q{DTn3aTheY9vG_2P+q8uaVo7C6~bVc-ABF#zvfaHSBO5-{Q}+ix3Kjqu z^zLAg1ct@&Je#$%7*!g(qsO>l__!I`4of!mro+i`94hsCJ4@!Cj`j3Nd(9#!g&vbe z4c79ME5Xx2BEiQBT&*as_lCQ8oH=g11ao+R0&Jnd#NMw>u_Ro0j)I+5?F~pMP{VO_ zCxA)%j9Q3lnK+wXz^5YmW2R*KQpCsHZKa$i6e~DnXd|o^*M#-py&O&V4gf|myYKC1 zQ32uH>Upf{gLH!+`9%RLj}M+<3KhCyTH!#PRRLMffe4oUrvU1LAwC-@$3}o6xq`_A z>avmJgF-u6Qf7{eAIfM2M0hDWh9OZ~9_Ej!Z{JE56~t&_e~c-oeV69x?Ngl1J`H?- ymrel#f6rrV^Unf&Tn0n}h`?YlK9~p}p9n@sKnNp;5D`JhsYpr5NlB?F;bi{+ zr=+B%W1yp@WM$>xU}Y5%5)u-T`dcwh@m7TP%;t-2^kp_27{8(laY~=kIu^>A!G zSV+TCP`Do&dKLAjjyLQ)5oF;)N(SU7_NhgU)2zZ2FaQ=75Cp=)1%j|a|Mx{84C|ja zNY57TfgP6efdxgX*wCwgJY`3=aia9N1Rw$d|Ah;J0ptKpG0NphrW>bLdS-WovTXs- z&LSh;;@EPBFsf4To=V`?7B*diM%E8R&CqOU6%N#hfG|wuYq>i8NF+rEf8}a8iyD~M z+scr&Z2K!AzWgxvc=}3c*s2nT(UE~KIHhND51!>o5(}oD@=h$|1k=xYCl;51B=rrw z@#Pf=^oLWEOPP2xgpAcHpXrk#gSV3D0`2e0bcRC$&*&N%ByB!JRx$(2qa#bNadxj& zcJbspo+k=1J``YuV`XC^eiyw7Rqrh{dqU6iS8q@)FcC{$7nom3m&|z;$||e=MB&LF z(?YcY)=Uk>?9lYEDU`u(<^VHBQ0=FPty=Hh>}V{P)2rZtiOb5Z1< zwMN3+x$^W`-+MYS`Jp{)W`pz);Ztn*YJ^NKp_B3)%s7b=l{zd9RoAT2A8ze}xvdUn zOEtYEtQ)z@^I7 z&{cM?^>?50(`^onuC2%!RP6Qj^L3}Wm&HGKhuaVTGNHzILB<5&(TlEAh#Dh0jwDTmibd}#u_|I z(?2rC7x!g&V_N%fW(U*fgp$pJYWqebpR}D)gxzYxAL1!I8&T;*tZa0wL~27HD^mEJ z3k#?x%%4G4eC1GWj{urS0LmDTsq0&>i{DDXv(*!}NMg7Bc)WgIP1aNK{SN1c0oBUslK(HS)QiJ6eA+ozuD0`wnk6gTn67E}!}lpj8Trtu+gh2+Y9Z-f6?3cEV6g9k+Zx<(*p|faBtP&w{8$4xF0etp zpFdF>+G5+`zMYR)eu>&NYs+MBJ4$y~QT!P0 z_s5AJxh-g&@^(((aKXr5vIsKWTc~1&in+DDl{Ev|{RpZk1CMYgd}4=wnJv& zB4`OfpsXC*$jYr8ZQEQ+aD4QXckqYxz&FbTTd?1@54ydS1Bp%n*c+p=&sSxa8@shK zPM^Q^)udWs<8q^ZNsaTX{pU-sy?`0UV0y$kB&zDq$|M`zsFsP!phxl~NBL8Og5|mm zvzFctyuEr%$Op@dpxgkhrO&56C*86}&?@_#Y5z28+~l5!Ffh(hXVS9`ug!}-*A5Fh zwv&UCr`Bz+KTmF?aiV{g*dHmu@ve%q%?(zJm)crAEMjX=33K=w_~4Eop2|d?14O}K zXc-u)0a-6=E7x}VS>Joj6x+{aVdxwcs^7wuJm1STsOogzr#h{3oa4sDe>5PWSGbqs!vj@o$WJ1i8Fp#f-lU!@PF^ z4QCw#s>^+YZ=WX|?aUi)r4Qa>EJdXfY*QXM9|3nIe-f8(lUVdv(+Do+C?)b5@Fz?j z!gaU5HE-qywZ03W7rnlr53D!5;zP>D@g=`7{dratjk z9Kk!cwoSWgwt7Cbyrm2%B0Kqsw6d3zhV6FXh40(tAFN%I7hL2@IS`_6j9~=hJ}VCm zi7{i*mk`eJ(^53NyzOo6r1*-zEfwCrha9SO^}-sf z%S35%c|ii6LO1!#yYL(L@7TnUoxWq8pB;;(u>Eg)Yb7$IrCi{`~EnjvR_k|5PQ{8t!`X6=}Mib?C zOlW_*Ih&^?r4hwBdF+L;lYeE+>yJsQs>|mY_nq94B`&!){Py4wQhxF@KVM5aZlHNs z8}Dg8j*tHS7#>7`w)oGG!`R4?G{4ZRd1bh=veKw>mJNbZyut7?c#h#0Sb148Qd1k5 z0?WleSCnT=8RwS_p5Ii&rTpo}!nUFo)5c--;SoT0GU1%M+9aI$=diBJ_rTGT`K4&T zHVN3>WB$a7!a|n_!zhoGV@j=Mq=>#a0Hms?oU5hfpwe;;wn%@+*uS^Q7iH_UZny7x zkrK2TDkmL+E%zfmvgA8RAy$s;!i;9C1EVUVZhKX$DfPvzZogUWZ* z-KDH;WN}X?kqToJ*$!wB@hrCOtIKt_Op@OSEdFtEi!=KwfU%N+&>(5JarlrGZF8=P z(n&qD>dZL&!Er|-tLfP`<8VHTo)L<{iTjn^FjL9b`rc4`Vbs^=$j&~;Wv7|n|MXQx z171>pI#EX~DV^MU?9iR2^?kLCa@$w3^=V`%N(T8vykuO%cUcrPjhXVOQprqxvuV#j z8T`d}i$>>OrUjfVcoS(ahL})V9QeSyAS3ws(D#-k37WPg?^es};Tjd!eb za<o$Nigb{n$#I4f%A@X;q#D9eoUZkkL@N#woj&O1eOg2^!aID9p*A~w5*CTkB4 zQHlb994+)_VAtgEl!pS19%lptHx!rp_M_%WG zn@uRORG>XkCH)3eB3LSRT(gOa~-~-Az-$9H^n8xCGDQIkO33 z^m3G=$e}6#RlRfvD1aNq&4lAXRmN!(O0KNS34o@TagqUqH4IQh$>0y#_O%-A7EgjJ zAmIR_sA(giU&gX2Cze0Xc9lTK_)<&}ZT0=hmOW*9Nigt>Q3YxE$dUEFrw0jw{)2bjDJ&_+-7I7CJ_h+V^8Ppl4Ys=i)VW;QO(_sP>ph8E;`l%Fz|(Z zsxU~JR46F;d1X1`!u*+bv5b$Q*K2Q0edIL>)cwXvf{xf zfA<5z!cO7e-#X%aG3IA%qa9M2uT`M*;rX!)WI5<+*|N=-A}>I;a63e0?|0iF`7qoz z=h#|SY;pP8@N^@cWEt^;L-6xYNQzZ`RTiil8?+17os}K`l(FYa4rOP}i=HV810go! z;*bVRP(3h;Sr}#WK`%U(1Zx-?myiuiS5Z|1#KoZiah%0WHk@SRy1YWXVT5rB`rlHN zMLgU893dIiG<4U0FJuAGS51*L@gX$Gt+Ka4j%!1$OH@#MhFk9 zHTXxh982Fcl97^Y`7L)Vs=szwZ7n^X)sL{O8^Znlr25Z;=ih;@?OyMYO%;#yx(?(; zPx^*+t-Sj1EZ|RL9sS{*b%pl1d6R_Npcfw$69_oa7jb7ka;aYA-aN?|$nA6`zX6Je zur(#!Hav9NX>vhFVC&UeJGDm;s zZaoEUv2-40VYPi*$*o;8*QJWcar;eC#_>{lll~4Haq3>{#;3x69NxCif*DXpe-LIlI5Av4x zoKyCHM{4Ou(H2_zhez-S^OgC;LMo{k*}ezvdEglLsE~n6upMxzIQOxMxH(}1ASONe zcz7%owW{(cXrH&LfIEh66=3%6ec(T0@Q*<9YonzH;f;%bYMHmS0f6*GVs-6udoG+O z?Q@Wi%wffykSGbH4sFCga)rp27hBkc?<(r+WdM)Gs+;aHmEb`aZwnYD~ zQ&v>E;{bv%A~7X0k?!n^2%B=>r4CC{_Hh_1SZUrQopPP>n* z;o`HSj_RhSK@rvYIx8~MmyZCGCA^Ctq7UNfe=llFnw}t_r#J)hGqCZSGm$ zA}+B%Hs#At=X6LmH^dUEjuHfr#!FoD9B%tQAYUB83udRKN`KFVFM9BltR>mwjqWdL za-QY>*ZfL1kMeBCbsIdZ;z>TJvP`YMtu4Wy|F3QjMA|R=XPg}5h9!iukFh9+cyHN5 zuR8e?t%EkHCr2yOcZSwvJdqK7j3pG}xuaW2?nhna1~hoB)T2$}1{46OBX2OXd5wN# ztZ&oU?0?d-KI@a$E-3=7zECDLH(<&26^HawI-IjhmwHo$78dR6x7|-mx(MEaQb;V9 z*0i$aM|SF!$=2A8ht@fOqV#oY0eJzB9Gj*Y(O*o%E~YeiFmQ`sc;@P{Dp zT5fFpV;U~{Q+t})kTVlBrQVgX-7KPvmB@Y~_d8N1i`?Aonf@XZ#kQOw1h0pzc!r7V zwp9>s$Fyj851>cTYqRYu)TwNe^fi#{xsP<# zt8LnZokxK0GxW&nGnGLar_rMgr;JU+MZ(>jAQN0$7U669#7^hbtALD3e%BPp6G(=|~jxgw44`s#uR`j}exweD7NKoCf)Y2oj=XlPD-vRl$ z0VONW&k}O3o7}#>pOCpcl9z(CK}_jB$@X_jltAI4Cf-jF5THX`x2Yxt<^uDD`->n( zo6qw{qWC}SxO8b3HtgtSix!KuW#0ON=0$2Kkuc!UEO^hD*b$&OyJ<=Miq)(EM~iAn z($K+%{4k+aFxh>--Fhg>VFnAJw`4^6tLHVdp6rH%L%4oa%Gy_nOig|j!SU*fQ{I&R z%JGpi%@MMckFr64zeFZ7xwj6PgbArd+I``R)EGI^B>5+LpK$x{w-$9(G18sbyrSRfApt zS?aB})d!#Iq<%N+RxRaY{bUsN!`~@ zd;i8=hIIZ`e;L*ne?{dTo$~tEo>RnO-i{+emBy}>xJ;8YM*`8?wdvWUg(US3tKT}% z6loF-=i@owuzso?#KAT$yI*dNPNL_JHrEz&* zeD48m_`Qenn%q)y>`WU-a@wb8^i7cvJ6=dGHL5pCZh1uQCOZKV?rP20`*T7jCPK&s zcs?G0ChI=byRmyf8E#eRWeWN#xU|D%L501>7;Oh!m1GnetM!!_;-cg0l&|kW0w1BQ z;i^W}$YFWffX~V9G@-zomsf8-=ndgaIwwBpGAv|UN|jbv%}8CX@itAWw}2CMQnM?H zV#&0id=Z?Uy3ph)VKk03R0b-nBCLRx$7cDhnD`dJAI6z34absv$6U(^PsT~jz?Wc- za{+5tD!)vo*JSe08Av=b5}f!2yZWdis@axL`d6$oS}JT{^}if#?;f>z%8>gCZBvLwG_`X>m*sPm3aS*-{xK2oQXlD>Rw0 zACRcBQZ<0u@uV}sXeGybUIm(qKQowGsVk~-+B9i9%6K2Mis0&6cDmyK@6PSzrqUx| ztkq++E0+GBh@Ea%zU{XrM&+{Zao-nR{>l9=AufLHQ%<9bab`<~ORY4+e`6V5+v9^w zcI*~#7TK6PgQ2F2HCDTTte1i`dBv0=YC}dtBmYSsxRYKKc}FoOzK}IQ39zV3q{W)b zd0B6M>=dbM4H+52xaxErix&<>Yj4dG7uV&Ott6gLw!ywEC7t|_Q$otST9to1Zt>t$ z*wV1}r=VJnTB>E9#^#ZzYYFj_`YZm@ycIs7rltG(yUFJ#6&;7E0gOuzXj#^PT^LS* z>NOL~MAo}T1O;;+f9b+bVDyWD#YF9V{)N^jKDtEBr^cj2gsu8=Mb*^Zy|CUMJ4rTp zd|JFHFbzDs4qov_zhpg_84!N6@^yZM&P#zV)8)?sP1^|6a7qhKElp}9(}E?;rJ?Jg zq%Rz}Ht&y28gVuBd1}yXotB$by7kRlfiQ8Dj;4kbr{ z86{F)3eaQYC(t152*al9z!lnv1Mlsz0yxOj!IJvctWkoPAbm;x++m`i>1&n^oVux5hv zn@0#IJzfoOx^Jl%9o0*umzYY(68a@^Evgta9i(HIEJ~0x>{Mkr7C%dGjBMp)V@4Qi zs8h`Sum`G3Q;Wsby8L-Jn}V^BmaGm)k#e-*$LE-Me!9!79Lof!^3TY?9b=pN`ax{A zFJ~{Fh4l!lnev-5^FInHbWX4^s3*Qj(oI-OH?bYoOVzNS6Zu&lxgSAVFdgFAjOlL< zx~bIF?CBl@VBG!sunLwE2Un<@97u>3`k&u?v{9`U!mm@roVm^X8{ANF)=R|{>dnf- z{wl!9o{&tgzFY>JJZ*Yo-!DM^aFm9KzFWGE<>*n4KbCD8H(hElfz)C8uM@p2Fj1vSLTca?7bmPY<_%BL#~x+a?`d zSTNcV@b=riqtA6w0TD@z4qK!WV=ykMKwPdLnJsbZpY}hwdv{m9m&i3Ap|AqyN68D& z4j+B)%lO^6=qlI9ka9}+&Sw!zW>|xDQw)o7x7m_-e@Y<3CFvDyRiji@c5YyQxExO2 zYUgK5@L{}83iI!%h(XP<|B-y?yLaHr>~=zU-VC;Yni!Q*+yTX+AF0JobJiMZ5i%8P#!7<&;j zwd}fe67`@`i2r0=8?jBvL3>!V+-}@@#rz0ZF`UUvK4bjZw(1&@?w9Y!zP}GAH{nv1 zvVAX3y_@XY?Z7C`^S!GN*kP0yLT}j zw|F#NZYeG1VZW2k&22+%L#eR)@1}>}P<*PX;)YKFwo^`&N4_fYX{5+T@}*Xy$#}Po zOxaZuT`R*aLU||YGZgr8^9FlcgzKdeH??gWEt6?nN6bd0uJwoO0b=3K8wgk@+x&oO zr9?nYN+@8nHY}UBr+;T=LZDe4=d^e3Q#1&7i1En0#NJLGi+X_(dzU;xv?DcYr1POL za{Gs!JYU(I|H?#0HX4hN!q&XPbQB7mr#|M8+>fKBE`VO z_mnl4Dr4el)JJ}1`r%dj77fI$r0$>6axQ72eNZLQPN=81RZ#H!#OIbio7r!WJ`tnR znxX;)DYne%a|tUv)|dp1#kz)hQbylz?)!*P#>&QSG$@Y9DYVg?ib(T!TTRvB%SQmm zCgy%1B+mCC%9Xw;XPA%b56!55Fm>(wTQ^9U{FfZA6$fTZX5C5sVg4!p*FCQU=>pGv zJ*finJ9z%v)EnIzN*WLC20c%ANJ;mxm|vc9l`S*=)wxEg^6)FSv*S|8@ajG(3B0zJ z0{c(>=jFJFdtU{2K^xbR`z`n0rFwjT-Ga6!wt85usSTj_@6*~g6GI#yWfSlYI23S& zlXRKAdND87qiD^;(tM&0t>FtS5dY)QSx0wO@Q~UZyt|`^ao+lBQ4^U^vT#T=UjKn> z(B{Vz#}Cw-&Hgg+IU_8_5h`d>uGi?{5Tgl9SH^M-TG4G_jw`ixW;sbJ*w%3198m|_ z3pWbipH){yBNE1t!#o=*KG7gDTlh|{`1krvU)gYSoZR|c4m5oiG5(_)9Xx@@H#31{B-RH@~xcs&1 z_-;=j5p5xD)_gagedyb)Y_)8(=Rb3!vGv)?Wok-OLttm1Cb+6D_G{Vb2h0c8vuswy z78sH5mIQ3d%d>|?$lNM(jH5r#Xe5Ds=RFtX$lRT~v(JDt|JfWeMzUfvZiAz?TUHsW zF7DW2%7gs^acTKW{099*^Wk|rk*KCqiZ8BdV@2JkUhJ<*mUvtDl-_Jb;yYa}Ru*G3 zAew%!1f=*?*~hn9Fz3x7GdhfQh2bDJpDd;ve}PnTMtSGGz?7S)M|g z6IrGv0lZh#3RhX~+ek{?_|F@iwiIA!@mHJb@EaCnuMPIs9_aPoj3tl?Vxm-|cV zxpW9^ME|B>*$2|QMAUW0^lxi&`hd5swK^(_-y=7}Lt2q}lA{d0!??aSSUOL(W(o_z*=) zxneC}oR1t{Ivbrc1pO0JXU;b#QP-sxhxMPLU&^WV1kI&X^dw|MX@L=CUzw8hCB!aPWXh-$ zqo}>JO>2-=bY!X$3rSR=ueV|Q?J_dV-Y@X+xo5x62%Tz(nqEt2zi31`w^Ua|SovNk zn0ZaSe-|rCku_N}cm7Sr`v z7Y|V2o^JKt#+D9=hpW79k#EED2)JPbS8E>^L8)2jyOM#t`N-aBBBQxM4&edE(0&b$ zswgXHEcs5Rthy~glUTBoMmThkl@@OvMSJn#N#2#naDTfVs! z7##3@eBh<9^mU$lJ#kc)X_cgfxk#WIlQ$AsbQr=)m_wizKaWbEt^)qjeee%s_IzFHk$65UeX_`%64{DC8nrL+6GSOVLMiH^xj73 zF6&LY46Xkrvw~3(7vtUO50)#pQJouL#PE~PVr&ubECg!n{pcc+C9wfVX%xRW5ODb8rB5egUgI2p|jgCL8DP_p;S|1ZsgO$YTQc-=8H;K60_I*_qGo@`zm#3H@AM@hXBN8_kGVbx zcIYyl7sBwzvL*16tt)9kuF&YH`)73wG2o%1@?wKDA|fI|?Yin?i<@O2%*{P(>k{>{ zdxQ#ni=>tfVMPqZ|_IV8R333d0)O1@u&V3(vZG16u89SoW8CBE`}dh;c;UwNP> z04=n!HOqaerW`voa|@Pm2JFX+vx~zb=q$Mp&xvz}oygVM!lw|^tTsVGs^Cey;5*R* zI=T;7Y#>4TpWg+aQ4k)e38M<)z&Z@Sukc@nY%Q_coB1xfv;MgqKVKgD23X)W&mrIBF z{#DQ4yo$Pu>HX_jftg5+;=m-zwFEQpR7LY}b-l`dDW!>N_dTpns?_6^Oj)nJ^opfr zF+Gx{hfe!EKO&eg6KVL}mO7B3{O&)Ft1L#W{n}OEJ^8dm73sLn(w}mSOO{b;jQTd@|Ds)u9)AR=m=IQhESz8k>B|)h{_ILXD?7f-0nK>DIL5R^b6CDVkb>W_KK&SE07X_C^*FCG=DHrDX;{uoMwjLa3IZ=@Cr9c*wkIq8Cb*V8hRK7$QlA7s8hjv z@6W@qH=inl_l^kce?Ld>4+AslVU2=IV(P=afBSAK3&pU2zJA9i_+l-ERKu$Bt!1XL zB6xCik-Tdr!uYBT2FRu(WCIZQ5P!>WD+Zf)!I8-jxYAA>5+X$XI`CY+{|UIa7X`Rz+cfuWM=eR z$`TH*J*eAUJ*HGh^}3TC0~Wdz8_KhWj4&(+Wc|_ase)b=@*Aopdjt%ssuJt#f*vr} z6ihU=3u#v&ecc^C$)Oc*OK_3A4t*DXoVy`UqL6TBa%PYJ@m1X5(u2;CO@nM}Wu9?JFI-TnM z2vuG+rpNU0Nq>#wPh|YsXg_kjye_QsvaF*BuN%ANtCtNU9opzM#p&B=p}Kog@U0@R zjJ98J9A|ZsPKD1((lY_>UlJiSn+{h^ypuZaM=e;KTV_uJ|DN)n^{F`TV1~^#@{7Gunx!Na@ z#_@u$IKXc=Nj3!sOc4gnNkxv+>ix3a8k`+JelBeP+qja(Psj%WZd>yDhlm%ro)5|> zhxitYkf}Pl>*8S{1tHbwus$bMC^UzB%(pJeicF7+6rYq|>CiTm14lPrD%sAI&fSMh zeNRLV3;nF;T5e#*OsE63q%BVztik!Fc%S2M*yoX9xSdjgLHJKH7F;IAxH$HYHg=>o z2rT>Cf)DbWGNyJ5?C_d9PrTCc$J get canceled { List _p = shipments.where((e) => e.status == "Canceled").toList() ..sort((e1, e2) { - return e2.shipDate.compareTo(e1.shipDate); + return e1.shipDate.compareTo(e2.shipDate); }); return _p; } List get completed { - return shipments.where((e) => e.status == "Delivered").toList() + return shipments.where((e) => e.status == "Arrived").toList() ..sort((e1, e2) { - return e2.shipDate.compareTo(e1.shipDate); + return e1.shipDate.compareTo(e2.shipDate); }); } List get upcoming { - return shipments + List _shipments = shipments .where((e) => - e.status == "Pending" || - e.status == "Assigned" || + e.status == "In Progress" || + e.status == "Ready to ship" || e.status == "Processed" || e.status == "Rescheduled") - .toList() - ..sort((e1, e2) { - return e2.shipDate.compareTo(e1.shipDate); - }); + .toList(); + + _shipments.sort((e1, e2) { + return e1.shipDate.compareTo(e2.shipDate); + }); + return _shipments; } void initUser(user) { diff --git a/lib/model_fcs/message_model.dart b/lib/model_fcs/message_model.dart index 23a51cb..4e2e020 100644 --- a/lib/model_fcs/message_model.dart +++ b/lib/model_fcs/message_model.dart @@ -14,51 +14,51 @@ class MessageModel extends BaseModel { List messages = [ Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 1, 1, 1), message: - "Hi Online Buyer, we received your goods. Please see the following link", + "Hi Ko Myo Min, we received your goods. Please see the following link", ), Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 1, 1, 1), message: "'A202-3 #1'", ), Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 1, 5, 1), message: "Thank you. Will check the photos.", isMe: false), Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 2, 1, 1), message: - "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.", + "Hi Ko Myo Min, we successfully processed your goods and ready for payment. Please see in the following link.", ), Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 2, 1, 1), message: "'INV202005010387'", ), Message( senderName: "FCS System", - receiverName: "Online Buyer", + receiverName: "Ko Myo Min", date: DateTime(2020, 6, 1, 2, 10, 1), message: - "Hi Online Buyer, we have confirmed your payment and ready to ship your packages.", + "Hi Ko Myo Min, we have confirmed your payment and ready to ship your packages.", ), Message( senderName: "FCS System", receiverName: "Shipper", date: DateTime(2020, 6, 1, 1, 1, 1), message: - "Hi Online Buyer, we received your goods. Please see in the following link.", + "Hi Ko Myo Min, we received your goods. Please see in the following link.", ), Message( senderName: "FCS System", @@ -72,7 +72,7 @@ class MessageModel extends BaseModel { receiverName: "Shipper", date: DateTime(2020, 6, 1, 2, 1, 1), message: - "Hi Online Buyer, we successfully processed your goods and ready for payment. Please see in the following link.", + "Hi FCS Team, we successfully processed your goods and ready for payment. Please see in the following link.", ), Message( senderName: "FCS System", @@ -86,7 +86,14 @@ class MessageModel extends BaseModel { receiverName: "Shipper", date: DateTime(2020, 6, 1, 2, 10, 1), message: - "Hi Online Buyer, we have confirmed your payment and ready to ship your packages.", + "Hi FCS Team, we have confirmed your payment and ready to ship your packages.", + ), + Message( + senderName: "Ko Myo Min", + receiverName: "FCS Team", + date: DateTime(2020, 6, 1, 2, 10, 1), + message: + "Hi Ko Myo Min, we have recevied your pickup request. We will arrange the pickup soon. Thank you.", ), ]; diff --git a/lib/model_fcs/package_model.dart b/lib/model_fcs/package_model.dart index ada5414..56138d0 100644 --- a/lib/model_fcs/package_model.dart +++ b/lib/model_fcs/package_model.dart @@ -9,78 +9,103 @@ class PackageModel extends BaseModel { final log = Logger('PackageModel'); StreamSubscription listener; - + static List statusHistory = [ + Status(status: "Received", date: DateTime(2020, 6, 1), done: true), + Status(status: "Processed", date: DateTime(2020, 6, 1), done: true), + Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false), + Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false) + ]; List packages = [ - Package( - shipmentNumber: "A202", - receiverNumber: "3", - boxNumber: "1", - rate: 7, - packageType: "General", - weight: 25, - status: "Received", - receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', - arrivedDate: DateTime(2020, 6, 1), - ), Package( shipmentNumber: "A202", receiverNumber: "3", + receiverName: "Ko Oo", + boxNumber: "1", + rate: 7, + packageType: "General", + weight: 25, + status: "Received", + receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', + cargoDesc: "Clothes", + arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory), + Package( + shipmentNumber: "A202", + receiverNumber: "3", + receiverName: "Ko Oo", boxNumber: "2", rate: 7, packageType: "General", weight: 20, status: "Received", + cargoDesc: "Clothes", arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( shipmentNumber: "A202", receiverNumber: "3", + receiverName: "Ko Oo", boxNumber: "3", rate: 7, packageType: "General", weight: 15, - status: "Waiting for payment", + cargoDesc: "Shoes", + status: "Processed", arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( shipmentNumber: "A202", receiverNumber: "2", + receiverName: "Ma Aye", boxNumber: "1", rate: 8, packageType: "Medicine", weight: 15, - status: "Processing", + status: "Processed", + cargoDesc: "Dietary supplement", arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A202", receiverNumber: "2", + receiverName: "Ma Aye", boxNumber: "2", rate: 7, packageType: "General", + cargoDesc: "Handbags", weight: 55, status: "Ready to ship", arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", receiverNumber: "1", + receiverName: "Ko Wai", boxNumber: "1", rate: 9, packageType: "Dangerous", + cargoDesc: "Phones and Scooters", weight: 25, status: "Delivered", arrivedDate: DateTime(2020, 5, 21), + statusHistory: statusHistory, receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", receiverNumber: "1", + receiverName: "Ko Wai", boxNumber: "2", rate: 7, packageType: "General", + cargoDesc: "Construction tools", weight: 5, status: "Delivered", arrivedDate: DateTime(2020, 5, 21), + statusHistory: statusHistory, receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), ]; @@ -94,7 +119,7 @@ class PackageModel extends BaseModel { List get upcoming { return packages .where((e) => - e.status == "Processing" || + e.status == "Processed" || e.status == "Received" || e.status == "Ready to ship") .toList() diff --git a/lib/pages/customer_list.dart b/lib/pages/customer_list.dart index 89ef6aa..dadd357 100644 --- a/lib/pages/customer_list.dart +++ b/lib/pages/customer_list.dart @@ -83,7 +83,7 @@ class _CustomerListState extends State { padding: new EdgeInsets.symmetric( horizontal: 32.0 - dotSize / 2), child: Icon( - Feather.users, + Feather.user, color: primaryColor, size: 40, ), diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index a097aaa..ea75c0d 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -103,13 +103,16 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { login = Provider.of(context).isLogin(); + var owner = Provider.of(context).isOwner(); + var customer = Provider.of(context).isCustomer(); + final packagesBtn = _buildBtn2("package.name", icon: Octicons.package, btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(PackageList()))); final pickUpBtn = _buildBtn2("pickup", - icon: MaterialCommunityIcons.directions, + icon: SimpleLineIcons.direction, btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(PickUpList()))); @@ -118,7 +121,7 @@ class _HomePageState extends State { btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(ShipmentRates()))); - final fcsProfileBtn = _buildBtn2("profile.title", + final fcsProfileBtn = _buildBtn2("fcs.btn", // imgIcon: Image.asset("assets/logo_btn.png", height: 25,color:Colors.white), icon: MaterialCommunityIcons.home_city, btnCallback: () => @@ -171,16 +174,16 @@ class _HomePageState extends State { Navigator.of(context).push(BottomUpPageRoute(Term()))); List widgets = []; - widgets.add(buyingBtn); - widgets.add(pickUpBtn); - widgets.add(shipmentBtn); - widgets.add(notiBtn); - widgets.add(staffBtn); - widgets.add(fcsProfileBtn); + customer ? widgets.add(buyingBtn) : ""; + customer || owner ? widgets.add(pickUpBtn) : ""; + owner ? widgets.add(shipmentBtn) : ""; + customer || owner ? widgets.add(notiBtn) : ""; + owner ? widgets.add(staffBtn) : ""; + owner ? widgets.add(fcsProfileBtn) : ""; widgets.add(shipmentCostBtn); - widgets.add(packagesBtn); - widgets.add(customersBtn); - widgets.add(invoicesBtn); + customer || owner ? widgets.add(packagesBtn) : ""; + owner ? widgets.add(customersBtn) : ""; + customer || owner ? widgets.add(invoicesBtn) : ""; widgets.add(termBtn); return OfflineRedirect( diff --git a/lib/pages/invoice/invoice_editor.dart b/lib/pages/invoice/invoice_editor.dart index 43529e2..8ce8efc 100644 --- a/lib/pages/invoice/invoice_editor.dart +++ b/lib/pages/invoice/invoice_editor.dart @@ -10,6 +10,7 @@ import 'package:fcs/widget/multi_img_file.dart'; import 'package:fcs/widget/my_data_table.dart'; import 'package:fcs/widget/progress.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -48,7 +49,7 @@ class _InvoiceEditorState extends State { _dateController.text = dateFormatter.format(_invoice.invoiceDate); _nameController.text = _invoice.customerName; _phoneController.text = _invoice.customerPhoneNumber; - _amountController.text = _invoice.amount.toString(); + _amountController.text = _invoice.getAmount.toString(); _statusController.text = _invoice.status.toString(); _packages = _invoice.packages; } else { @@ -123,8 +124,8 @@ class _InvoiceEditorState extends State { enabledBorder: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( - Icons.pages, - color: Colors.grey, + FontAwesomeIcons.fileInvoice, + color: primaryColor, ), )), ), @@ -132,7 +133,7 @@ class _InvoiceEditorState extends State { ? Container( padding: EdgeInsets.only(top: 5), child: TextFormField( - initialValue: "U Nyi", + initialValue: "Ko Myo Min", cursorColor: primaryColor, decoration: InputDecoration( fillColor: Colors.white, @@ -144,8 +145,8 @@ class _InvoiceEditorState extends State { borderSide: BorderSide( color: Colors.grey, width: 1.0)), icon: Icon( - Icons.account_box, - color: Colors.grey, + FontAwesomeIcons.fileInvoice, + color: primaryColor, ), suffixIcon: IconButton( icon: Icon( @@ -167,34 +168,34 @@ class _InvoiceEditorState extends State { fillColor: Colors.white, labelText: 'Customer Name', labelStyle: - TextStyle(fontSize: 16, color: Colors.grey), + TextStyle(fontSize: 16, color: primaryColor), filled: true, enabledBorder: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( - Icons.account_box, - color: Colors.grey, + Feather.user, + color: primaryColor, ), )), ), - widget.invoice == null - ? Container() - : TextFormField( - controller: _phoneController, - readOnly: true, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Customer Phone Number', - labelStyle: - TextStyle(fontSize: 16, color: Colors.grey), - filled: true, - enabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - icon: Icon( - Icons.phone, - color: Colors.grey, - ), - )), + // widget.invoice == null + // ? Container() + // : TextFormField( + // controller: _phoneController, + // readOnly: true, + // decoration: InputDecoration( + // fillColor: Colors.white, + // labelText: 'Customer Phone Number', + // labelStyle: + // TextStyle(fontSize: 16, color: Colors.grey), + // filled: true, + // enabledBorder: InputBorder.none, + // focusedBorder: InputBorder.none, + // icon: Icon( + // Icons.phone, + // color: Colors.grey, + // ), + // )), Container( padding: EdgeInsets.only(top: 0), child: fcsInput('Amount', FontAwesomeIcons.moneyBill, @@ -215,12 +216,7 @@ class _InvoiceEditorState extends State { fillColor: Colors.white, labelText: 'Status', filled: true, - icon: Image.asset( - 'assets/status.png', - width: 24, - height: 24, - color: Colors.grey[700], - ), + icon: Icon(Icons.av_timer,color: primaryColor,), )), ), SizedBox( diff --git a/lib/pages/message_detail.dart b/lib/pages/message_detail.dart index 82ce76b..1af2130 100644 --- a/lib/pages/message_detail.dart +++ b/lib/pages/message_detail.dart @@ -90,7 +90,7 @@ class MessageDetail extends StatelessWidget { message: e.message, time: dateFormat.format(e.date), delivered: true, - isMe: e.isMe != null ? e.isMe : true)) + isMe: !(e.isMe != null ? e.isMe : true))) .toList(); return Scaffold( diff --git a/lib/pages/pickup_editor.dart b/lib/pages/pickup_editor.dart index 0ab7506..474e5e3 100644 --- a/lib/pages/pickup_editor.dart +++ b/lib/pages/pickup_editor.dart @@ -45,11 +45,13 @@ class _PickUpEditorState extends State { PickUp _pickUp; bool _isLoading = false; var now = new DateTime.now(); + bool isNew; @override void initState() { super.initState(); if (widget.pickUp != null) { + isNew = false; _pickUp = widget.pickUp; _addressEditingController.text = _pickUp.address; _fromTimeEditingController.text = _pickUp.fromTime; @@ -63,6 +65,8 @@ class _PickUpEditorState extends State { _recipientPhoneEditingController.text = mainModel.recipient.phoneNumber; _recipientAddressEditingController.text = mainModel.recipient.shippingAddress; + } else { + isNew = true; } } @@ -190,7 +194,7 @@ class _PickUpEditorState extends State { EdgeInsets.symmetric(vertical: 10.0, horizontal: 0.0), icon: Icon( Icons.date_range, - color: Colors.grey, + color: primaryColor, )), validator: (value) { if (value.isEmpty) { @@ -224,18 +228,20 @@ class _PickUpEditorState extends State { child: ListView(children: [ Center(child: nameWidget(mainModel.customer.name)), Center(child: nameWidget(mainModel.customer.phoneNumber)), - Center( - child: Padding( - padding: const EdgeInsets.only(left: 10.0, top: 8), - child: Text( - '#P200304', - style: TextStyle( - color: Colors.black87, - fontSize: 14, - fontWeight: FontWeight.bold), - ), - ), - ), + isNew + ? Container() + : Center( + child: Padding( + padding: const EdgeInsets.only(left: 10.0, top: 8), + child: Text( + '#P200304', + style: TextStyle( + color: Colors.black87, + fontSize: 14, + fontWeight: FontWeight.bold), + ), + ), + ), ExpansionTile( title: Text('Pickup Location / Time'), children: [ diff --git a/lib/pages/pickup_list_row.dart b/lib/pages/pickup_list_row.dart index 50bb797..21528d8 100644 --- a/lib/pages/pickup_list_row.dart +++ b/lib/pages/pickup_list_row.dart @@ -58,7 +58,7 @@ class _PickupListRowState extends State { Padding( padding: EdgeInsets.all(5.0), child: Icon( - MaterialCommunityIcons.directions, + SimpleLineIcons.direction, color: primaryColor, )), new Expanded( diff --git a/lib/pages/profile_page.dart b/lib/pages/profile_page.dart index 9a29673..5042941 100644 --- a/lib/pages/profile_page.dart +++ b/lib/pages/profile_page.dart @@ -254,27 +254,6 @@ class _ProfileState extends State { ), ), )); - Future getVersionNumber() async { - PackageInfo packageInfo = await PackageInfo.fromPlatform(); - String version = packageInfo.version + "+" + packageInfo.buildNumber; - - return version; - } - - final versionbox = Container( - padding: EdgeInsets.only(top: 15), - child: Container( - child: Center( - child: FutureBuilder( - future: getVersionNumber(), - builder: (BuildContext context, AsyncSnapshot snapshot) => - Text( - snapshot.hasData ? "v${snapshot.data}" : "Loading ...", - style: TextStyle(fontSize: 16.0, fontStyle: FontStyle.normal), - ), - )), - )); - return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( diff --git a/lib/pages/shipment_editor.dart b/lib/pages/shipment_editor.dart index b356a1d..82bee4e 100644 --- a/lib/pages/shipment_editor.dart +++ b/lib/pages/shipment_editor.dart @@ -266,7 +266,7 @@ class _ShipmentEditorState extends State { child: ListView(children: [ // _showCustomerData(mainModel.customer), widget.shipment == null - ? fcsInput('Shipment Number', Icons.text_rotation_none, + ? fcsInput('Shipment Number', Ionicons.ios_airplane, controller: _shipmentNumberController) : Container( child: TextFormField( @@ -281,8 +281,8 @@ class _ShipmentEditorState extends State { enabledBorder: InputBorder.none, focusedBorder: InputBorder.none, icon: Icon( - Icons.text_rotation_none, - color: Colors.grey, + Ionicons.ios_airplane, + color: primaryColor, ), )), ), @@ -293,26 +293,6 @@ class _ShipmentEditorState extends State { controller: _cutoffDateController), ) : Container(), - widget.shipment == null - ? Container( - padding: EdgeInsets.only(top: 5), - child: DropdownButtonFormField( - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Shipment Type', - icon: Icon(Icons.pages)), - items: shipmentModel.shipmentType - .map((e) => - DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (selected) => { - setState(() { - _currentShipment = selected; - }) - }, - ), - ) - : Container(), Container( padding: EdgeInsets.only(top: widget.shipment == null ? 5 : 0), @@ -324,6 +304,28 @@ class _ShipmentEditorState extends State { child: fcsInput('Departure Date', Icons.date_range, controller: _departureDateControler), ), + widget.shipment == null + ? Container( + padding: EdgeInsets.only(top: 5), + child: DropdownButtonFormField( + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Shipment Type', + icon: Icon(Ionicons.ios_airplane, + color: primaryColor)), + items: shipmentModel.shipmentType + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (selected) => { + setState(() { + _currentShipment = selected; + }) + }, + ), + ) + : Container(), + widget.shipment == null ? Container( padding: EdgeInsets.only(top: 5), @@ -355,21 +357,16 @@ class _ShipmentEditorState extends State { controller: _statusController, cursorColor: primaryColor, decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Status', - filled: true, - labelStyle: - TextStyle(fontSize: 16, color: Colors.grey), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: Colors.grey, width: 1.0)), - icon: Image.asset( - 'assets/status.png', - width: 24, - height: 24, - color: Colors.grey[700], - ), - )), + fillColor: Colors.white, + labelText: 'Status', + filled: true, + labelStyle: TextStyle( + fontSize: 16, color: Colors.grey), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: Colors.grey, width: 1.0)), + icon: Icon(Icons.av_timer, + color: primaryColor))), ), widget.shipment == null ? Container() diff --git a/lib/pages/util.dart b/lib/pages/util.dart index 9b3d251..9249773 100644 --- a/lib/pages/util.dart +++ b/lib/pages/util.dart @@ -381,7 +381,7 @@ Widget nameWidget(String name) { child: Text( name, style: TextStyle( - color: Colors.black87, fontSize: 18, fontWeight: FontWeight.bold), + color: Colors.black87, fontSize: 18, fontWeight: FontWeight.bold), ), ), ); @@ -417,7 +417,7 @@ Widget fcsInput(String label, IconData iconData, filled: true, icon: Icon( iconData, - color: Colors.grey, + color: primaryColor, ), focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: Colors.grey, width: 1.0)), diff --git a/lib/pages_fcs/package_editor.dart b/lib/pages_fcs/package_editor.dart index a4731a9..ded5c8a 100644 --- a/lib/pages_fcs/package_editor.dart +++ b/lib/pages_fcs/package_editor.dart @@ -1,12 +1,13 @@ -import 'package:fcs/model/main_model.dart'; -import 'package:fcs/model/pickup_model.dart'; import 'package:fcs/pages/util.dart'; import 'package:fcs/vo/package.dart'; import 'package:fcs/widget/localization/app_translations.dart'; import 'package:fcs/widget/progress.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; +import 'package:intl/intl.dart'; +import 'package:timeline_list/timeline.dart'; +import 'package:timeline_list/timeline_model.dart'; import '../theme/theme.dart'; @@ -29,18 +30,26 @@ class _PackageEditorState extends State { Package _package; bool _isLoading = false; + List _images = [ + "assets/photos/1.jpg", + "assets/photos/2.jpg", + "assets/photos/3.jpg" + ]; + bool isNew; @override void initState() { super.initState(); if (widget.package != null) { _package = widget.package; + isNew = false; // _addressEditingController.text = _pickUp.address; // _fromTimeEditingController.text = _pickUp.fromTime; // _toTimeEditingController.text = _pickUp.toTime; // _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString(); // _weightEditingController.text = _pickUp.weight.toString(); } else { + isNew = true; _package = Package(rate: 0, weight: 0); } } @@ -50,8 +59,48 @@ class _PackageEditorState extends State { super.dispose(); } + final DateFormat dateFormat = DateFormat("d MMM yyyy"); + List _models() { + return _package.statusHistory + .map((e) => TimelineModel( + Padding( + padding: const EdgeInsets.all(18.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(e.status, + style: TextStyle( + color: e.done ? primaryColor : Colors.grey, + fontSize: 16, + fontWeight: FontWeight.bold)), + e.status == "Processed" + ? Text("(Waiting for payment)", + style: TextStyle( + color: e.done ? primaryColor : Colors.grey, + fontSize: 14, + fontWeight: FontWeight.bold)) + : Container(), + Text(dateFormat.format(e.date)), + ], + ), + ), + iconBackground: e.done ? primaryColor : Colors.grey, + icon: Icon( + e.status == "Shipped" + ? Ionicons.ios_airplane + : e.status == "Delivered" + ? MaterialCommunityIcons.truck_fast + : e.status == "Processed" + ? MaterialIcons.check + : Octicons.package, + color: Colors.white, + ))) + .toList(); + } + @override Widget build(BuildContext context) { + var images = isNew ? [] : _images; return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( @@ -67,26 +116,31 @@ class _PackageEditorState extends State { body: Card( child: Column( children: [ + widget.package == null + ? Center( + child: Container( + padding: EdgeInsets.all(8), + child: Text("New Package"))) + : Center(child: nameWidget(_package.packageNumber)), Expanded( child: ListView( children: [ - widget.package == null - ? Center( - child: Container( - padding: EdgeInsets.all(8), - child: Text("New Package"))) - : Center(child: nameWidget(_package.packageNumber)), ExpansionTile( - title: Text('Package Information'), + title: Text( + 'Receiving', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), children: [ Padding( - padding: const EdgeInsets.only(left: 20.0), + padding: const EdgeInsets.only(left: 20.0, right: 20), child: DropdownButtonFormField( value: _package.shipmentNumber, decoration: InputDecoration( fillColor: Colors.white, labelText: 'Shipment Number', - icon: Icon(Icons.pages) + icon: Icon(Ionicons.ios_airplane, + color: primaryColor) // prefixIcon: Icon(Icons.play_arrow) ), items: ["A102", "A103", "A201", "A202"] @@ -97,92 +151,44 @@ class _PackageEditorState extends State { ), ), Padding( - padding: const EdgeInsets.only(left: 20.0), + padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( - initialValue: "FCS383-283-1", + initialValue: isNew ? "" : "FCS383-283-1", decoration: InputDecoration( fillColor: Colors.white, labelText: 'FCS_ID', hintText: 'FCS_ID', filled: true, - icon: Icon( - Icons.account_box, - ), + icon: Icon(Feather.user, color: primaryColor), suffixIcon: IconButton( icon: Icon(Icons.search), onPressed: () {})), ), ), Padding( - padding: const EdgeInsets.only(left: 20.0), - child: DropdownButtonFormField( - value: _package.packageType, + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _package.receiverName, decoration: InputDecoration( fillColor: Colors.white, - labelText: 'Cargo Type', - icon: Icon(Icons.pages) - // prefixIcon: Icon(Icons.play_arrow) - ), - items: ["General", "Medicine", "Dangerous"] - .map((e) => - DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, + labelText: 'Customer Name', + filled: true, + icon: Icon(Feather.user, color: Colors.white), + suffixIcon: IconButton( + icon: Icon(Icons.search), + onPressed: () {})), ), ), Padding( - padding: const EdgeInsets.only(left: 20.0), + padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( - initialValue: _package.weight.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Weight', - filled: true, - icon: Icon( - FontAwesomeIcons.weightHanging, - ), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0), - child: TextFormField( - initialValue: _package.rate.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Rate', - filled: true, - icon: Icon( - FontAwesomeIcons.tag, - ), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0), - child: TextFormField( - initialValue: _package.amount.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Amount', - filled: true, - icon: Icon( - FontAwesomeIcons.moneyBill, - ), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0), - child: TextFormField( - initialValue: "P0203", + initialValue: isNew ? "" : "P0203", decoration: InputDecoration( fillColor: Colors.white, labelText: 'Pickup ID', filled: true, - icon: Icon( - Icons.account_box, - ), + icon: Icon(MaterialCommunityIcons.directions, + color: primaryColor), suffixIcon: IconButton( icon: Icon(Icons.search), onPressed: () {})), @@ -191,35 +197,152 @@ class _PackageEditorState extends State { ], ), ExpansionTile( - title: Text('Photos'), + title: Text( + 'Processing', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), + children: [ + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: DropdownButtonFormField( + value: _package.packageType, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Cargo Type', + icon: Icon(Entypo.box, color: primaryColor)), + items: ["General", "Medicine", "Dangerous"] + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: + isNew ? "" : _package.cargoDesc.toString(), + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Description', + filled: true, + icon: Icon(MaterialIcons.description, + color: primaryColor), + )), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _package.weight.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Weight', + filled: true, + icon: Icon(FontAwesomeIcons.weightHanging, + color: primaryColor), + )), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _package.rate.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Rate', + filled: true, + icon: Icon(FontAwesomeIcons.tag, + color: primaryColor), + )), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _package.amount.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Amount', + filled: true, + icon: Icon(FontAwesomeIcons.moneyBill, + color: primaryColor), + )), + ), + ], + ), + ExpansionTile( + title: Text( + 'Photos', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), children: [ Container( height: 130, width: 500, - child: ListView( - // scrollDirection: Axis.horizontal, - children: [ - Padding( - padding: const EdgeInsets.only(left: 20.0), - child: DropdownButtonFormField( - value: _package.shipmentNumber, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Shipment Number', - icon: Icon(Icons.pages) - // prefixIcon: Icon(Icons.play_arrow) + child: ListView.separated( + separatorBuilder: (context, index) => Divider( + color: Colors.black, + ), + itemCount: images.length + 1, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + if (index == images.length) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 200, + height: 70, + decoration: BoxDecoration( + border: Border.all( + color: primaryColor, + width: 2.0, ), - items: ["A102", "A103", "A201", "A202"] - .map((e) => DropdownMenuItem( - child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, - ), - ), - ], + ), + child: Icon(SimpleLineIcons.plus), + ), + ); + } else { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 200, + height: 70, + decoration: BoxDecoration( + border: Border.all( + color: primaryColor, + width: 2.0, + ), + ), + child: Image.asset(images[index], + width: 50, height: 50), + ), + ); + } + }, ), ), ], + ), + ExpansionTile( + title: Text( + 'Status', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), + children: [ + Container( + height: 500, + padding: EdgeInsets.only(left: 20), + child: isNew + ? Container() + : Timeline( + children: _models(), + position: TimelinePosition.Left), + ), + ], ) ], ), @@ -231,7 +354,7 @@ class _PackageEditorState extends State { child: Container( width: 250, child: FlatButton( - child: Text('Create package'), + child: Text('Complete receiving'), color: primaryColor, textColor: Colors.white, onPressed: () { @@ -248,7 +371,7 @@ class _PackageEditorState extends State { child: Container( width: 250, child: FlatButton( - child: Text('Save package'), + child: Text('Complete processing'), color: primaryColor, textColor: Colors.white, onPressed: () { diff --git a/lib/vo/invoice.dart b/lib/vo/invoice.dart index f5257f2..57f7c6b 100644 --- a/lib/vo/invoice.dart +++ b/lib/vo/invoice.dart @@ -21,4 +21,6 @@ class Invoice { this.status, this.paymentAttachment, this.packages}); + + double get getAmount => packages.fold(0, (p, e) => (e.rate * e.weight) + p); } diff --git a/lib/vo/package.dart b/lib/vo/package.dart index 5133e6f..39d6105 100644 --- a/lib/vo/package.dart +++ b/lib/vo/package.dart @@ -1,3 +1,10 @@ +class Status { + String status; + DateTime date; + bool done; + Status({this.status, this.date, this.done}); +} + class Package { String id; String shipmentNumber; @@ -9,6 +16,7 @@ class Package { String receiverNumber; String boxNumber; String status; + String cargoDesc; int rate; int weight; @@ -24,6 +32,8 @@ class Package { shipmentNumber + "-" + receiverNumber + " #" + boxNumber; double get price => rate.toDouble() * weight; + List statusHistory; + Package( {this.id, this.shipmentNumber, @@ -40,5 +50,7 @@ class Package { this.pickUpID, this.remark, this.status, - this.arrivedDate}); + this.arrivedDate, + this.cargoDesc, + this.statusHistory}); } diff --git a/pubspec.lock b/pubspec.lock index dfef100..24067a4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -693,6 +693,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.15" + timeline_list: + dependency: "direct main" + description: + name: timeline_list + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.5" typed_data: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 470f2bb..6eb6df6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -66,6 +66,9 @@ dependencies: pin_input_text_field: flutter_icons: ^1.1.0 country_icons: ^1.1.1 + timeline_list: ^0.0.5 + + dev_dependencies: flutter_test: @@ -76,6 +79,7 @@ flutter: assets: - assets/ - assets/local/ + - assets/photos/ fonts: From 752e38edf2ab5a5f3591e1ae9e19d7f122965b92 Mon Sep 17 00:00:00 2001 From: Sai Naw Wun Date: Thu, 4 Jun 2020 01:36:49 +0630 Subject: [PATCH 3/3] v3 --- assets/local/localization_en.json | 15 +- lib/app.dart | 4 + lib/model_fcs/box_model.dart | 153 ++++++++++ lib/model_fcs/package_model.dart | 60 ++-- lib/pages/home_page.dart | 7 + lib/pages/invoice/invoce_list.dart | 2 +- lib/pages/invoice/invoice_editor.dart | 15 +- lib/pages/pickup_editor.dart | 5 +- lib/pages/shipment_rates.dart | 2 +- lib/pages_fcs/box_editor.dart | 407 ++++++++++++++++++++++++++ lib/pages_fcs/box_list.dart | 146 +++++++++ lib/pages_fcs/box_list_row.dart | 119 ++++++++ lib/pages_fcs/package_editor.dart | 323 ++++++++------------ lib/pages_fcs/package_list.dart | 4 +- lib/pages_fcs/package_list_row.dart | 25 +- lib/vo/box.dart | 61 ++++ lib/vo/package.dart | 21 +- 17 files changed, 1114 insertions(+), 255 deletions(-) create mode 100644 lib/model_fcs/box_model.dart create mode 100644 lib/pages_fcs/box_editor.dart create mode 100644 lib/pages_fcs/box_list.dart create mode 100644 lib/pages_fcs/box_list_row.dart create mode 100644 lib/vo/box.dart diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 254bb26..fa7be69 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -513,14 +513,23 @@ "rate.edit.title":"EDIT RATES", - "rate.cal.title":"CALCULATE RATES", + "rate.cal.title":"ESTIMATE SHIPPING COST", + + "boxes.name":"Boxes", + "boxes.title":"BOXES", + "boxes.new":"New Box", + "box.edit.title":"BOX", + "box.package.id":"Package ID", + "box.package.desc":"Description", + "box.package.market":"Market", + "box.add_package":"Add Package", "package.name":"Packages", "package.title":"PACKAGES", "package.new":"New Package", "package.edit.title":"PACKAGE", "package.arrival.date":"Arrival Date", - "package.number":"Package Number", + "package.number":"Box Number", "package.rate":"Rate", "package.weight":"Weight", "package.amount":"Amount", @@ -542,7 +551,7 @@ "invoices.add":"New Invoice", "invoice.form.title":"INVOICE", "invoice.payment":"Payment Receipt", - "invoice.add_package":"Add Package", + "invoice.add_box":"Add Box", "term":"TERMS", "term.btn":"Terms", diff --git a/lib/app.dart b/lib/app.dart index 722c251..29fec3e 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -33,6 +33,7 @@ import 'model/product_model.dart'; import 'model/report_user_model.dart'; import 'model/shipment_rate_model.dart'; import 'model/user_model.dart'; +import 'model_fcs/box_model.dart'; import 'pages/home_page.dart'; import 'pages/splash.dart'; import 'pages/term.dart'; @@ -71,6 +72,7 @@ class _AppState extends State { final ShipmentRateModel shipmentRateModel = new ShipmentRateModel(); final ShipmentModel shipmentModel = new ShipmentModel(); final PackageModel packageModel=new PackageModel(); + final BoxModel boxModel=new BoxModel(); final MessageModel messageModel=new MessageModel(); final InvoiceModel invoiceModel = new InvoiceModel(); final CustomerModel customerModel = new CustomerModel(); @@ -108,6 +110,7 @@ class _AppState extends State { ..addModel(shipmentRateModel) ..addModel(shipmentModel) ..addModel(packageModel) + ..addModel(boxModel) ..addModel(messageModel) ..addModel(shipmentRateModel) ..addModel(invoiceModel) @@ -164,6 +167,7 @@ class _AppState extends State { ChangeNotifierProvider(builder: (context) => shipmentRateModel), ChangeNotifierProvider(builder: (context) => shipmentModel), ChangeNotifierProvider(builder: (context) => packageModel), + ChangeNotifierProvider(builder: (context) => boxModel), ChangeNotifierProvider(builder: (context) => messageModel), ChangeNotifierProvider(builder: (context) => invoiceModel), ChangeNotifierProvider(builder: (context) => customerModel), diff --git a/lib/model_fcs/box_model.dart b/lib/model_fcs/box_model.dart new file mode 100644 index 0000000..96d3b91 --- /dev/null +++ b/lib/model_fcs/box_model.dart @@ -0,0 +1,153 @@ +import 'dart:async'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/model/base_model.dart'; +import 'package:fcs/model_fcs/package_model.dart'; +import 'package:fcs/vo/box.dart'; +import 'package:fcs/vo/package.dart'; +import 'package:logging/logging.dart'; + +class BoxModel extends BaseModel { + final log = Logger('BoxModel'); + + StreamSubscription listener; + static List statusHistory = [ + Status(status: "Packed", date: DateTime(2020, 6, 1), done: true), + Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false), + Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false) + ]; + static List packages = [ + PackageModel.packages[0], + PackageModel.packages[1], + PackageModel.packages[2] + ]; + List boxes = [ + Box( + shipmentNumber: "A202", + receiverNumber: "3", + receiverName: "Ko Myo Min", + boxNumber: "1", + rate: 7, + packageType: "General", + weight: 25, + status: "Packed", + receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', + cargoDesc: "Clothes", + arrivedDate: DateTime(2020, 6, 1), + packages: packages, + statusHistory: statusHistory), + Box( + shipmentNumber: "A202", + receiverNumber: "3", + receiverName: "Ko Myo Min", + boxNumber: "2", + rate: 7, + packageType: "General", + weight: 20, + status: "Packed", + cargoDesc: "Clothes", + arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), + Box( + shipmentNumber: "A202", + receiverNumber: "3", + receiverName: "Ko Myo Min", + boxNumber: "3", + rate: 7, + packageType: "General", + weight: 15, + cargoDesc: "Shoes", + status: "Packed", + arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), + Box( + shipmentNumber: "A202", + receiverNumber: "2", + receiverName: "Ma Aye", + boxNumber: "1", + rate: 8, + packageType: "Medicine", + weight: 15, + status: "Packed", + cargoDesc: "Dietary supplement", + arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), + Box( + shipmentNumber: "A202", + receiverNumber: "2", + receiverName: "Ma Aye", + boxNumber: "2", + rate: 7, + packageType: "General", + cargoDesc: "Handbags", + weight: 55, + status: "Shipped", + arrivedDate: DateTime(2020, 6, 1), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), + Box( + shipmentNumber: "A201", + receiverNumber: "1", + receiverName: "Ko Wai", + boxNumber: "1", + rate: 9, + packageType: "Dangerous", + cargoDesc: "Phones and Scooters", + weight: 25, + status: "Delivered", + arrivedDate: DateTime(2020, 5, 21), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), + Box( + shipmentNumber: "A201", + receiverNumber: "1", + receiverName: "Ko Wai", + boxNumber: "2", + rate: 7, + packageType: "General", + cargoDesc: "Construction tools", + weight: 5, + status: "Delivered", + arrivedDate: DateTime(2020, 5, 21), + statusHistory: statusHistory, + packages: packages, + receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), + ]; + + List get completed { + return boxes.where((e) => e.status == "Delivered").toList() + ..sort((e1, e2) { + return e2.packageNumber.compareTo(e1.packageNumber); + }); + } + + List get upcoming { + return boxes + .where((e) => + e.status == "Packed" || + e.status == "Received" || + e.status == "Shipped") + .toList() + ..sort((e1, e2) { + return e2.packageNumber.compareTo(e1.packageNumber); + }); + } + + void initUser(user) { + super.initUser(user); + } + + @override + logout() async { + if (listener != null) await listener.cancel(); + boxes = []; + } +} diff --git a/lib/model_fcs/package_model.dart b/lib/model_fcs/package_model.dart index 56138d0..7c17b02 100644 --- a/lib/model_fcs/package_model.dart +++ b/lib/model_fcs/package_model.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/model/base_model.dart'; +import 'package:fcs/vo/box.dart'; import 'package:fcs/vo/package.dart'; import 'package:logging/logging.dart'; @@ -15,24 +16,26 @@ class PackageModel extends BaseModel { Status(status: "Shipped", date: DateTime(2020, 6, 5), done: false), Status(status: "Delivered", date: DateTime(2020, 6, 15), done: false) ]; - List packages = [ + static List packages = [ Package( shipmentNumber: "A202", receiverNumber: "3", - receiverName: "Ko Oo", + receiverName: "Ko Myo Min", boxNumber: "1", rate: 7, packageType: "General", weight: 25, status: "Received", receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', - cargoDesc: "Clothes", + cargoDesc: "Computers", arrivedDate: DateTime(2020, 6, 1), - statusHistory: statusHistory), + market: "Amazon", + id: "PKG2039", + trackingID: "23-234s-asdfl"), Package( shipmentNumber: "A202", receiverNumber: "3", - receiverName: "Ko Oo", + receiverName: "Ko Myo Min", boxNumber: "2", rate: 7, packageType: "General", @@ -40,20 +43,24 @@ class PackageModel extends BaseModel { status: "Received", cargoDesc: "Clothes", arrivedDate: DateTime(2020, 6, 1), - statusHistory: statusHistory, + market: "Macy", + trackingID: "asd-sdf-23498", + id: "PKG2040", receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( shipmentNumber: "A202", receiverNumber: "3", - receiverName: "Ko Oo", + receiverName: "Ko Myo Min", boxNumber: "3", rate: 7, packageType: "General", weight: 15, cargoDesc: "Shoes", status: "Processed", + market: "Macy", + trackingID: "8923-234-sd", + id: "PKG2041", arrivedDate: DateTime(2020, 6, 1), - statusHistory: statusHistory, receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( shipmentNumber: "A202", @@ -64,9 +71,11 @@ class PackageModel extends BaseModel { packageType: "Medicine", weight: 15, status: "Processed", + market: "Macy", + trackingID: "lsdf-sd09sdf", cargoDesc: "Dietary supplement", + id: "PKG2042", arrivedDate: DateTime(2020, 6, 1), - statusHistory: statusHistory, receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A202", @@ -77,9 +86,11 @@ class PackageModel extends BaseModel { packageType: "General", cargoDesc: "Handbags", weight: 55, - status: "Ready to ship", + market: "Macy", + trackingID: "234-sdflsdf-213", + status: "Processed", + id: "PKG2043", arrivedDate: DateTime(2020, 6, 1), - statusHistory: statusHistory, receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", @@ -90,9 +101,11 @@ class PackageModel extends BaseModel { packageType: "Dangerous", cargoDesc: "Phones and Scooters", weight: 25, - status: "Delivered", + status: "Received", + market: "Amazon", + trackingID: "sdf-asdf-23489", + id: "PKG2044", arrivedDate: DateTime(2020, 5, 21), - statusHistory: statusHistory, receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", @@ -103,29 +116,26 @@ class PackageModel extends BaseModel { packageType: "General", cargoDesc: "Construction tools", weight: 5, - status: "Delivered", + status: "Processed", + market: "Amazon", + id: "PKG2045", + trackingID: "oiuw-sdfpo-234", arrivedDate: DateTime(2020, 5, 21), - statusHistory: statusHistory, receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), ]; List get completed { - return packages.where((e) => e.status == "Delivered").toList() + return packages.where((e) => e.status == "Processed").toList() ..sort((e1, e2) { return e2.packageNumber.compareTo(e1.packageNumber); }); } List get upcoming { - return packages - .where((e) => - e.status == "Processed" || - e.status == "Received" || - e.status == "Ready to ship") - .toList() - ..sort((e1, e2) { - return e2.packageNumber.compareTo(e1.packageNumber); - }); + return packages.where((e) => e.status == "Received").toList() + ..sort((e1, e2) { + return e2.packageNumber.compareTo(e1.packageNumber); + }); } void initUser(user) { diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index ea75c0d..88636e6 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,6 +1,7 @@ import 'package:country_code_picker/country_code.dart'; import 'package:fcs/model/main_model.dart'; import 'package:fcs/pages/shipment_list.dart'; +import 'package:fcs/pages_fcs/box_list.dart'; import 'package:fcs/pages_fcs/package_list.dart'; import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:fcs/widget/localization/transalation.dart'; @@ -111,6 +112,11 @@ class _HomePageState extends State { btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(PackageList()))); + final boxesBtn = _buildBtn2("boxes.name", + icon: MaterialCommunityIcons.package, + btnCallback: () => + Navigator.of(context).push(BottomUpPageRoute(BoxList()))); + final pickUpBtn = _buildBtn2("pickup", icon: SimpleLineIcons.direction, btnCallback: () => @@ -182,6 +188,7 @@ class _HomePageState extends State { owner ? widgets.add(fcsProfileBtn) : ""; widgets.add(shipmentCostBtn); customer || owner ? widgets.add(packagesBtn) : ""; + customer || owner ? widgets.add(boxesBtn) : ""; owner ? widgets.add(customersBtn) : ""; customer || owner ? widgets.add(invoicesBtn) : ""; widgets.add(termBtn); diff --git a/lib/pages/invoice/invoce_list.dart b/lib/pages/invoice/invoce_list.dart index 3f28280..eec9a21 100644 --- a/lib/pages/invoice/invoce_list.dart +++ b/lib/pages/invoice/invoce_list.dart @@ -65,7 +65,7 @@ class _InvoiceListState extends State { bottom: TabBar( unselectedLabelColor: Colors.grey, tabs: [ - Tab(text: "Packages"), + Tab(text: "Boxes"), Tab(text: "Pending"), Tab(text: "Paid"), ], diff --git a/lib/pages/invoice/invoice_editor.dart b/lib/pages/invoice/invoice_editor.dart index 8ce8efc..27b0334 100644 --- a/lib/pages/invoice/invoice_editor.dart +++ b/lib/pages/invoice/invoice_editor.dart @@ -1,3 +1,4 @@ +import 'package:fcs/model/main_model.dart'; import 'package:fcs/pages/invoice/package_addition.dart'; import 'package:fcs/theme/theme.dart'; import 'package:fcs/vo/invoice.dart'; @@ -86,6 +87,8 @@ class _InvoiceEditorState extends State { @override Widget build(BuildContext context) { + var mainModel = Provider.of(context); + return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( @@ -246,7 +249,7 @@ class _InvoiceEditorState extends State { ], ), ExpansionTile( - title: Text('Package Informations'), + title: Text('Box Information'), children: [ Container( child: SingleChildScrollView( @@ -288,14 +291,14 @@ class _InvoiceEditorState extends State { ), ), ), - Container( + mainModel.isOwner()?Container( padding: EdgeInsets.only(top: 20), child: Align( alignment: Alignment.bottomRight, child: FloatingActionButton.extended( icon: Icon(Icons.add), label: Text(AppTranslations.of(context) - .text("invoice.add_package")), + .text("invoice.add_box")), backgroundColor: primaryColor, onPressed: () { Navigator.of(context) @@ -303,7 +306,7 @@ class _InvoiceEditorState extends State { }, ), ), - ), + ):Container(), SizedBox(height: 25), ], ), @@ -324,7 +327,7 @@ class _InvoiceEditorState extends State { }, ), ))) - : Container( + :mainModel.isCustomer()?Container():Container( child: Column( children: [ Align( @@ -351,7 +354,7 @@ class _InvoiceEditorState extends State { child: Container( width: 250, child: FlatButton( - child: Text('Confirm Payment'), + child: Text('Attach Payment Receipt'), color: primaryColor, textColor: Colors.white, onPressed: () { diff --git a/lib/pages/pickup_editor.dart b/lib/pages/pickup_editor.dart index 474e5e3..6a6443b 100644 --- a/lib/pages/pickup_editor.dart +++ b/lib/pages/pickup_editor.dart @@ -270,7 +270,7 @@ class _PickUpEditorState extends State { ], ), ExpansionTile( - title: Text('Package Informations'), + title: Text('Package Information'), children: [ Padding( padding: const EdgeInsets.only(left: 20.0), @@ -302,7 +302,7 @@ class _PickUpEditorState extends State { ], ), ExpansionTile( - title: Text('Recipient Informations'), + title: Text('Recipient Information'), children: [ Padding( padding: const EdgeInsets.only(left: 20.0), @@ -346,6 +346,7 @@ class _PickUpEditorState extends State { _recipientAddressEditingController)), ], ), + mainModel.isCustomer()?Container(): ExpansionTile( title: Text('For FCS'), children: [ diff --git a/lib/pages/shipment_rates.dart b/lib/pages/shipment_rates.dart index b6098b4..87b8e7a 100644 --- a/lib/pages/shipment_rates.dart +++ b/lib/pages/shipment_rates.dart @@ -109,7 +109,7 @@ class _ShipmentRatesState extends State { Navigator.of(context) .push(MaterialPageRoute(builder: (_) => Term())); }), - fcsButton(context, "Calculate", callack: () { + fcsButton(context, "Estimate shipping cost", callack: () { Navigator.of(context) .push(BottomUpPageRoute(ShipmentRatesCal())); }), diff --git a/lib/pages_fcs/box_editor.dart b/lib/pages_fcs/box_editor.dart new file mode 100644 index 0000000..4c3b174 --- /dev/null +++ b/lib/pages_fcs/box_editor.dart @@ -0,0 +1,407 @@ +import 'package:fcs/model/main_model.dart'; +import 'package:fcs/model_fcs/package_model.dart'; +import 'package:fcs/pages/invoice/package_addition.dart'; +import 'package:fcs/pages/util.dart'; +import 'package:fcs/vo/box.dart'; +import 'package:fcs/vo/package.dart'; +import 'package:fcs/widget/bottom_up_page_route.dart'; +import 'package:fcs/widget/local_text.dart'; +import 'package:fcs/widget/localization/app_translations.dart'; +import 'package:fcs/widget/my_data_table.dart'; +import 'package:fcs/widget/progress.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:timeline_list/timeline.dart'; +import 'package:timeline_list/timeline_model.dart'; + +import '../theme/theme.dart'; + +class BoxEditor extends StatefulWidget { + final Box box; + BoxEditor({this.box}); + + @override + _BoxEditorState createState() => _BoxEditorState(); +} + +class _BoxEditorState extends State { + TextEditingController _addressEditingController = new TextEditingController(); + TextEditingController _fromTimeEditingController = + new TextEditingController(); + TextEditingController _toTimeEditingController = new TextEditingController(); + TextEditingController _noOfPackageEditingController = + new TextEditingController(); + TextEditingController _weightEditingController = new TextEditingController(); + + Box _box; + bool _isLoading = false; + List _images = [ + "assets/photos/1.jpg", + "assets/photos/2.jpg", + "assets/photos/3.jpg" + ]; + bool isNew; + + @override + void initState() { + super.initState(); + if (widget.box != null) { + _box = widget.box; + isNew = false; + // _addressEditingController.text = _pickUp.address; + // _fromTimeEditingController.text = _pickUp.fromTime; + // _toTimeEditingController.text = _pickUp.toTime; + // _noOfPackageEditingController.text = _pickUp.numberOfPackage.toString(); + // _weightEditingController.text = _pickUp.weight.toString(); + } else { + List packages = [ + PackageModel.packages[0], + PackageModel.packages[1], + PackageModel.packages[2] + ]; + + isNew = true; + _box = Box(rate: 0, weight: 0, packages: packages); + } + } + + @override + void dispose() { + super.dispose(); + } + + final DateFormat dateFormat = DateFormat("d MMM yyyy"); + List _models() { + // return []; + return _box.statusHistory + .map((e) => TimelineModel( + Padding( + padding: const EdgeInsets.all(18.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(e.status, + style: TextStyle( + color: e.done ? primaryColor : Colors.grey, + fontSize: 16, + fontWeight: FontWeight.bold)), + e.status == "Processed" + ? Text("(Waiting for payment)", + style: TextStyle( + color: e.done ? primaryColor : Colors.grey, + fontSize: 14, + fontWeight: FontWeight.bold)) + : Container(), + Text(dateFormat.format(e.date)), + ], + ), + ), + iconBackground: e.done ? primaryColor : Colors.grey, + icon: Icon( + e.status == "Shipped" + ? Ionicons.ios_airplane + : e.status == "Delivered" + ? MaterialCommunityIcons.truck_fast + : e.status == "Processed" + ? MaterialIcons.check + : Octicons.package, + color: Colors.white, + ))) + .toList(); + } + + @override + Widget build(BuildContext context) { + var mainModel = Provider.of(context); + + var images = isNew ? [] : _images; + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(Icons.close), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + title: Text(AppTranslations.of(context).text("box.edit.title")), + ), + body: Card( + child: Column( + children: [ + widget.box == null + ? Center( + child: Container( + padding: EdgeInsets.all(8), child: Text("New Box"))) + : Center(child: nameWidget(_box.packageNumber)), + Expanded( + child: ListView( + children: [ + ExpansionTile( + title: Text( + 'Shipment Information', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), + children: [ + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: DropdownButtonFormField( + value: _box.shipmentNumber, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Shipment Number', + icon: Icon(Ionicons.ios_airplane, + color: primaryColor) + // prefixIcon: Icon(Icons.play_arrow) + ), + items: ["A102", "A103", "A201", "A202"] + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: + isNew ? "FCS-0203-390-2" : "FCS-0203-390-2", + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'FCS_ID', + hintText: 'FCS_ID', + filled: true, + icon: Icon(Feather.user, color: primaryColor), + suffixIcon: IconButton( + icon: Icon(Icons.search), + onPressed: () {})), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _box.receiverName, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Customer Name', + filled: true, + icon: Icon(Feather.user, color: Colors.white), + suffixIcon: IconButton( + icon: Icon(Icons.search), + onPressed: () {})), + ), + ), + SizedBox( + height: 30, + ) + ], + ), + ExpansionTile( + title: Text( + 'Packages', + style: TextStyle( + color: primaryColor, fontWeight: FontWeight.bold), + ), + children: [ + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: DropdownButtonFormField( + value: _box.packageType, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Cargo Type', + icon: Icon(Entypo.box, color: primaryColor)), + items: ["General", "Medicine", "Dangerous"] + .map((e) => + DropdownMenuItem(child: Text(e), value: e)) + .toList(), + onChanged: (map) => {}, + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _box.weight.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Total Weight', + filled: true, + icon: Icon(FontAwesomeIcons.weightHanging, + color: primaryColor), + )), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _box.rate.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Rate', + filled: true, + icon: Icon(FontAwesomeIcons.tag, + color: primaryColor), + )), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: _box.amount.toString(), + textAlign: TextAlign.end, + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Total Amount', + filled: true, + icon: Icon(FontAwesomeIcons.moneyBill, + color: primaryColor), + )), + ), + Container( + padding: EdgeInsets.only(top: 10), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: MyDataTable( + headingRowHeight: 40, + columnSpacing: 20, + columns: [ + MyDataColumn( + label: LocalText( + context, + "box.package.id", + color: Colors.grey, + ), + ), + MyDataColumn( + label: LocalText( + context, + "box.package.desc", + color: Colors.grey, + ), + ), + MyDataColumn( + label: LocalText( + context, + "box.package.market", + color: Colors.grey, + ), + ), + ], + rows: getPackageRow(context), + ), + ), + ), + mainModel.isOwner() + ? Container( + padding: EdgeInsets.only(top: 20), + child: Align( + alignment: Alignment.bottomRight, + child: FloatingActionButton.extended( + icon: Icon(Icons.add), + label: Text(AppTranslations.of(context) + .text("box.add_package")), + backgroundColor: primaryColor, + onPressed: () { + Navigator.of(context).push( + BottomUpPageRoute(PackageAddition())); + }, + ), + ), + ) + : Container(), + SizedBox(height: 25), + ], + ), + isNew + ? Container() + : ExpansionTile( + title: Text( + 'Status', + style: TextStyle( + color: primaryColor, + fontWeight: FontWeight.bold), + ), + children: [ + Container( + height: 500, + padding: EdgeInsets.only(left: 20), + child: isNew + ? Container() + : Timeline( + children: _models(), + position: TimelinePosition.Left), + ), + ], + ) + ], + ), + ), + widget.box == null + ? Align( + alignment: Alignment.bottomCenter, + child: Center( + child: Container( + width: 250, + child: FlatButton( + child: Text('Create New Box'), + color: primaryColor, + textColor: Colors.white, + onPressed: () { + Navigator.pop(context); + }, + ), + ))) + : Container( + child: Column( + children: [ + Align( + alignment: Alignment.bottomCenter, + child: Center( + child: Container( + width: 250, + child: FlatButton( + child: Text('Complete packing'), + color: primaryColor, + textColor: Colors.white, + onPressed: () { + Navigator.pop(context); + }, + ), + ))), + ], + )) + ], + ), + ), + ), + ); + } + + List getPackageRow(BuildContext context) { + if (_box == null || _box.packages == null) { + return []; + } + return _box.packages.map((p) { + return MyDataRow( + onSelectChanged: (bool selected) {}, + cells: [ + MyDataCell(new Text( + p.id == null ? "" : p.id, + style: textStyle, + )), + MyDataCell( + new Text(p.cargoDesc, style: textStyle), + ), + MyDataCell( + new Text("${p.market}", style: textStyle), + ), + ], + ); + }).toList(); + } +} diff --git a/lib/pages_fcs/box_list.dart b/lib/pages_fcs/box_list.dart new file mode 100644 index 0000000..9d02ab8 --- /dev/null +++ b/lib/pages_fcs/box_list.dart @@ -0,0 +1,146 @@ +import 'package:fcs/model/pickup_model.dart'; +import 'package:fcs/model_fcs/box_model.dart'; +import 'package:fcs/model_fcs/package_model.dart'; +import 'package:fcs/pages/pickup_list_row.dart'; +import 'package:fcs/pages/search_page.dart'; +import 'package:fcs/pages_fcs/box_editor.dart'; +import 'package:fcs/pages_fcs/box_list_row.dart'; +import 'package:fcs/pages_fcs/package_editor.dart'; +import 'package:fcs/pages_fcs/package_list_row.dart'; +import 'package:fcs/vo/buyer.dart'; +import 'package:fcs/widget/bottom_up_page_route.dart'; +import 'package:fcs/widget/localization/app_translations.dart'; +import 'package:fcs/widget/progress.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import '../theme/theme.dart'; +import 'pickup_editor.dart'; + +class BoxList extends StatefulWidget { + @override + _BoxListState createState() => _BoxListState(); +} + +class _BoxListState extends State { + Buyer buyer; + bool _isLoading = false; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return LocalProgress( + inAsyncCall: _isLoading, + child: DefaultTabController( + length: 2, + child: Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(Icons.close), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: primaryColor, + title: Text(AppTranslations.of(context).text("boxes.title")), + actions: [ + IconButton( + icon: Icon( + Icons.search, + color: Colors.white, + ), + iconSize: 30, + onPressed: () => showPlacesSearch(context), + ), + ], + bottom: TabBar( + unselectedLabelColor: Colors.grey, + tabs: [ + Tab( + text: "Upcoming", + ), + Tab(text: "Delivered"), + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + _newPickup(); + }, + icon: Icon(Icons.add), + label: Text(AppTranslations.of(context).text("boxes.new")), + backgroundColor: primaryColor, + ), + body: TabBarView( + children: [ + _upComing(), + _completed(), + ], + )), + ), + ); + } + + _newPickup() { + Navigator.push( + context, + BottomUpPageRoute(BoxEditor()), + ); + } + + Widget _upComing() { + var boxModel = Provider.of(context); + return Column( + children: [ + Expanded( + child: new ListView.separated( + separatorBuilder: (context, index) => Divider( + color: Colors.black, + ), + scrollDirection: Axis.vertical, + padding: EdgeInsets.only(top: 15), + shrinkWrap: true, + itemCount: boxModel.upcoming.length, + itemBuilder: (BuildContext context, int index) { + return BoxListRow( + box: boxModel.upcoming[index], + isReadOnly: false, + ); + }), + ), + ], + ); + } + + Widget _completed() { + var boxModel = Provider.of(context); + return Column( + children: [ + Expanded( + child: new ListView.separated( + separatorBuilder: (context, index) => Divider( + color: Colors.black, + ), + scrollDirection: Axis.vertical, + padding: EdgeInsets.only(top: 15), + shrinkWrap: true, + itemCount: boxModel.completed.length, + itemBuilder: (BuildContext context, int index) { + return BoxListRow( + box: boxModel.completed[index], + isReadOnly: false, + ); + }), + ), + ], + ); + } +} diff --git a/lib/pages_fcs/box_list_row.dart b/lib/pages_fcs/box_list_row.dart new file mode 100644 index 0000000..ed67f36 --- /dev/null +++ b/lib/pages_fcs/box_list_row.dart @@ -0,0 +1,119 @@ +import 'package:fcs/pages/invoice/package_info.dart'; +import 'package:fcs/pages/util.dart'; +import 'package:fcs/pages_fcs/box_editor.dart'; +import 'package:fcs/pages_fcs/package_editor.dart'; +import 'package:fcs/vo/box.dart'; +import 'package:fcs/vo/package.dart'; +import 'package:fcs/widget/bottom_up_page_route.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +class BoxListRow extends StatefulWidget { + final bool isReadOnly; + final Box box; + const BoxListRow({this.box, this.isReadOnly}); + + @override + _BoxListRowState createState() => _BoxListRowState(); +} + +class _BoxListRowState extends State { + final double dotSize = 15.0; + Box _box = new Box(); + final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); + + @override + void initState() { + super.initState(); + _box = widget.box; + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: InkWell( + onTap: () { + if (widget.isReadOnly) { + // Navigator.push( + // context, + // BottomUpPageRoute(PackageInfo(package: _box)), + // ); + } else { + Navigator.push( + context, + BottomUpPageRoute(BoxEditor(box: _box)), + ); + } + }, + child: Row( + children: [ + Expanded( + child: new Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: new Row( + children: [ + new Expanded( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + _box.packageNumber == null + ? '' + : _box.packageNumber, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 10.0, top: 10), + child: new Text( + dateFormat.format(_box.arrivedDate), + style: new TextStyle( + fontSize: 15.0, color: Colors.grey), + ), + ) + ], + ), + ), + ], + ), + ), + ), + Column( + children: [ + Padding( + padding: const EdgeInsets.all(0), + child: getStatus(_box.status), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), + child: Row( + children: [ + new Text( + _box.weight == null + ? '' + : _box.weight.toString() + 'lb - ', + style: + new TextStyle(fontSize: 15.0, color: Colors.grey), + ), + new Text( + _box.price == null + ? "" + : "\$ " + _box.price.toString(), + style: + new TextStyle(fontSize: 15.0, color: Colors.grey), + ), + ], + ), + ), + ], + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages_fcs/package_editor.dart b/lib/pages_fcs/package_editor.dart index ded5c8a..dd51f3c 100644 --- a/lib/pages_fcs/package_editor.dart +++ b/lib/pages_fcs/package_editor.dart @@ -60,43 +60,6 @@ class _PackageEditorState extends State { } final DateFormat dateFormat = DateFormat("d MMM yyyy"); - List _models() { - return _package.statusHistory - .map((e) => TimelineModel( - Padding( - padding: const EdgeInsets.all(18.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(e.status, - style: TextStyle( - color: e.done ? primaryColor : Colors.grey, - fontSize: 16, - fontWeight: FontWeight.bold)), - e.status == "Processed" - ? Text("(Waiting for payment)", - style: TextStyle( - color: e.done ? primaryColor : Colors.grey, - fontSize: 14, - fontWeight: FontWeight.bold)) - : Container(), - Text(dateFormat.format(e.date)), - ], - ), - ), - iconBackground: e.done ? primaryColor : Colors.grey, - icon: Icon( - e.status == "Shipped" - ? Ionicons.ios_airplane - : e.status == "Delivered" - ? MaterialCommunityIcons.truck_fast - : e.status == "Processed" - ? MaterialIcons.check - : Octicons.package, - color: Colors.white, - ))) - .toList(); - } @override Widget build(BuildContext context) { @@ -116,12 +79,13 @@ class _PackageEditorState extends State { body: Card( child: Column( children: [ - widget.package == null + isNew ? Container() : Center(child: nameWidget(_package.market)), + isNew ? Center( child: Container( padding: EdgeInsets.all(8), child: Text("New Package"))) - : Center(child: nameWidget(_package.packageNumber)), + : Center(child: nameWidget(_package.trackingID)), Expanded( child: ListView( children: [ @@ -134,26 +98,49 @@ class _PackageEditorState extends State { children: [ Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), - child: DropdownButtonFormField( - value: _package.shipmentNumber, + child: TextFormField( + initialValue: isNew ? "" : "PKG2039", decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Shipment Number', - icon: Icon(Ionicons.ios_airplane, - color: primaryColor) - // prefixIcon: Icon(Icons.play_arrow) - ), - items: ["A102", "A103", "A201", "A202"] - .map((e) => - DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, + fillColor: Colors.white, + labelText: 'Package ID', + hintText: 'Package ID', + filled: true, + icon: Icon(MaterialCommunityIcons.id_card, + color: primaryColor), + ), ), ), Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( - initialValue: isNew ? "" : "FCS383-283-1", + initialValue: isNew ? "" : "Amazon", + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Market', + hintText: 'FCS_ID', + filled: true, + icon: Icon(MaterialCommunityIcons.cart_outline, + color: primaryColor), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: isNew ? "" : "zdf-sdfl-37sdfks", + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Tracking ID', + hintText: 'Tracking ID', + filled: true, + icon: Icon(Octicons.package, color: primaryColor), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 20.0, right: 20), + child: TextFormField( + initialValue: isNew ? "" : "FCS-0203-390-2", decoration: InputDecoration( fillColor: Colors.white, labelText: 'FCS_ID', @@ -182,7 +169,7 @@ class _PackageEditorState extends State { Padding( padding: const EdgeInsets.only(left: 20.0, right: 20), child: TextFormField( - initialValue: isNew ? "" : "P0203", + initialValue: isNew ? "" : "", decoration: InputDecoration( fillColor: Colors.white, labelText: 'Pickup ID', @@ -196,154 +183,90 @@ class _PackageEditorState extends State { ), ], ), - ExpansionTile( - title: Text( - 'Processing', - style: TextStyle( - color: primaryColor, fontWeight: FontWeight.bold), - ), - children: [ - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20), - child: DropdownButtonFormField( - value: _package.packageType, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Cargo Type', - icon: Icon(Entypo.box, color: primaryColor)), - items: ["General", "Medicine", "Dangerous"] - .map((e) => - DropdownMenuItem(child: Text(e), value: e)) - .toList(), - onChanged: (map) => {}, - ), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20), - child: TextFormField( - initialValue: - isNew ? "" : _package.cargoDesc.toString(), - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Description', - filled: true, - icon: Icon(MaterialIcons.description, - color: primaryColor), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20), - child: TextFormField( - initialValue: _package.weight.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Weight', - filled: true, - icon: Icon(FontAwesomeIcons.weightHanging, - color: primaryColor), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20), - child: TextFormField( - initialValue: _package.rate.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Rate', - filled: true, - icon: Icon(FontAwesomeIcons.tag, - color: primaryColor), - )), - ), - Padding( - padding: const EdgeInsets.only(left: 20.0, right: 20), - child: TextFormField( - initialValue: _package.amount.toString(), - textAlign: TextAlign.end, - decoration: InputDecoration( - fillColor: Colors.white, - labelText: 'Amount', - filled: true, - icon: Icon(FontAwesomeIcons.moneyBill, - color: primaryColor), - )), - ), - ], - ), - ExpansionTile( - title: Text( - 'Photos', - style: TextStyle( - color: primaryColor, fontWeight: FontWeight.bold), - ), - children: [ - Container( - height: 130, - width: 500, - child: ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, + isNew + ? Container() + : ExpansionTile( + title: Text( + 'Processing', + style: TextStyle( + color: primaryColor, + fontWeight: FontWeight.bold), ), - itemCount: images.length + 1, - scrollDirection: Axis.horizontal, - itemBuilder: (context, index) { - if (index == images.length) { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - width: 200, - height: 70, - decoration: BoxDecoration( - border: Border.all( - color: primaryColor, - width: 2.0, - ), - ), - child: Icon(SimpleLineIcons.plus), - ), - ); - } else { - return Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - width: 200, - height: 70, - decoration: BoxDecoration( - border: Border.all( - color: primaryColor, - width: 2.0, - ), - ), - child: Image.asset(images[index], - width: 50, height: 50), - ), - ); - } - }, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 20.0, right: 20), + child: TextFormField( + initialValue: isNew + ? "" + : _package.cargoDesc.toString(), + decoration: InputDecoration( + fillColor: Colors.white, + labelText: 'Description', + filled: true, + icon: Icon(MaterialIcons.description, + color: primaryColor), + )), + ), + ], + ), + isNew + ? Container() + : ExpansionTile( + title: Text( + 'Photos', + style: TextStyle( + color: primaryColor, + fontWeight: FontWeight.bold), + ), + children: [ + Container( + height: 130, + width: 500, + child: ListView.separated( + separatorBuilder: (context, index) => Divider( + color: Colors.black, + ), + itemCount: images.length + 1, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + if (index == images.length) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 200, + height: 70, + decoration: BoxDecoration( + border: Border.all( + color: primaryColor, + width: 2.0, + ), + ), + child: Icon(SimpleLineIcons.plus), + ), + ); + } else { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 200, + height: 70, + decoration: BoxDecoration( + border: Border.all( + color: primaryColor, + width: 2.0, + ), + ), + child: Image.asset(images[index], + width: 50, height: 50), + ), + ); + } + }, + ), + ), + ], ), - ), - ], - ), - ExpansionTile( - title: Text( - 'Status', - style: TextStyle( - color: primaryColor, fontWeight: FontWeight.bold), - ), - children: [ - Container( - height: 500, - padding: EdgeInsets.only(left: 20), - child: isNew - ? Container() - : Timeline( - children: _models(), - position: TimelinePosition.Left), - ), - ], - ) ], ), ), diff --git a/lib/pages_fcs/package_list.dart b/lib/pages_fcs/package_list.dart index f7d4ccc..fc744e3 100644 --- a/lib/pages_fcs/package_list.dart +++ b/lib/pages_fcs/package_list.dart @@ -62,9 +62,9 @@ class _PackageListState extends State { unselectedLabelColor: Colors.grey, tabs: [ Tab( - text: "Upcoming", + text: "Received", ), - Tab(text: "Completed"), + Tab(text: "Processed"), ], ), ), diff --git a/lib/pages_fcs/package_list_row.dart b/lib/pages_fcs/package_list_row.dart index 3a6020a..7f264ae 100644 --- a/lib/pages_fcs/package_list_row.dart +++ b/lib/pages_fcs/package_list_row.dart @@ -58,21 +58,29 @@ class _PackageListRowtate extends State { Padding( padding: const EdgeInsets.only(left: 8.0), child: new Text( - _package.packageNumber == null - ? '' - : _package.packageNumber, + _package.id == null ? '' : _package.id, style: new TextStyle( fontSize: 15.0, color: Colors.black), ), ), Padding( - padding: const EdgeInsets.only(left: 10.0, top: 10), + padding: const EdgeInsets.only(left: 8.0), child: new Text( - dateFormat.format(_package.arrivedDate), + _package.market == null ? '' : _package.market, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: new Text( + _package.trackingID == null + ? '' + : _package.trackingID, style: new TextStyle( fontSize: 15.0, color: Colors.grey), ), - ) + ), ], ), ), @@ -84,7 +92,10 @@ class _PackageListRowtate extends State { children: [ Padding( padding: const EdgeInsets.all(0), - child: getStatus(_package.status), + child: new Text( + dateFormat.format(_package.arrivedDate), + style: new TextStyle(fontSize: 15.0, color: Colors.grey), + ), ), Padding( padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5), diff --git a/lib/vo/box.dart b/lib/vo/box.dart new file mode 100644 index 0000000..81f7414 --- /dev/null +++ b/lib/vo/box.dart @@ -0,0 +1,61 @@ +import 'package.dart'; + +class Status { + String status; + DateTime date; + bool done; + Status({this.status, this.date, this.done}); +} + +class Box { + String id; + String shipmentNumber; + String senderFCSID; + String senderName; + String receiverFCSID; + String receiverName; + String receiverAddress; + String receiverNumber; + String boxNumber; + String status; + String cargoDesc; + + int rate; + int weight; + String packageType; + String pickUpID; + List photos; + String remark; + DateTime arrivedDate; + + List packages; + + int get amount => rate != null && weight != null ? rate * weight : 0; + + String get packageNumber => + shipmentNumber + "-" + receiverNumber + " #" + boxNumber; + double get price => rate.toDouble() * weight; + + List statusHistory; + + Box( + {this.id, + this.shipmentNumber, + this.senderFCSID, + this.senderName, + this.receiverFCSID, + this.receiverName, + this.receiverNumber, + this.receiverAddress, + this.boxNumber, + this.rate, + this.weight, + this.packageType, + this.pickUpID, + this.remark, + this.status, + this.arrivedDate, + this.cargoDesc, + this.statusHistory, + this.packages}); +} diff --git a/lib/vo/package.dart b/lib/vo/package.dart index 39d6105..88e8ded 100644 --- a/lib/vo/package.dart +++ b/lib/vo/package.dart @@ -1,9 +1,9 @@ -class Status { - String status; - DateTime date; - bool done; - Status({this.status, this.date, this.done}); -} +// class Status { +// String status; +// DateTime date; +// bool done; +// Status({this.status, this.date, this.done}); +// } class Package { String id; @@ -17,6 +17,8 @@ class Package { String boxNumber; String status; String cargoDesc; + String market; + String trackingID; int rate; int weight; @@ -32,7 +34,7 @@ class Package { shipmentNumber + "-" + receiverNumber + " #" + boxNumber; double get price => rate.toDouble() * weight; - List statusHistory; + // List statusHistory; Package( {this.id, @@ -52,5 +54,8 @@ class Package { this.status, this.arrivedDate, this.cargoDesc, - this.statusHistory}); + this.market, + this.trackingID + // this.statusHistory + }); }