diff --git a/assets/local/localization_en.json b/assets/local/localization_en.json index 3d46287..9efe1ba 100644 --- a/assets/local/localization_en.json +++ b/assets/local/localization_en.json @@ -124,6 +124,26 @@ "market.edit.name":"Market Name", "market.remove.confirm":"Remove this market?", + "buy_online.title":"Buying instructions", + "buy_online":"Buying Instructions", + "buy_online.buying_instruction":"See below instructions to add USA shipping address while shoping online", + "buy_online.fullname":"With Full Name", + "buy_online.first.last":"With First Name and Last Name", + + "pm.title":"Payment Methods", + "pm.new":"New Payment Method", + "pm.update":"Update Payment Method", + "pm.btn":"Payment Methods", + "pm.name":"Name", + "pm.account.name":"Account Name", + "pm.account.no":"Account Number", + "pm.phone":"Phone Number", + "pm.email":"Email Address", + "pm.link":"Link", + "pm.add.btn":"Add Payment Method", + "pm.save.btn":"Save Payment Method", + "pm.delete.confirm":"Delete this Payment Method?", + "btn.save": "Save", "btn.approve":"Approve", "btn.delete":"Delete", @@ -577,15 +597,8 @@ "user.fcs_id":"MY FCS_ID", "user.shipping_address":"USA SHIPPING ADDRESS", "user.deliveryAddress":"My delivery address", - "user.buying_instruction":"See below instructions to add USA shipping address while shoping online", "user.form.shipping_address":"ADDRESS", - "buy_online":"Buying Instructions", - "buy_online.title":"BUYING INSTRUCTIONS", - "buy.amazon":"Amazon", - "buy.newegg":"Newegg", - "buy.macy":"Macy", - "buy.instruction":"Adding your shipment address in {0}", "notifications.title":"Notification", @@ -661,11 +674,6 @@ "remaining_balance":"Remaining Balance : ", "total.amount": "Amount :", - "payment.method.btn":"Payment Methods", - "payment.method.title":"PAYMENT METHODS", - "payment.method.new":"New Payment Method", - "payment.method.form":"PAYMENT METHOD", - "discount.btn":"Discounts", "discount.title":"DISCOUNTS", "discount.new":"New Discount", diff --git a/assets/local/localization_mu.json b/assets/local/localization_mu.json index a7cbe9f..a6ded82 100644 --- a/assets/local/localization_mu.json +++ b/assets/local/localization_mu.json @@ -125,6 +125,26 @@ "market.edit.name":"Market Name", "market.remove.confirm":"Remove this market?", + "buy_online.title":"ဝယ်ယူရန်ညွှန်ကြားချက်များ", + "buy_online":"ဝယ်ယူရန်ညွှန်ကြားချက်များ", + "buy_online.buying_instruction":"လိပ်စာထည့်ရန် ညွှန်ကြားချက်များကို အောက်တွင်ကြည့်ပါ", + "buy_online.fullname":"နာမည် အပြည့်အစုံ", + "buy_online.first.last":"ပထမအမည် နှင့် နောက်ဆုံးအမည်", + + "pm.title":"ငွေပေးချေစနစ်များ", + "pm.new":"ငွေပေးချေစနစ်အသစ်", + "pm.update":"ငွေပေးချေစနစ် ပြင်ဆင်ခြင်း", + "pm.btn":"ငွေပေးချေစနစ်များ", + "pm.name":"အမည်", + "pm.account.name":"အကောင့် အမည်", + "pm.account.no":"အကောင့် နံပါတ်", + "pm.phone":"ဖုန်း နံပါတ်", + "pm.email":"အီးမေးလ် လိပ်စာ", + "pm.link":"အင်တာနက် လင့်", + "pm.add.btn":"ပေါင်းထည့်ရန်", + "pm.save.btn":"သိမ်းဆည်းရန်", + "pm.delete.confirm":"ငွေပေးချေစနစ်ကို ဖျက်မလား?", + "btn.save":"သိမ်းဆည်းရန်", "btn.approve":"အတည်ပြုရန်", "btn.delete":"ဖျက်ရန်", @@ -607,16 +627,8 @@ "user.fcs_id":"My FCS_ID", "user.shipping_address":"My USA shipping address", "user.deliveryAddress":"My delivery address", - "user.buying_instruction":"See below instructions to add shipping address", "user.form.shipping_address":"ကုန်ပစ္စည်းပို့ဆောင်ရမည့်လိပ်စာ", - "buy_online":"ဝယ်ယူရန်ညွှန်ကြားချက်များ", - "buy_online.title":"ဝယ်ယူရန်ညွှန်ကြားချက်များ", - "buy.amazon":"Amazon", - "buy.newegg":"Newegg", - "buy.macy":"Macy", - "buy.instruction":"Adding your shipment address in {0}", - "notifications.title":"Notifications", "shipment.title":"FCS တင်ပို့ခြင်းများ", @@ -674,11 +686,6 @@ "remaining_balance":"ပေးချေရန်ကျန်ရှိငွေ : ", "total.amount": "ပမာဏ :", - "payment.method.btn":"ငွေပေးချေစနစ်", - "payment.method.title":"ငွေပေးချေစနစ်", - "payment.method.new":"ငွေပေးချေစနစ်အသစ်", - "payment.method.form":"ငွေပေးချေစနစ်", - "discount.btn":"လျှော့စျေးများ", "discount.title":"လျှော့စျေးများ", "discount.new":"လျှော့စျေး", diff --git a/lib/app.dart b/lib/app.dart index 699cd9a..4df76fa 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:fcs/fcs/common/localization/app_translations_delegate.dart'; import 'package:fcs/fcs/common/localization/transalation.dart'; import 'package:fcs/fcs/common/pages/contact/model/contact_model.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; +import 'package:fcs/fcs/common/pages/customer/model/customer_model.dart'; import 'package:fcs/fcs/common/pages/faq/model/faq_model.dart'; import 'package:fcs/fcs/common/pages/initial_language_selection.dart'; import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; @@ -11,6 +11,7 @@ import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart' as fcs; import 'package:fcs/fcs/common/pages/package/model/package_model.dart'; import 'package:fcs/fcs/common/pages/package/model/shipment_model.dart'; +import 'package:fcs/fcs/common/pages/payment_methods/model/payment_method_model.dart'; import 'package:fcs/fcs/common/pages/staff/model/staff_model.dart'; import 'package:fcs/fcs/common/pages/term/model/term_model.dart'; import 'package:fcs/fcs/common/services/services.dart'; @@ -64,6 +65,7 @@ class _AppState extends State { final TermModel termModel = new TermModel(); final MainModel mainModel = new MainModel(); final FAQModel faqModel = new FAQModel(); + final PaymentMethodModel paymentMethodModel = new PaymentMethodModel(); final UserModel userModel = new UserModel(); final ProductModel productModel = new ProductModel(); @@ -259,6 +261,7 @@ class _AppState extends State { ChangeNotifierProvider.value(value: contactModel), ChangeNotifierProvider.value(value: termModel), ChangeNotifierProvider.value(value: faqModel), + ChangeNotifierProvider.value(value: paymentMethodModel), ChangeNotifierProvider.value(value: marketModel), ], child: Consumer( diff --git a/lib/fcs/common/data/providers/common_data_provider.dart b/lib/fcs/common/data/providers/common_data_provider.dart new file mode 100644 index 0000000..cb6c318 --- /dev/null +++ b/lib/fcs/common/data/providers/common_data_provider.dart @@ -0,0 +1,23 @@ +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; +import 'package:fcs/fcs/common/helpers/api_helper.dart'; +import 'package:fcs/fcs/common/helpers/firebase_helper.dart'; +import 'package:logging/logging.dart'; + +class CommonDataProvider { + final log = Logger('CommonDataProvider'); + + Future createPaymentMethod(PaymentMethod paymentMethod) async { + return await requestAPI("/payment_methods", "POST", + payload: paymentMethod.toMap(), token: await getToken()); + } + + Future updatePaymentMethod(PaymentMethod paymentMethod) async { + return await requestAPI("/payment_methods", "PUT", + payload: paymentMethod.toMap(), token: await getToken()); + } + + Future deletePaymentMethod(String id) async { + return await requestAPI("/payment_methods", "DELETE", + payload: {"id": id}, token: await getToken()); + } +} diff --git a/lib/fcs/common/domain/entities/faq.dart b/lib/fcs/common/domain/entities/faq.dart index 8782c55..1c92074 100644 --- a/lib/fcs/common/domain/entities/faq.dart +++ b/lib/fcs/common/domain/entities/faq.dart @@ -9,25 +9,23 @@ class FAQ { String question(bool isEng) => isEng ? questionEng : questionMm; String answer(bool isEng) => isEng ? answerEng : answerMm; - Map imageUrls; - FAQ( - {this.id, - this.sn, - this.questionEng, - this.questionMm, - this.answerEng, - this.answerMm, - this.imageUrls}); + FAQ({ + this.id, + this.sn, + this.questionEng, + this.questionMm, + this.answerEng, + this.answerMm, + }); Map toMap() { return { 'id': id, - 'sn':sn, + 'sn': sn, 'question_eng': questionEng, 'answer_eng': answerEng, 'question_mm': questionMm, 'answer_mm': answerMm, - 'images': imageUrls, }; } @@ -39,7 +37,6 @@ class FAQ { answerEng: map['answer_eng'], questionMm: map['question_mm'], answerMm: map['answer_mm'], - imageUrls: Map.from(map['images'] ?? Map()), ); } diff --git a/lib/fcs/common/domain/entities/payment_method.dart b/lib/fcs/common/domain/entities/payment_method.dart new file mode 100644 index 0000000..50cf277 --- /dev/null +++ b/lib/fcs/common/domain/entities/payment_method.dart @@ -0,0 +1,42 @@ +class PaymentMethod { + String id; + String name; + String accountName; + String account; + String phone; + String email; + String link; + + PaymentMethod( + {this.id, + this.name, + this.accountName, + this.account, + this.phone, + this.email, + this.link}); + + factory PaymentMethod.fromMap(Map map, String id) { + return PaymentMethod( + id: id, + name: map['name'], + accountName: map['account_name'], + account: map['account'], + phone: map['phone'], + email: map['email'], + link: map['link'], + ); + } + + Map toMap() { + return { + 'id': id, + 'name': name, + "account_name": accountName, + "account": account, + "phone": phone, + "email": email, + "link": link, + }; + } +} diff --git a/lib/fcs/common/domain/entities/setting.dart b/lib/fcs/common/domain/entities/setting.dart index 41f5a32..6234da0 100644 --- a/lib/fcs/common/domain/entities/setting.dart +++ b/lib/fcs/common/domain/entities/setting.dart @@ -24,10 +24,11 @@ class Setting { String facebookLink; bool inviteRequired; String appUrl; + final String termsEng; + final String termsMm; final String okEnergyId; final String about; - final String terms; int poExpireInHours; int doExpireInHours; int poOpenAt; @@ -88,9 +89,10 @@ class Setting { this.facebookLink, this.inviteRequired, this.appUrl, + this.termsEng, + this.termsMm, this.about, this.okEnergyId, - this.terms, this.poExpireInHours, this.doExpireInHours, this.poOpenAt, @@ -136,7 +138,8 @@ class Setting { emailAddress: map['email_address'], facebookLink: map['facebook_link'], about: map['about'], - terms: map['terms'], + termsEng: map['terms_eng'], + termsMm: map['terms_mm'], priceLastUpdate: ts?.toDate(), okEnergyId: map['ok_energy_id'], poExpireInHours: map['po_expire_hours'], @@ -161,7 +164,8 @@ class Setting { Map toMap() { return { - 'terms': terms, + 'terms_eng': termsEng, + 'terms_mm': termsMm, }; } diff --git a/lib/fcs/common/domain/vo/term.dart b/lib/fcs/common/domain/vo/term.dart index 30a5830..6f2533c 100644 --- a/lib/fcs/common/domain/vo/term.dart +++ b/lib/fcs/common/domain/vo/term.dart @@ -1,25 +1,24 @@ import 'package:fcs/fcs/common/domain/entities/setting.dart'; class Term { - String term; + String termEng; + String termMm; - Term({ - this.term, - }); + Term({this.termEng, this.termMm}); factory Term.fromSetting(Setting setting) { - return Term( - term: setting.terms,); + return Term(termEng: setting.termsEng, termMm: setting.termsMm); } Map toMap() { return { - 'terms': term, + 'terms_eng': termEng, + 'terms_mm': termMm, }; } @override String toString() { - return 'Contact{terms:$term}'; + return 'Contact{terms_eng:$termEng}'; } } diff --git a/lib/fcs/common/pages/buying_instruction/buying_online.dart b/lib/fcs/common/pages/buying_instruction/buying_online.dart new file mode 100644 index 0000000..85f9602 --- /dev/null +++ b/lib/fcs/common/pages/buying_instruction/buying_online.dart @@ -0,0 +1,130 @@ +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/fcs_id_icon.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class BuyingOnlinePage extends StatefulWidget { + @override + _BuyingOnlinePagetate createState() => _BuyingOnlinePagetate(); +} + +class _BuyingOnlinePagetate extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + _tabController = TabController(vsync: this, length: 2); + super.initState(); + } + + @override + Widget build(BuildContext context) { + MainModel mainModel = Provider.of(context); + + final phoneNumberBox = DisplayText( + text: mainModel.user.phone, + labelText: getLocalString(context, "contact.phone"), + iconData: Icons.location_on, + ); + final nameBox = Center( + child: Text( + mainModel.user.name, + style: TextStyle(fontSize: 18, color: primaryColor), + )); + final fcsIdBox = DisplayText( + text: mainModel.user.fcsID, + labelText: getLocalString(context, "customer.fcs.id"), + icon: FcsIDIcon(), + ); + final shippingAddressBox = DisplayText( + text: mainModel.setting.usaAddress, + labelText: getLocalString(context, "profile.usa.shipping.address"), + iconData: Icons.location_on, + ); + final instructionBox = Container( + padding: EdgeInsets.only(left: 10, top: 30, bottom: 10), + child: Center( + child: Wrap( + children: [ + LocalText( + context, + 'buy_online.buying_instruction', + color: labelColor, + fontSize: 15, + ) + ], + ), + ), + ); + + return Scaffold( + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon( + Icons.close, + color: primaryColor, + ), + onPressed: () => Navigator.of(context).pop(), + ), + title: LocalText( + context, + "buy_online.title", + fontSize: 20, + color: primaryColor, + ), + backgroundColor: Colors.white, + shadowColor: Colors.transparent, + ), + body: ListView( + shrinkWrap: true, + padding: EdgeInsets.only(top: 10, left: 10, right: 10), + children: [ + nameBox, + phoneNumberBox, + fcsIdBox, + shippingAddressBox, + instructionBox, + new Container( + decoration: new BoxDecoration(color: Colors.white), + child: new TabBar( + // indicatorColor: primaryColor, + labelColor: primaryColor, + labelStyle: TextStyle(fontWeight: FontWeight.bold), + unselectedLabelColor: Colors.grey, + controller: _tabController, + tabs: [ + LocalText(context, "buy_online.fullname"), + LocalText(context, "buy_online.first.last"), + ], + ), + ), + new Container( + padding: EdgeInsets.only(top: 10), + height: 500, + width: 500, + child: new TabBarView( + controller: _tabController, + children: [ + Container( + child: + Image.asset('assets/Fullname.png', fit: BoxFit.contain), + ), + Container( + child: Image.asset('assets/FirstName&LastName.png', + fit: BoxFit.contain), + ), + ], + ), + ), + SizedBox(height: 10) + ], + ), + ); + } +} diff --git a/lib/fcs/common/pages/contact/contact_editor.dart b/lib/fcs/common/pages/contact/contact_editor.dart index a87c1c8..92248e0 100644 --- a/lib/fcs/common/pages/contact/contact_editor.dart +++ b/lib/fcs/common/pages/contact/contact_editor.dart @@ -4,6 +4,7 @@ import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/pages/contact/model/contact_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -27,7 +28,6 @@ class _ContactEditorState extends State { TextEditingController _email = new TextEditingController(); TextEditingController _facebook = new TextEditingController(); - final _formKey = GlobalKey(); bool _isLoading = false; @override @@ -76,61 +76,51 @@ class _ContactEditorState extends State { return LocalProgress( inAsyncCall: _isLoading, child: Scaffold( - body: CustomScrollView(slivers: [ - SliverAppBar( - leading: IconButton( - icon: Icon( - CupertinoIcons.back, - size: 30, - ), + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(CupertinoIcons.back, color: primaryColor), onPressed: () => Navigator.of(context).pop(), ), - backgroundColor: primaryColor, - expandedHeight: 150.0, - floating: false, - pinned: true, - flexibleSpace: FlexibleSpaceBar( - centerTitle: true, - titlePadding: EdgeInsets.symmetric(vertical: 10), - title: - Text(AppTranslations.of(context).text('contact.edit.title'), - style: TextStyle( - color: Colors.white, - )), - ), - ), - SliverList( - delegate: SliverChildListDelegate([ - Padding( - padding: const EdgeInsets.only(left: 18.0, right: 18), - child: Column( - children: [ - itemTitle(context, "contact.callus"), - usaPhoneBox, - mmPhoneBox, - Divider(), - itemTitle(context, "contact.findus"), - usaAddreesBox, - mmAddressBox, - Divider(), - itemTitle(context, "contact.emailus"), - emailBox, - Divider(), - itemTitle(context, "contact.visitus"), - faceBookBox, - SizedBox( - height: 10, - ), - saveBox, - SizedBox( - height: 20, - ) - ], - ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + title: LocalText( + context, + 'contact.edit.title', + color: primaryColor, + fontSize: 20, + )), + body: ListView( + children: [ + Padding( + padding: const EdgeInsets.only(left: 18.0, right: 18), + child: Column( + children: [ + itemTitle(context, "contact.callus"), + usaPhoneBox, + mmPhoneBox, + Divider(), + itemTitle(context, "contact.findus"), + usaAddreesBox, + mmAddressBox, + Divider(), + itemTitle(context, "contact.emailus"), + emailBox, + Divider(), + itemTitle(context, "contact.visitus"), + faceBookBox, + SizedBox( + height: 10, + ), + saveBox, + SizedBox( + height: 20, + ) + ], ), - ]), - ) - ]), + ), + ], + ), )); } diff --git a/lib/fcs/common/pages/contact/contact_page.dart b/lib/fcs/common/pages/contact/contact_page.dart index d321e38..c3d988a 100644 --- a/lib/fcs/common/pages/contact/contact_page.dart +++ b/lib/fcs/common/pages/contact/contact_page.dart @@ -4,6 +4,7 @@ import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/pages/contact/contact_editor.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -25,45 +26,40 @@ class _ContactPageState extends State { bool isEditable = context.select((MainModel m) => m.contactEditable()); return Scaffold( - body: CustomScrollView(slivers: [ - SliverAppBar( - leading: IconButton( - icon: Icon( - CupertinoIcons.back, - size: 30, - ), - onPressed: () => Navigator.of(context).pop(), + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon( + Icons.close, + color: primaryColor, ), - backgroundColor: primaryColor, - expandedHeight: 100.0, - floating: false, - pinned: true, - flexibleSpace: FlexibleSpaceBar( - centerTitle: true, - titlePadding: EdgeInsets.symmetric(vertical: 10), - title: Text(AppTranslations.of(context).text('contact.title'), - style: TextStyle( - color: Colors.white, - )), - ), - actions: isEditable - ? [ - IconButton( - onPressed: () => - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => ContactEditor( - contact: Contact.fromSetting(setting), - ), - )), - icon: Icon( - CupertinoIcons.pen, - color: Colors.white, - )) - ] - : [], + onPressed: () => Navigator.of(context).pop(), ), - SliverList( - delegate: SliverChildListDelegate([ + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + title: LocalText( + context, + 'contact.title', + color: primaryColor, + fontSize: 20, + ), + actions: isEditable + ? [ + IconButton( + onPressed: () => + Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => ContactEditor( + contact: Contact.fromSetting(setting)), + )), + icon: Icon( + CupertinoIcons.pen, + color: primaryColor, + )) + ] + : [], + ), + body: ListView( + children: [ itemTitle(context, "contact.callus"), contactItem(context, setting.usaContactNumber, CupertinoIcons.phone, onTap: () => _call(setting.usaContactNumber), @@ -106,8 +102,8 @@ class _ContactPageState extends State { onTap: () => _opencontactItem(setting.facebookLink), labelKey: "contact.facebook", ), - ])) - ]), + ], + ), ); } diff --git a/lib/fcs/common/pages/customers/customer_editor.dart b/lib/fcs/common/pages/customer/customer_editor.dart similarity index 94% rename from lib/fcs/common/pages/customers/customer_editor.dart rename to lib/fcs/common/pages/customer/customer_editor.dart index 9874869..b62fcc6 100644 --- a/lib/fcs/common/pages/customers/customer_editor.dart +++ b/lib/fcs/common/pages/customer/customer_editor.dart @@ -1,9 +1,9 @@ import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; +import 'package:fcs/fcs/common/pages/customer/model/customer_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -78,7 +78,7 @@ class _CustomerEditorState extends State { DisplayText( text: widget.customer.fcsID, labelText: getLocalString(context, "customer.fcs.id"), - iconData: Icons.account_circle, + icon: FcsIDIcon(), ), SizedBox( height: 20, diff --git a/lib/fcs/common/pages/customers/customer_list.dart b/lib/fcs/common/pages/customer/customer_list.dart similarity index 51% rename from lib/fcs/common/pages/customers/customer_list.dart rename to lib/fcs/common/pages/customer/customer_list.dart index 00c2568..9dbb7e7 100644 --- a/lib/fcs/common/pages/customers/customer_list.dart +++ b/lib/fcs/common/pages/customer/customer_list.dart @@ -1,20 +1,20 @@ import 'package:fcs/fcs/common/domain/constants.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/pages/customers/customer_editor.dart'; -import 'package:fcs/fcs/common/pages/customers/invitation_list.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; -import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/customer/customer_editor.dart'; +import 'package:fcs/fcs/common/pages/customer/model/customer_model.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/widget/progress.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:share/share.dart'; import 'invitation_create.dart'; -import 'invitation_editor.dart'; class CustomerList extends StatefulWidget { @override @@ -36,7 +36,7 @@ class _CustomerListState extends State { appBar: AppBar( centerTitle: true, leading: new IconButton( - icon: new Icon(Icons.close), + icon: new Icon(CupertinoIcons.back), onPressed: () => Navigator.of(context).pop(), ), actions: [ @@ -52,9 +52,9 @@ class _CustomerListState extends State { backgroundColor: primaryColor, title: LocalText( context, - 'customer.list.title', - color: Colors.white, + "customer.list.title", fontSize: 20, + color: Colors.white, ), ), floatingActionButton: FloatingActionButton.extended( @@ -89,68 +89,78 @@ class _CustomerListState extends State { } Widget _item(User customer) { - return Stack( - children: [ - InkWell( - onTap: () => _select(customer), - child: Row( - children: [ - Expanded( - child: new Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0), - child: new Row( - children: [ - new Padding( - padding: new EdgeInsets.symmetric( - horizontal: 32.0 - dotSize / 2), - child: Icon( - Feather.user, - color: primaryColor, - size: 40, - ), - ), - new Expanded( - child: new Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - new Text( - customer.name, - style: new TextStyle( - fontSize: 15.0, color: primaryColor), - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: new Text( - customer.phoneNumber, - style: new TextStyle( - fontSize: 15.0, color: Colors.grey), - ), - ), - ], - ), - ), - ], + return InkWell( + onTap: () => _select(customer), + child: Row( + children: [ + Expanded( + child: new Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: new Row( + children: [ + Icon( + Feather.user, + color: primaryColor, + size: 40, ), - ), + new Expanded( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + new Text( + customer.name, + style: new TextStyle( + fontSize: 15.0, color: primaryColor), + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: new Text( + customer.phoneNumber, + style: new TextStyle( + fontSize: 15.0, color: Colors.grey), + ), + ), + ], + ), + ), + ], ), + ), + ), + Column( + children: [ Padding( - padding: const EdgeInsets.only(right: 10), + padding: const EdgeInsets.only(right: 5), child: _status(customer.status), ), + customer.status == user_invited_status + ? FlatButton( + onPressed: () => _share(customer), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18.0), + side: BorderSide(color: primaryColor)), + child: Row( + children: [ + Text( + "Share", + style: TextStyle(fontSize: 12), + ), + Icon(Icons.share, color: primaryColor), + ], + ), + ) + : Container(), ], ), - ), - ], + ], + ), ); } Widget _status(String status) { - return Text( - (user_requested_status == status || user_invited_status == status) - ? status - : "", - style: TextStyle(color: primaryColor, fontSize: 14), - ); + return user_requested_status == status + ? Text(status, style: TextStyle(color: primaryColor, fontSize: 14)) + : Container(); } _select(User customer) { @@ -158,7 +168,14 @@ class _CustomerListState extends State { .push(BottomUpPageRoute(CustomerEditor(customer: customer))); } - _invitations() { - Navigator.of(context).push(BottomUpPageRoute(InvitationList())); + _share(User user) async { + MainModel mainModel = Provider.of(context, listen: false); + String appUrl = mainModel.setting.appUrl; + final RenderBox box = context.findRenderObject(); + await Share.share( + "Join us on FCS Logistics App. Here is the link:\n $appUrl\n" + + user.share, + subject: "Invitation to FCS Logistics App", + sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); } } diff --git a/lib/fcs/common/pages/customers/invitation_create.dart b/lib/fcs/common/pages/customer/invitation_create.dart similarity index 91% rename from lib/fcs/common/pages/customers/invitation_create.dart rename to lib/fcs/common/pages/customer/invitation_create.dart index 9175fc3..fea749a 100644 --- a/lib/fcs/common/pages/customers/invitation_create.dart +++ b/lib/fcs/common/pages/customer/invitation_create.dart @@ -1,8 +1,9 @@ import 'package:country_code_picker/country_code_picker.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; +import 'package:fcs/fcs/common/pages/customer/model/customer_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/widget/progress.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -36,22 +37,29 @@ class _InvitationCreateState extends State { inAsyncCall: _isLoading, child: Scaffold( appBar: AppBar( + backgroundColor: Colors.white, + shadowColor: Colors.transparent, centerTitle: true, leading: new IconButton( icon: new Icon( Icons.close, + color: primaryColor, ), onPressed: () => Navigator.of(context).pop(), ), - backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("invitation.new")), + title: LocalText( + context, + "invitation.new", + fontSize: 20, + color: primaryColor, + ), ), body: Container( padding: EdgeInsets.all(18), child: ListView( children: [ fcsInput(getLocalString(context, "customer.name"), Icons.person, - controller: _nameController, autoFocus: true), + controller: _nameController, autoFocus: false), SizedBox(height: 10), Row( children: [ diff --git a/lib/fcs/common/pages/customers/invitation_editor.dart b/lib/fcs/common/pages/customer/invitation_editor.dart similarity index 88% rename from lib/fcs/common/pages/customers/invitation_editor.dart rename to lib/fcs/common/pages/customer/invitation_editor.dart index 02f62b3..fef5933 100644 --- a/lib/fcs/common/pages/customers/invitation_editor.dart +++ b/lib/fcs/common/pages/customer/invitation_editor.dart @@ -1,16 +1,11 @@ -import 'package:fcs/fcs/common/domain/entities/customer.dart'; -import 'package:fcs/fcs/common/domain/entities/role.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; -import 'package:fcs/fcs/common/pages/model/language_model.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/customer/model/customer_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; typedef void FindCallBack(); diff --git a/lib/fcs/common/pages/customers/model/customer_model.dart b/lib/fcs/common/pages/customer/model/customer_model.dart similarity index 100% rename from lib/fcs/common/pages/customers/model/customer_model.dart rename to lib/fcs/common/pages/customer/model/customer_model.dart diff --git a/lib/fcs/common/pages/customers/invitation_list.dart b/lib/fcs/common/pages/customers/invitation_list.dart deleted file mode 100644 index e196a6b..0000000 --- a/lib/fcs/common/pages/customers/invitation_list.dart +++ /dev/null @@ -1,148 +0,0 @@ -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:share/share.dart'; -import 'package:fcs/fcs/common/domain/entities/user.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/customers/invitation_create.dart'; -import 'package:fcs/fcs/common/pages/customers/model/customer_model.dart'; -import 'package:fcs/fcs/common/pages/util.dart'; -import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/progress.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; -import 'package:intl/intl.dart'; - -import 'package:provider/provider.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; - -import 'invitation_editor.dart'; - -class InvitationList extends StatefulWidget { - @override - _InvitationListState createState() => _InvitationListState(); -} - -class _InvitationListState extends State { - var dateFormatter = new DateFormat('dd MMM yyyy - hh:mm:ss a'); - final double dotSize = 15.0; - bool _isLoading = false; - - @override - Widget build(BuildContext context) { - var customerModel = Provider.of(context); - - return LocalProgress( - inAsyncCall: _isLoading, - child: Scaffold( - appBar: AppBar( - centerTitle: true, - leading: new IconButton( - icon: new Icon(Icons.close), - onPressed: () => Navigator.of(context).pop(), - ), - actions: [], - backgroundColor: primaryColor, - title: LocalText( - context, - 'invitation.list', - color: Colors.white, - fontSize: 20, - ), - ), - floatingActionButton: FloatingActionButton.extended( - onPressed: () { - Navigator.of(context).push(BottomUpPageRoute(InvitationCreate())); - }, - icon: Icon(Icons.add), - label: LocalText(context, "invitation.new", color: Colors.white), - backgroundColor: primaryColor, - ), - body: new ListView.separated( - separatorBuilder: (context, index) => Divider( - color: Colors.black, - ), - scrollDirection: Axis.vertical, - padding: EdgeInsets.only(left: 15, right: 15, top: 15), - shrinkWrap: true, - itemCount: customerModel.invitations.length, - itemBuilder: (BuildContext context, int index) { - User customer = customerModel.invitations[index]; - return _item(customer); - }), - ), - ); - } - - Widget _item(User customer) { - return Stack( - children: [ - InkWell( - onTap: () { - Navigator.of(context) - .push(BottomUpPageRoute(InvitationEditor(customer: customer))); - }, - child: Row( - children: [ - Expanded( - child: new Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0), - child: new Row( - children: [ - new Padding( - padding: new EdgeInsets.symmetric( - horizontal: 32.0 - dotSize / 2), - child: Icon( - Feather.user, - color: primaryColor, - size: 40, - ), - ), - new Expanded( - child: new Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - new Text( - customer.name, - style: new TextStyle( - fontSize: 15.0, color: primaryColor), - ), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: new Text( - customer.phoneNumber, - style: new TextStyle( - fontSize: 15.0, color: Colors.grey), - ), - ), - ], - ), - ), - ], - ), - ), - ), - FlatButton( - onPressed: () => _share(customer), - child: Row( - children: [ - Text("Share"), - Icon(Icons.share), - ], - )), - ], - ), - ), - ], - ); - } - - _share(User user) async { - MainModel mainModel = Provider.of(context, listen: false); - String appUrl = mainModel.setting.appUrl; - final RenderBox box = context.findRenderObject(); - await Share.share( - user.share + "\n Please join us from this link:\n $appUrl", - subject: "Invitation to FCS App", - sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size); - } -} diff --git a/lib/fcs/common/pages/faq/faq_edit_page.dart b/lib/fcs/common/pages/faq/faq_edit_page.dart index 8017692..383aa35 100644 --- a/lib/fcs/common/pages/faq/faq_edit_page.dart +++ b/lib/fcs/common/pages/faq/faq_edit_page.dart @@ -5,6 +5,7 @@ import 'package:fcs/fcs/common/pages/faq/model/faq_model.dart'; import 'package:fcs/fcs/common/pages/faq/widgets.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -89,15 +90,14 @@ class _FAQEditorState extends State { floating: true, pinned: true, flexibleSpace: FlexibleSpaceBar( - centerTitle: true, - titlePadding: EdgeInsets.symmetric(vertical: 10), - title: Text( - AppTranslations.of(context) - .text(_isNew ? 'faq.add.title' : 'faq.edit.title'), - style: TextStyle( - color: Colors.white, - )), - ), + centerTitle: true, + titlePadding: EdgeInsets.symmetric(vertical: 10), + title: LocalText( + context, + _isNew ? 'faq.add.title' : 'faq.edit.title', + fontSize: 20, + color: Colors.white, + )), ), SliverList( delegate: SliverChildListDelegate([ diff --git a/lib/fcs/common/pages/faq/faq_list_page.dart b/lib/fcs/common/pages/faq/faq_list_page.dart index b354445..50bb6d9 100644 --- a/lib/fcs/common/pages/faq/faq_list_page.dart +++ b/lib/fcs/common/pages/faq/faq_list_page.dart @@ -68,10 +68,12 @@ class _FAQListPageState extends State centerTitle: true, titlePadding: EdgeInsets.symmetric(vertical: 10, horizontal: 45), - title: Text(AppTranslations.of(context).text('faq.title'), - style: TextStyle( - color: Colors.white, - )), + title: LocalText( + context, + "faq.title", + fontSize: 20, + color: Colors.white, + ), ), actions: isEditable ? [ diff --git a/lib/fcs/common/pages/home_page.dart b/lib/fcs/common/pages/home_page.dart index 40185e0..fb0bfd6 100644 --- a/lib/fcs/common/pages/home_page.dart +++ b/lib/fcs/common/pages/home_page.dart @@ -1,17 +1,18 @@ import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/localization/transalation.dart'; -import 'package:fcs/fcs/common/pages/customers/customer_list.dart'; +import 'package:fcs/fcs/common/pages/buying_instruction/buying_online.dart'; +import 'package:fcs/fcs/common/pages/customer/customer_list.dart'; import 'package:fcs/fcs/common/pages/faq/faq_list_page.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/package/package_list.dart'; +import 'package:fcs/fcs/common/pages/payment_methods/payment_method_page.dart'; import 'package:fcs/fcs/common/pages/staff/staff_list.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/action_button.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_widgets.dart'; import 'package:fcs/pages/discount_list.dart'; import 'package:fcs/pages/notification_list.dart'; -import 'package:fcs/pages/payment_method_page.dart'; import 'package:fcs/pages/shipment_list.dart'; import 'package:fcs/pages/term.dart'; import 'package:fcs/pages_fcs/box_list.dart'; @@ -28,7 +29,6 @@ import 'package:intl/intl.dart'; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; -import '../../../pages/buying_online.dart'; import '../../../pages/fcs_profile_page.dart'; import '../../../pages/invoice/invoce_list.dart'; import '../../../pages/pickup_list.dart'; @@ -88,8 +88,8 @@ class _HomePageState extends State { final packagesBtn = _buildBtn("package.btn.name", icon: Octicons.package, - btnCallback: () => - Navigator.of(context).push(BottomUpPageRoute(PackageList()))); + btnCallback: () => Navigator.of(context).push( + CupertinoPageRoute(builder: (context) => PackageList()))); final boxesBtn = _buildBtn("boxes.name", icon: MaterialCommunityIcons.package, @@ -138,22 +138,26 @@ class _HomePageState extends State { ); }); - final staffBtn = _buildBtn("staff.title", - icon: MaterialCommunityIcons.worker, - btnCallback: () => - Navigator.of(context).push(BottomUpPageRoute(StaffList()))); + final staffBtn = _buildBtn( + "staff.title", + icon: MaterialCommunityIcons.worker, + btnCallback: () => Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => StaffList(), + )), + ); final customersBtn = _buildBtn("customers.btn", icon: Feather.users, - btnCallback: () => - Navigator.of(context).push(BottomUpPageRoute(CustomerList()))); + btnCallback: () => Navigator.of(context).push(CupertinoPageRoute( + builder: (context) => CustomerList(), + ))); final invoicesBtn = _buildBtn("invoices.btn", icon: FontAwesomeIcons.fileInvoice, btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(InvoiceList()))); - final paymentMethodBtn = _buildBtn("payment.method.btn", + final paymentMethodBtn = _buildBtn("pm.btn", icon: FontAwesomeIcons.creditCard, btnCallback: () => Navigator.of(context).push(BottomUpPageRoute(PaymentMethodPage()))); @@ -175,7 +179,7 @@ class _HomePageState extends State { List widgets = []; widgets.add(faqBtn); if (user != null) { - // customer ? widgets.add(buyingBtn) : ""; + customer ? widgets.add(buyingBtn) : ""; // customer || owner ? widgets.add(pickUpBtn) : ""; // !customer ? widgets.add(shipmentBtn) : ""; // customer || owner ? widgets.add(notiBtn) : ""; @@ -187,7 +191,7 @@ class _HomePageState extends State { // owner ? widgets.add(deliveryBtn) : ""; user.hasCustomers() ? widgets.add(customersBtn) : ""; // customer || owner ? widgets.add(invoicesBtn) : ""; - // owner ? widgets.add(paymentMethodBtn) : ""; + widgets.add(paymentMethodBtn); // owner ? widgets.add(discountBtn) : ""; // widgets.add(termBtn); } @@ -273,6 +277,7 @@ class _HomePageState extends State { ), ), child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ user.requested ? Container( @@ -287,7 +292,7 @@ class _HomePageState extends State { Expanded( child: ListView(children: [ Wrap( - alignment: WrapAlignment.center, + alignment: WrapAlignment.start, children: widgets, ), ]), diff --git a/lib/fcs/common/pages/market/market_editor.dart b/lib/fcs/common/pages/market/market_editor.dart index 72b16d0..0cf6618 100644 --- a/lib/fcs/common/pages/market/market_editor.dart +++ b/lib/fcs/common/pages/market/market_editor.dart @@ -1,14 +1,7 @@ import 'package:fcs/fcs/common/domain/entities/market.dart'; -import 'package:fcs/fcs/common/domain/entities/role.dart'; -import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; -import 'package:fcs/fcs/common/pages/model/language_model.dart'; -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:fcs/fcs/common/pages/staff/model/staff_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; -import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; diff --git a/lib/fcs/common/pages/package/model/package_model.dart b/lib/fcs/common/pages/package/model/package_model.dart index de52f95..1f2ebff 100644 --- a/lib/fcs/common/pages/package/model/package_model.dart +++ b/lib/fcs/common/pages/package/model/package_model.dart @@ -63,6 +63,11 @@ class PackageModel extends BaseModel { return Services.instance.userService.searchUser(term); } + Future> searchPackage(String term) { + // return Services.instance.userService.searchUser(term); + return null; + } + Future createPackages(User user, List packages) { return Services.instance.packageService .createPackages(packages, user.fcsID); diff --git a/lib/fcs/common/pages/package/package_editor copy.dart b/lib/fcs/common/pages/package/package_editor copy.dart deleted file mode 100644 index 9938f28..0000000 --- a/lib/fcs/common/pages/package/package_editor copy.dart +++ /dev/null @@ -1,427 +0,0 @@ -import 'package:fcs/fcs/common/domain/entities/market.dart'; -import 'package:fcs/fcs/common/domain/entities/package.dart'; -import 'package:fcs/fcs/common/domain/vo/shipping_address.dart'; -import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; -import 'package:fcs/fcs/common/pages/market/market_editor.dart'; -import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; -import 'package:fcs/fcs/common/pages/model/main_model.dart'; -import 'package:fcs/fcs/common/pages/package/tracking_id_page.dart'; -import 'package:fcs/fcs/common/pages/package/shipping_address_editor.dart'; -import 'package:fcs/fcs/common/pages/package/shipping_address_list.dart'; -import 'package:fcs/fcs/common/pages/package/shipping_address_row.dart'; -import 'package:fcs/fcs/common/pages/util.dart'; -import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; -import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/fcs_expansion_tile.dart'; -import 'package:fcs/fcs/common/pages/widgets/image_slider.dart'; -import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/my_data_table.dart'; -import 'package:fcs/fcs/common/pages/widgets/progress.dart'; -import 'package:fcs/pages/barcode_screen_page.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_icons/flutter_icons.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:timeline_list/timeline.dart'; -import 'package:timeline_list/timeline_model.dart'; - -class PackageEditorPage extends StatefulWidget { - final Package package; - PackageEditorPage({this.package}); - - @override - _PackageEditorPageState createState() => _PackageEditorPageState(); -} - -class _PackageEditorPageState extends State { - TextEditingController _remarkCtl = new TextEditingController(); - TextEditingController _descCtl = new TextEditingController(); - - Package _package; - bool _isLoading = false; - List images = [ - "assets/photos/1.jpg", - "assets/photos/2.jpg", - "assets/photos/3.jpg" - ]; - ShippingAddress shippingAddress = ShippingAddress( - fullName: 'U Nyi Nyi', - addressLine1: '154-19 64th Ave.', - addressLine2: 'Flushing', - city: 'NY', - state: 'NY', - phoneNumber: '+1 (292)215-2247'); - - @override - void initState() { - super.initState(); - _package = widget.package; - selectedMarket = _package.market; - } - - final DateFormat dateFormat = DateFormat("d MMM yyyy"); - - List _models() { - if (_package.shipmentHistory == null) return []; - return _package.shipmentHistory - .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)), - 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(); - } - - bool isNew = false; - - @override - Widget build(BuildContext context) { - var owner = Provider.of(context).user.hasPackages(); - - final trackingIdBox = DisplayText( - text: _package.trackingID, - labelText: getLocalString(context, "package.tracking.id"), - iconData: MaterialCommunityIcons.barcode_scan, - ); - final customerNameBox = DisplayText( - text: _package.userName, - labelText: getLocalString(context, "package.create.name"), - iconData: Icons.perm_identity, - ); - final completeProcessingBtn = fcsButton( - context, - getLocalString(context, 'package.edit.complete.process.btn'), - callack: _completeProcessing, - ); - final descBox = fcsInput(getLocalString(context, "package.edit.desc"), - MaterialCommunityIcons.message_text_outline, - controller: _descCtl, autoFocus: true); - final remarkBox = fcsInput( - getLocalString(context, "package.edit.remark"), Entypo.new_message, - controller: _remarkCtl, autoFocus: true); - - return LocalProgress( - inAsyncCall: _isLoading, - child: Scaffold( - appBar: AppBar( - centerTitle: true, - leading: new IconButton( - icon: new Icon(Icons.close, color: primaryColor, size: 30), - onPressed: () => Navigator.of(context).pop(), - ), - shadowColor: Colors.transparent, - backgroundColor: Colors.white, - title: LocalText( - context, - "package.edit.title", - fontSize: 20, - color: primaryColor, - ), - ), - body: ListView( - children: [ - trackingIdBox, - customerNameBox, - owner - ? isNew - ? Container() - : ExpansionTile( - title: Text( - 'Processing', - style: TextStyle( - color: primaryColor, fontWeight: FontWeight.bold), - ), - children: [ - dropDown(), - descBox, - remarkBox, - ], - ) - : Container(), - getImgSlider(images), - ExpansionTile( - title: Text( - 'Status', - style: - TextStyle(color: primaryColor, fontWeight: FontWeight.bold), - ), - children: [ - Container( - padding: EdgeInsets.only(left: 20), - height: 400, - child: Timeline( - children: _models(), position: TimelinePosition.Left), - ), - ], - ), - completeProcessingBtn, - SizedBox( - height: 20, - ) - ], - ), - ), - ); - } - - String selectedMarket; - Widget dropDown() { - List _markets = Provider.of(context).markets; - List markets = _markets.map((e) => e.name).toList(); - markets.insert(0, MANAGE_MARKET); - - return Row( - children: [ - Padding( - padding: const EdgeInsets.only(right: 18.0), - child: LocalText( - context, - "package.create.market", - color: primaryColor, - fontSize: 16, - ), - ), - Container( - width: 150, - child: DropdownButton( - value: selectedMarket, - style: TextStyle(color: Colors.black, fontSize: 14), - underline: Container( - height: 1, - color: Colors.grey, - ), - onChanged: (String newValue) { - setState(() { - if (newValue == MANAGE_MARKET) { - selectedMarket = null; - _manageMarket(); - return; - } - selectedMarket = newValue; - }); - }, - isExpanded: true, - items: markets.map>((String value) { - return DropdownMenuItem( - value: value, - child: Text(value, - overflow: TextOverflow.ellipsis, - style: TextStyle( - color: value == MANAGE_MARKET - ? secondaryColor - : primaryColor)), - ); - }).toList(), - ), - ), - ], - ); - } - - _manageMarket() { - Navigator.push( - context, - BottomUpPageRoute(MarketEditor()), - ); - } - - Widget getShippingAddressList(BuildContext context) { - return Container( - child: ExpansionTile( - title: Text( - "Shipping Addresses", - style: TextStyle( - fontWeight: FontWeight.bold, - fontStyle: FontStyle.normal, - color: primaryColor), - ), - children: [ - // Column( - // children: getAddressList(context, shipmentModel.shippingAddresses), - // ), - Container( - padding: EdgeInsets.only(left: 10, right: 10), - child: Column( - children: [ - Row( - children: [ - Expanded( - child: new Padding( - padding: const EdgeInsets.symmetric(vertical: 10.0), - child: Row( - children: [ - new Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.fullName == null - ? '' - : shippingAddress.fullName, - style: new TextStyle( - fontSize: 15.0, - color: Colors.black, - fontWeight: FontWeight.bold), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.addressLine1 == null - ? '' - : shippingAddress.addressLine1, - style: new TextStyle( - fontSize: 14.0, color: Colors.grey), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.addressLine2 == null - ? '' - : shippingAddress.addressLine2, - style: new TextStyle( - fontSize: 14.0, color: Colors.grey), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.city == null - ? '' - : shippingAddress.city, - style: new TextStyle( - fontSize: 14.0, color: Colors.grey), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.state == null - ? '' - : shippingAddress.state, - style: new TextStyle( - fontSize: 14.0, color: Colors.grey), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: new Text( - shippingAddress.phoneNumber == null - ? '' - : "Phone:${shippingAddress.phoneNumber}", - style: new TextStyle( - fontSize: 14.0, color: Colors.grey), - ), - ), - ], - ), - ], - ), - ), - ), - ], - ), - ], - ), - ), - Container( - padding: EdgeInsets.only(top: 20, bottom: 15, right: 15), - child: Align( - alignment: Alignment.bottomRight, - child: Container( - width: 130, - height: 40, - child: FloatingActionButton.extended( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - onPressed: () async { - var address = await Navigator.push( - context, - BottomUpPageRoute(ShippingAddressList()), - ); - print('address => ${address}'); - setState(() { - if (address != null) { - this.shippingAddress = address; - } - }); - }, - icon: Icon(Icons.add), - label: Text( - 'Select \nAddress', - style: TextStyle(fontSize: 12), - ), - backgroundColor: primaryColor, - ), - ), - ), - ) - ], - ), - ); - } - - List getAddressList( - BuildContext context, List addresses) { - return addresses.asMap().entries.map((s) { - return InkWell( - onTap: () { - Navigator.push( - context, - BottomUpPageRoute(ShippingAddressEditor(shippingAddress: s.value)), - ); - }, - child: ShippingAddressRow(shippingAddress: s.value, index: s.key), - ); - }).toList(); - } - - List getAddressRows(List addresses) { - return addresses.map((s) { - return MyDataRow( - onSelectChanged: (selected) {}, - cells: [ - MyDataCell( - new Text( - s.fullName, - style: textStyle, - ), - ), - MyDataCell( - new Text( - s.phoneNumber, - style: textStyle, - ), - ), - ], - ); - }).toList(); - } - - _completeProcessing() {} -} diff --git a/lib/fcs/common/pages/package/package_editor.dart b/lib/fcs/common/pages/package/package_editor.dart index a671095..735aeff 100644 --- a/lib/fcs/common/pages/package/package_editor.dart +++ b/lib/fcs/common/pages/package/package_editor.dart @@ -1,6 +1,5 @@ import 'package:fcs/fcs/common/domain/entities/market.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart'; -import 'package:fcs/fcs/common/domain/vo/shipping_address.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/pages/market/market_editor.dart'; import 'package:fcs/fcs/common/pages/market/model/market_model.dart'; @@ -9,7 +8,6 @@ import 'package:fcs/fcs/common/pages/package/tracking_id_page.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; -import 'package:fcs/fcs/common/pages/widgets/image_slider.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/multi_img_controller.dart'; import 'package:fcs/fcs/common/pages/widgets/multi_img_file.dart'; @@ -18,7 +16,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:timeline_list/timeline_model.dart'; class PackageEditorPage extends StatefulWidget { final Package package; @@ -34,13 +31,6 @@ class _PackageEditorPageState extends State { Package _package; bool _isLoading = false; - ShippingAddress shippingAddress = ShippingAddress( - fullName: 'U Nyi Nyi', - addressLine1: '154-19 64th Ave.', - addressLine2: 'Flushing', - city: 'NY', - state: 'NY', - phoneNumber: '+1 (292)215-2247'); @override void initState() { @@ -54,38 +44,6 @@ class _PackageEditorPageState extends State { final DateFormat dateFormat = DateFormat("d MMM yyyy"); - List _models() { - if (_package.shipmentHistory == null) return []; - return _package.shipmentHistory - .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)), - 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(); - } - bool isNew = false; MultiImgController multiImgController = MultiImgController(); diff --git a/lib/fcs/common/pages/package/package_list.dart b/lib/fcs/common/pages/package/package_list.dart index 964084a..d998b8a 100644 --- a/lib/fcs/common/pages/package/package_list.dart +++ b/lib/fcs/common/pages/package/package_list.dart @@ -3,9 +3,12 @@ import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/pages/package/model/package_model.dart'; import 'package:fcs/fcs/common/pages/package/package_list_row.dart'; import 'package:fcs/fcs/common/pages/package/package_new.dart'; +import 'package:fcs/fcs/common/pages/package_search/package_serach.dart'; import 'package:fcs/fcs/common/pages/user_search/user_serach.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -37,11 +40,16 @@ class _PackageListState extends State { appBar: AppBar( centerTitle: true, leading: new IconButton( - icon: new Icon(Icons.close), + icon: new Icon(CupertinoIcons.back), onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("package.title")), + title: LocalText( + context, + "package.title", + fontSize: 20, + color: Colors.white, + ), actions: [ // IconButton( // icon: Icon( @@ -62,7 +70,7 @@ class _PackageListState extends State { color: Colors.white, ), iconSize: 30, - onPressed: () => searchUser(context), + onPressed: () => searchPackage(context), ), ], ), diff --git a/lib/fcs/common/pages/package/package_new.dart b/lib/fcs/common/pages/package/package_new.dart index 149e518..52ef4a1 100644 --- a/lib/fcs/common/pages/package/package_new.dart +++ b/lib/fcs/common/pages/package/package_new.dart @@ -7,6 +7,7 @@ import 'package:fcs/fcs/common/pages/staff/model/staff_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/fcs_id_icon.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/material.dart'; @@ -41,7 +42,7 @@ class _PackageNewState extends State { child: DisplayText( text: user != null ? user.fcsID : "", labelText: getLocalString(context, "package.create.fcs.id"), - iconData: Icons.perm_identity, + icon: FcsIDIcon(), )), IconButton( icon: Icon(Icons.search, color: primaryColor), diff --git a/lib/fcs/common/pages/package/shipping_address_list.dart b/lib/fcs/common/pages/package/shipping_address_list.dart index 814525b..8441a62 100644 --- a/lib/fcs/common/pages/package/shipping_address_list.dart +++ b/lib/fcs/common/pages/package/shipping_address_list.dart @@ -1,4 +1,5 @@ import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/model/shipment_model.dart'; import 'package:fcs/pages/search_page.dart'; @@ -41,7 +42,12 @@ class _ShippingAddressListState extends State { onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, - title: Text(AppTranslations.of(context).text("shipping_addresses")), + title: LocalText( + context, + "shipping_addresses", + fontSize: 20, + color: Colors.white, + ), actions: [ IconButton( icon: Icon( diff --git a/lib/fcs/common/pages/package_search/package_search_row.dart b/lib/fcs/common/pages/package_search/package_search_row.dart new file mode 100644 index 0000000..247c91e --- /dev/null +++ b/lib/fcs/common/pages/package_search/package_search_row.dart @@ -0,0 +1,88 @@ +import 'package:fcs/fcs/common/domain/entities/package.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/package_search/package_serach.dart'; +import 'package:flutter/material.dart'; + +class PackageSearchRow extends StatefulWidget { + final CallbackPackageSelect callbackPackageSelect; + final Package package; + const PackageSearchRow({this.package, this.callbackPackageSelect}); + + @override + _PackageSearchRowState createState() => _PackageSearchRowState(); +} + +class _PackageSearchRowState extends State { + final double dotSize = 15.0; + Package package; + @override + void initState() { + super.initState(); + this.package = widget.package; + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(left: 15, right: 15), + child: Card( + elevation: 10, + color: Colors.white, + child: InkWell( + onTap: () { + Navigator.pop(context); + if (widget.callbackPackageSelect != null) + widget.callbackPackageSelect(package); + }, + child: Row( + children: [ + Expanded( + child: new Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: new Row( + children: [ + new Padding( + padding: new EdgeInsets.symmetric( + horizontal: 32.0 - dotSize / 2), + child: Image.asset( + "assets/buyer.png", + width: 40, + height: 40, + color: primaryColor, + ), + ), + new Expanded( + child: new Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + new Text( + package.trackingID == null + ? '' + : package.trackingID, + style: new TextStyle( + fontSize: 15.0, color: Colors.black), + ), + new Text( + package.userName == null ? "" : package.userName, + style: new TextStyle( + fontSize: 13.0, color: Colors.grey), + ), + new Text( + package.fcsID == null ? "" : package.fcsID, + style: new TextStyle( + fontSize: 13.0, color: Colors.grey), + ), + ], + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/fcs/common/pages/package_search/package_serach.dart b/lib/fcs/common/pages/package_search/package_serach.dart new file mode 100644 index 0000000..86e3b73 --- /dev/null +++ b/lib/fcs/common/pages/package_search/package_serach.dart @@ -0,0 +1,117 @@ +import 'package:fcs/fcs/common/domain/entities/package.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/package/model/package_model.dart'; +import 'package:fcs/fcs/common/pages/package_search/package_search_row.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +typedef CallbackPackageSelect(Package package); + +Future searchPackage(BuildContext context, + {CallbackPackageSelect callbackPackageSelect}) async => + await showSearch( + context: context, + delegate: + PackageSearchDelegate(callbackPackageSelect: callbackPackageSelect), + ); + +class PackageSearchDelegate extends SearchDelegate { + final CallbackPackageSelect callbackPackageSelect; + + PackageSearchDelegate({this.callbackPackageSelect}); + + @override + String get searchFieldLabel => 'Search by FCS ID or Name'; + + @override + ThemeData appBarTheme(BuildContext context) { + final ThemeData theme = Theme.of(context); + return theme.copyWith( + inputDecorationTheme: InputDecorationTheme( + hintStyle: TextStyle( + color: theme.primaryTextTheme.caption.color, fontSize: 14)), + textTheme: theme.textTheme.copyWith( + title: theme.textTheme.title.copyWith( + color: theme.primaryTextTheme.title.color, fontSize: 16)), + primaryColor: primaryColor, + ); + } + + @override + List buildActions(BuildContext context) { + return [ + IconButton( + icon: Icon(Icons.clear), + onPressed: () => query = '', + ), + ]; + } + + @override + Widget buildLeading(BuildContext context) { + return IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () => close(context, null), + ); + } + + @override + Widget buildResults(BuildContext context) { + final packageModel = Provider.of(context); + return FutureBuilder( + future: packageModel.searchPackage(query), + builder: (context, AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + if (snapshot.data.length == 0) { + return Container( + child: Center( + child: Text( + "No result found", + textAlign: TextAlign.center, + ), + ), + ); + } + return Container( + padding: EdgeInsets.only(top: 15), + child: ListView( + children: snapshot.data + .map((u) => PackageSearchRow( + package: u, + callbackPackageSelect: callbackPackageSelect, + )) + .toList(), + ), + ); + } else if (snapshot.hasError) { + return Container( + child: Center( + child: Text( + '${snapshot.error}', + textAlign: TextAlign.center, + ), + ), + ); + } else { + return Container( + child: Center( + child: CircularProgressIndicator( + valueColor: + new AlwaysStoppedAnimation(primaryColor)), + ), + ); + } + }); + } + + @override + Widget buildSuggestions(BuildContext context) { + return Container( + child: Center( + child: Opacity( + opacity: 0.2, + child: Icon(Icons.perm_identity, size: 200, color: primaryColor)), + ), + ); + } +} diff --git a/lib/fcs/common/pages/payment_methods/model/payment_method_model.dart b/lib/fcs/common/pages/payment_methods/model/payment_method_model.dart new file mode 100644 index 0000000..544d699 --- /dev/null +++ b/lib/fcs/common/pages/payment_methods/model/payment_method_model.dart @@ -0,0 +1,49 @@ +import 'dart:async'; + +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; +import 'package:fcs/fcs/common/pages/model/base_model.dart'; +import 'package:fcs/fcs/common/services/services.dart'; +import 'package:logging/logging.dart'; + +class PaymentMethodModel extends BaseModel { + final log = Logger('PaymentMethodModel'); + + List paymentMethods = []; + + PaymentMethod getPaymentMethod(String id) { + return paymentMethods.firstWhere((e) => e.id == id, orElse: () => null); + } + + StreamSubscription listener; + + PaymentMethodModel() { + if (listener != null) listener.cancel(); + try { + listener = Firestore.instance + .collection("/payment_methods") + .snapshots() + .listen((snaps) { + paymentMethods.clear(); + snaps.documents.forEach((d) { + paymentMethods.add(PaymentMethod.fromMap(d.data, d.documentID)); + }); + notifyListeners(); + }); + } catch (e) { + log.warning("error:$e"); + } + } + + Future addPaymentMethod(PaymentMethod paymentMethod) async { + Services.instance.commonService.createPaymentMethod(paymentMethod); + } + + Future updatePaymentMethod(PaymentMethod paymentMethod) async { + Services.instance.commonService.updatePaymentMethod(paymentMethod); + } + + Future deletePaymentMethod(String id) async { + Services.instance.commonService.deletePayment(id); + } +} diff --git a/lib/fcs/common/pages/payment_methods/payment_method_editor.dart b/lib/fcs/common/pages/payment_methods/payment_method_editor.dart new file mode 100644 index 0000000..c681d16 --- /dev/null +++ b/lib/fcs/common/pages/payment_methods/payment_method_editor.dart @@ -0,0 +1,212 @@ +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/payment_methods/model/payment_method_model.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/input_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; +import 'package:provider/provider.dart'; + +class PaymentMethodEditor extends StatefulWidget { + final PaymentMethod paymentMethod; + + const PaymentMethodEditor({Key key, this.paymentMethod}) : super(key: key); + @override + _PaymentMethodEditorState createState() => _PaymentMethodEditorState(); +} + +class _PaymentMethodEditorState extends State { + bool _isLoading = false; + PaymentMethod _paymentMethod; + TextEditingController _nameController = new TextEditingController(); + TextEditingController _accountNameController = new TextEditingController(); + TextEditingController _accountNumberController = new TextEditingController(); + TextEditingController _mailController = new TextEditingController(); + TextEditingController _phoneController = new TextEditingController(); + TextEditingController _linkController = new TextEditingController(); + + bool isNew; + + @override + void initState() { + super.initState(); + isNew = widget.paymentMethod == null; + + if (widget.paymentMethod != null) { + _paymentMethod = widget.paymentMethod; + _nameController.text = _paymentMethod.name; + _accountNameController.text = _paymentMethod.accountName; + _accountNumberController.text = _paymentMethod.account; + _mailController.text = _paymentMethod.email; + _phoneController.text = _paymentMethod.phone; + _linkController.text = _paymentMethod.link; + } else { + _paymentMethod = new PaymentMethod(); + _nameController.text = ''; + } + } + + @override + Widget build(BuildContext context) { + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + centerTitle: true, + leading: new IconButton( + icon: new Icon(Icons.close, color: primaryColor), + onPressed: () => Navigator.of(context).pop(), + ), + title: LocalText( + context, + isNew ? "pm.new" : "pm.update", + fontSize: 20, + color: primaryColor, + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + actions: [ + isNew + ? Container() + : IconButton( + icon: Icon( + Icons.delete, + color: primaryColor, + ), + onPressed: _delete, + ) + ], + ), + body: Padding( + padding: const EdgeInsets.only(left: 20.0, right: 10), + child: ListView( + children: [ + InputText( + labelTextKey: "pm.name", + iconData: Octicons.tag, + controller: _nameController, + ), + InputText( + labelTextKey: "pm.account.name", + iconData: MaterialCommunityIcons.bank, + controller: _accountNameController, + ), + InputText( + labelTextKey: "pm.account.no", + iconData: MaterialCommunityIcons.checkbook, + controller: _accountNumberController, + ), + InputText( + labelTextKey: "pm.phone", + iconData: Icons.phone, + controller: _phoneController, + ), + InputText( + labelTextKey: "pm.email", + iconData: Icons.mail, + controller: _mailController, + ), + InputText( + labelTextKey: "pm.link", + iconData: Icons.link, + controller: _linkController, + ), + SizedBox( + height: 20, + ), + isNew + ? fcsButton(context, getLocalString(context, "pm.add.btn"), + callack: _add) + : fcsButton(context, getLocalString(context, "pm.save.btn"), + callack: _save), + SizedBox( + height: 30, + ) + ], + ), + )), + ); + } + + _add() async { + if (_nameController.text == "") { + showMsgDialog(context, "Error", "Need a name for a payment method"); + return; + } + setState(() { + _isLoading = true; + }); + try { + PaymentMethod pm = PaymentMethod( + name: _nameController.text, + accountName: _accountNameController.text, + account: _accountNumberController.text, + email: _mailController.text, + phone: _phoneController.text, + link: _linkController.text); + await Provider.of(context, listen: false) + .addPaymentMethod(pm); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _save() async { + if (_nameController.text == "") { + showMsgDialog(context, "Error", "Need a name for a payment method"); + return; + } + setState(() { + _isLoading = true; + }); + try { + PaymentMethod pm = PaymentMethod( + id: _paymentMethod.id, + name: _nameController.text, + accountName: _accountNameController.text, + account: _accountNumberController.text, + email: _mailController.text, + phone: _phoneController.text, + link: _linkController.text); + await Provider.of(context, listen: false) + .updatePaymentMethod(pm); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } + + _delete() { + showConfirmDialog(context, "pm.delete.confirm", () => _deleteConfirmed()); + } + + _deleteConfirmed() async { + setState(() { + _isLoading = true; + }); + try { + await Provider.of(context, listen: false) + .deletePaymentMethod(_paymentMethod.id); + Navigator.pop(context); + } catch (e) { + showMsgDialog(context, "Error", e.toString()); + } finally { + setState(() { + _isLoading = false; + }); + } + } +} diff --git a/lib/fcs/common/pages/payment_methods/payment_method_page.dart b/lib/fcs/common/pages/payment_methods/payment_method_page.dart new file mode 100644 index 0000000..5918f52 --- /dev/null +++ b/lib/fcs/common/pages/payment_methods/payment_method_page.dart @@ -0,0 +1,155 @@ +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; +import 'package:fcs/fcs/common/helpers/theme.dart'; +import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/payment_methods/model/payment_method_model.dart'; +import 'package:fcs/fcs/common/pages/payment_methods/payment_method_editor.dart'; +import 'package:fcs/fcs/common/pages/util.dart'; +import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; +import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_icons/flutter_icons.dart'; +import 'package:provider/provider.dart'; + +class PaymentMethodPage extends StatefulWidget { + @override + _PaymentMethodPageState createState() => _PaymentMethodPageState(); +} + +class _PaymentMethodPageState extends State { + GlobalKey key = GlobalKey(); + bool _isLoading = false; + @override + Widget build(BuildContext context) { + PaymentMethodModel mainModel = Provider.of(context); + + return LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + key: key, + appBar: AppBar( + leading: new IconButton( + icon: new Icon( + Icons.close, + color: primaryColor, + ), + onPressed: () => Navigator.of(context).pop(), + ), + centerTitle: true, + title: LocalText( + context, + "pm.title", + fontSize: 20, + color: primaryColor, + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + actions: [], + ), + body: Padding( + padding: const EdgeInsets.all(12.0), + child: ListView.separated( + separatorBuilder: (context, index) => Divider( + color: Colors.black, + ), + itemCount: mainModel.paymentMethods.length, + itemBuilder: (BuildContext context, int index) { + var method = mainModel.paymentMethods[index]; + return _item(method); + }, + ), + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + Navigator.push( + context, + BottomUpPageRoute(PaymentMethodEditor()), + ); + }, + icon: Icon(Icons.add), + label: LocalText(context, "pm.new", color: Colors.white), + backgroundColor: primaryColor, + ), + ), + ); + } + + _item(PaymentMethod method) { + final accountName = _itemRow(method.accountName, "pm.account.name", + iconData: MaterialCommunityIcons.bank); + final accountNumber = _itemRow(method.account, "pm.account.no", + iconData: MaterialCommunityIcons.checkbook); + final phone = _itemRow(method.phone, "pm.phone", iconData: Icons.phone); + final email = _itemRow(method.email, "pm.email", iconData: Icons.mail); + final link = _itemRow(method.link, "pm.link", iconData: Icons.link); + + return InkWell( + onTap: () { + Navigator.push( + context, + BottomUpPageRoute(PaymentMethodEditor( + paymentMethod: method, + )), + ); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + method.name, + style: TextStyle( + color: primaryColor, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ), + accountName, + accountNumber, + phone, + email, + link + ], + ), + ); + } + + _itemRow(String text, String labelKey, {IconData iconData}) { + return text == null || text == "" + ? Container() + : Row( + children: [ + Expanded( + child: DisplayText( + text: text, + labelText: getLocalString(context, labelKey), + iconData: iconData, + ), + ), + IconButton( + icon: Icon(Icons.content_copy, color: Colors.grey), + onPressed: () => _copy(getLocalString(context, labelKey), text), + ) + ], + ); + } + + _copy(String title, String data) { + Clipboard.setData(ClipboardData(text: data)); + _showToast(title); + } + + void _showToast(String title) { + final ScaffoldState scaffold = key.currentState; + scaffold.showSnackBar( + SnackBar( + content: Text('copied "$title" data to clipboard'), + backgroundColor: secondaryColor, + duration: Duration(seconds: 1), + ), + ); + } +} diff --git a/lib/fcs/common/pages/profile/profile_edit.dart b/lib/fcs/common/pages/profile/profile_edit.dart index f6f1fd7..eb9e71b 100644 --- a/lib/fcs/common/pages/profile/profile_edit.dart +++ b/lib/fcs/common/pages/profile/profile_edit.dart @@ -2,6 +2,7 @@ import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -59,9 +60,11 @@ class _ProfileEditState extends State { child: Scaffold( appBar: AppBar( centerTitle: true, - title: Text( - AppTranslations.of(context).text("profile.edit_title"), - style: TextStyle(color: primaryColor), + title: LocalText( + context, + "profile.edit_title", + fontSize: 20, + color: primaryColor, ), backgroundColor: Colors.white, shadowColor: Colors.transparent, diff --git a/lib/fcs/common/pages/profile/profile_page.dart b/lib/fcs/common/pages/profile/profile_page.dart index e8f0b38..8071d1c 100644 --- a/lib/fcs/common/pages/profile/profile_page.dart +++ b/lib/fcs/common/pages/profile/profile_page.dart @@ -4,6 +4,8 @@ import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/profile/profile_edit.dart'; import 'package:fcs/fcs/common/pages/widgets/display_text.dart'; +import 'package:fcs/fcs/common/pages/widgets/fcs_id_icon.dart'; +import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:fcs/model/shipment_model.dart'; import 'package:fcs/model/user_model.dart'; @@ -74,7 +76,7 @@ class _ProfileState extends State { child: DisplayText( text: mainModel.user.fcsID, labelText: getLocalString(context, "customer.fcs.id"), - iconData: Icons.account_circle, + icon: FcsIDIcon(), ), ), IconButton( @@ -120,9 +122,11 @@ class _ProfileState extends State { ), onPressed: () => Navigator.of(context).pop(), ), - title: Text( - AppTranslations.of(context).text("profile.title"), - style: TextStyle(color: primaryColor), + title: LocalText( + context, + "profile.title", + fontSize: 20, + color: primaryColor, ), shadowColor: Colors.transparent, backgroundColor: Colors.white, diff --git a/lib/fcs/common/pages/signin/signin_page.dart b/lib/fcs/common/pages/signin/signin_page.dart index 28b2d2d..08df356 100644 --- a/lib/fcs/common/pages/signin/signin_page.dart +++ b/lib/fcs/common/pages/signin/signin_page.dart @@ -1,11 +1,8 @@ import 'package:country_code_picker/country_code_picker.dart'; import 'package:fcs/fcs/common/domain/entities/auth_result.dart'; import 'package:fcs/fcs/common/domain/entities/auth_status.dart'; -import 'package:fcs/fcs/common/domain/entities/setting.dart'; -import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/signin/signin_logic.dart'; -import 'package:fcs/fcs/common/pages/signin/signup_page.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/widget/bottom_up_page_route.dart'; import 'package:flutter/material.dart'; @@ -13,10 +10,10 @@ import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import '../../helpers/theme.dart'; import '../../../../widget/progress.dart'; -import 'sms_code_page.dart'; +import '../../helpers/theme.dart'; import '../util.dart'; +import 'sms_code_page.dart'; class SigninPage extends StatefulWidget { @override diff --git a/lib/fcs/common/pages/staff/staff_editor.dart b/lib/fcs/common/pages/staff/staff_editor.dart index a634d44..1604b38 100644 --- a/lib/fcs/common/pages/staff/staff_editor.dart +++ b/lib/fcs/common/pages/staff/staff_editor.dart @@ -73,10 +73,10 @@ class _StaffEditorState extends State { children: [ new Text( p.name, - style: TextStyle( - fontSize: 15.0, - ), + style: TextStyle(fontSize: 15.0, color: primaryColor), ), + Text(p.desc, + style: TextStyle(fontSize: 13, color: Colors.grey[600])) ], ), ], @@ -185,6 +185,10 @@ class _StaffEditorState extends State { : Container(), phoneNumberBox, namebox, + Padding( + padding: const EdgeInsets.only(top: 18.0), + child: Text("Privileges"), + ), Column( children: showprivilegeList(context), ), diff --git a/lib/fcs/common/pages/staff/staff_list.dart b/lib/fcs/common/pages/staff/staff_list.dart index 9eeed2d..c67d1ed 100644 --- a/lib/fcs/common/pages/staff/staff_list.dart +++ b/lib/fcs/common/pages/staff/staff_list.dart @@ -5,6 +5,7 @@ import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_icons/flutter_icons.dart'; @@ -33,7 +34,7 @@ class _StaffListState extends State { appBar: AppBar( centerTitle: true, leading: new IconButton( - icon: new Icon(Icons.close), + icon: new Icon(CupertinoIcons.back), onPressed: () => Navigator.of(context).pop(), ), backgroundColor: primaryColor, diff --git a/lib/fcs/common/pages/term/term_edit.dart b/lib/fcs/common/pages/term/term_edit.dart index 6d70041..46ff23e 100644 --- a/lib/fcs/common/pages/term/term_edit.dart +++ b/lib/fcs/common/pages/term/term_edit.dart @@ -22,10 +22,12 @@ class TermEdit extends StatefulWidget { class _TermEditState extends State { /// Allows to control the editor and the document. - ZefyrController _controller; + ZefyrController _controllerEng; + ZefyrController _controllerMm; /// Zefyr editor like any other input field requires a focus node. - FocusNode _focusNode; + FocusNode _focusNodeEng; + FocusNode _focusNodeMm; bool _isLoading; @override @@ -34,16 +36,17 @@ class _TermEditState extends State { _isLoading = false; // Here we must load the document and pass it to Zefyr controller. - final document = _loadDocument(); - _controller = ZefyrController(document); - _focusNode = FocusNode(); + _controllerEng = ZefyrController(_loadDocument(widget.term.termEng)); + _controllerMm = ZefyrController(_loadDocument(widget.term.termMm)); + _focusNodeEng = FocusNode(); + _focusNodeMm = FocusNode(); } /// Loads the document to be edited in Zefyr. - NotusDocument _loadDocument() { + NotusDocument _loadDocument(String data) { NotusDocument doc; try { - doc = NotusDocument.fromJson(jsonDecode(widget.term.term)); + doc = NotusDocument.fromJson(jsonDecode(data)); } catch (e) {} if (doc == null) { doc = NotusDocument(); @@ -55,58 +58,109 @@ class _TermEditState extends State { Widget build(BuildContext context) { final savebtn = fcsButton(context, getLocalString(context, "btn.save"), callack: _save); - return LocalProgress( - inAsyncCall: _isLoading, - child: Scaffold( - appBar: AppBar( - title: LocalLargeTitle( - context, - "term", - color: Colors.white, - ), - leading: IconButton( - icon: Icon( - CupertinoIcons.back, - size: 30, + + return DefaultTabController( + length: 2, + child: LocalProgress( + inAsyncCall: _isLoading, + child: Scaffold( + appBar: AppBar( + title: LocalLargeTitle( + context, + "term", + color: primaryColor, + ), + leading: IconButton( + icon: Icon( + CupertinoIcons.back, + color: primaryColor, + size: 30, + ), + onPressed: () => Navigator.of(context).pop(), + ), + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + bottom: TabBar( + onTap: (index) { + // Tab index when user select it, it start from zero + }, + tabs: [ + Tab( + icon: Image.asset( + 'icons/flags/png/us.png', + package: 'country_icons', + fit: BoxFit.fitWidth, + width: 25, + )), + Tab( + icon: Image.asset( + 'icons/flags/png/mm.png', + package: 'country_icons', + fit: BoxFit.fitWidth, + width: 25, + )), + ], ), - onPressed: () => Navigator.of(context).pop(), ), - backgroundColor: primaryColor, - ), - body: ListView( - children: [ - Container( - height: MediaQuery.of(context).size.height - 150, - child: ZefyrScaffold( - child: ZefyrTheme( - data: ZefyrThemeData().copyWith(), - child: ZefyrEditor( - padding: EdgeInsets.all(16), - controller: _controller, - focusNode: _focusNode, - ), + body: ListView( + children: [ + Container( + height: MediaQuery.of(context).size.height - 200, + child: TabBarView( + children: [ + textEditor(_controllerEng, _focusNodeEng), + textEditor(_controllerMm, _focusNodeMm), + ], ), ), - ), - savebtn, - SizedBox( - height: 10, - ) - ], + savebtn, + ], + ), ), ), ); } + Widget textEditor(ZefyrController controller, FocusNode focusNode) { + return ListView( + children: [ + Container( + height: MediaQuery.of(context).size.height - 200, + child: ZefyrScaffold( + child: ZefyrTheme( + data: ZefyrThemeData().copyWith( + defaultLineTheme: LineTheme( + padding: EdgeInsets.all(0), + textStyle: TextStyle(fontFamily: "Myanmar3"), + ), + ), + child: ZefyrEditor( + autofocus: false, + padding: EdgeInsets.all(16), + controller: controller, + focusNode: focusNode, + ), + ), + ), + ), + // savebtn, + SizedBox( + height: 10, + ) + ], + ); + } + _save() async { setState(() { _isLoading = true; }); try { - final contents = jsonEncode(_controller.document); - print('contents => $contents'); + final contentsEng = jsonEncode(_controllerEng.document); + final contentsMm = jsonEncode(_controllerMm.document); + print('contents => $contentsEng'); TermModel termModel = Provider.of(context, listen: false); - await termModel.saveTerm(Term(term: contents)); + await termModel.saveTerm(Term(termEng: contentsEng, termMm: contentsMm)); } catch (e) { showMsgDialog(context, "Error", e.toString()); } finally { diff --git a/lib/fcs/common/pages/term/term_page.dart b/lib/fcs/common/pages/term/term_page.dart index 70777df..0b475ea 100644 --- a/lib/fcs/common/pages/term/term_page.dart +++ b/lib/fcs/common/pages/term/term_page.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:fcs/fcs/common/domain/entities/setting.dart'; import 'package:fcs/fcs/common/domain/vo/term.dart'; import 'package:fcs/fcs/common/helpers/theme.dart'; -import 'package:fcs/fcs/common/localization/app_translations.dart'; +import 'package:fcs/fcs/common/pages/model/language_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/term/term_edit.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; @@ -35,7 +35,8 @@ class _TermPageState extends State { } NotusDocument _loadDocument(Setting setting) { - String term = setting.terms; + bool isEng = Provider.of(context).isEng; + String term = isEng ? setting.termsEng : setting.termsMm; NotusDocument doc; try { doc = NotusDocument.fromJson(jsonDecode(term)); @@ -52,27 +53,22 @@ class _TermPageState extends State { bool isEditable = context.select((MainModel m) => m.termEditable()); return Scaffold( - body: CustomScrollView(slivers: [ - SliverAppBar( - leading: IconButton( - icon: Icon( - CupertinoIcons.back, - size: 30, + appBar: AppBar( + shadowColor: Colors.transparent, + backgroundColor: Colors.white, + centerTitle: true, + leading: new IconButton( + icon: new Icon( + Icons.close, + color: primaryColor, ), onPressed: () => Navigator.of(context).pop(), ), - backgroundColor: primaryColor, - expandedHeight: 100.0, - floating: false, - pinned: true, - flexibleSpace: FlexibleSpaceBar( - centerTitle: true, - titlePadding: EdgeInsets.symmetric(vertical: 10), - title: LocalLargeTitle( - context, - "term", - color: Colors.white, - ), + title: LocalText( + context, + 'term', + color: primaryColor, + fontSize: 20, ), actions: isEditable ? [ @@ -84,85 +80,30 @@ class _TermPageState extends State { )), icon: Icon( CupertinoIcons.pen, - color: Colors.white, + color: primaryColor, )) ] : [], ), - SliverFillRemaining( - child: ZefyrTheme( - data: ZefyrThemeData().copyWith( - defaultLineTheme: LineTheme( - textStyle: TextStyle(color: Colors.black), - padding: EdgeInsets.all(0))), - child: ZefyrScaffold( - child: ZefyrEditor( - mode: ZefyrMode.view, - padding: EdgeInsets.all(16), - controller: ZefyrController(_loadDocument(setting)), - focusNode: _focusNode, - ), - ))), - ])); - } - - @override - Widget build1(BuildContext context) { - Setting setting = Provider.of(context).setting; - return CupertinoPageScaffold( - child: NestedScrollView( - floatHeaderSlivers: false, - headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { - return [ - SliverAppBar( - leading: IconButton( - icon: Icon( - CupertinoIcons.back, - size: 30, - ), - onPressed: () => Navigator.of(context).pop(), - ), - backgroundColor: primaryColor, - expandedHeight: 150.0, - floating: true, - pinned: true, - flexibleSpace: FlexibleSpaceBar( - centerTitle: true, - titlePadding: EdgeInsets.symmetric(vertical: 10), - title: LocalLargeTitle( - context, - "term", - color: Colors.white, - ), - ), - actions: [ - IconButton( - onPressed: () => - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => - TermEdit(term: Term.fromSetting(setting)), - )), - icon: Icon( - CupertinoIcons.pen, - color: Colors.white, - )) - ], - ), - ]; - }, - body: ZefyrTheme( - data: ZefyrThemeData().copyWith( - defaultLineTheme: LineTheme( - textStyle: TextStyle(color: Colors.black), - padding: EdgeInsets.all(0))), - child: ZefyrScaffold( - child: ZefyrEditor( - mode: ZefyrMode.view, - padding: EdgeInsets.all(16), - controller: ZefyrController(_loadDocument(setting)), - focusNode: _focusNode, - ), - ))), + body: ZefyrTheme( + data: ZefyrThemeData().copyWith( + defaultLineTheme: LineTheme( + padding: EdgeInsets.all(0), + textStyle: TextStyle(fontFamily: "Myanmar3"), + ), + ), + // data: ZefyrThemeData().copyWith( + // defaultLineTheme: LineTheme( + // textStyle: TextStyle(color: Colors.black), + // padding: EdgeInsets.all(0))), + child: ZefyrScaffold( + child: ZefyrEditor( + mode: ZefyrMode.view, + padding: EdgeInsets.all(16), + controller: ZefyrController(_loadDocument(setting)), + focusNode: _focusNode, + ), + )), ); } } diff --git a/lib/fcs/common/pages/user_search/user_serach.dart b/lib/fcs/common/pages/user_search/user_serach.dart index 5358266..72ca7ed 100644 --- a/lib/fcs/common/pages/user_search/user_serach.dart +++ b/lib/fcs/common/pages/user_search/user_serach.dart @@ -109,10 +109,7 @@ class UserSearchDelegate extends SearchDelegate { child: Center( child: Opacity( opacity: 0.2, - child: Icon( - Icons.supervised_user_circle, - size: 200, - )), + child: Icon(Icons.perm_identity, size: 200, color: primaryColor)), ), ); } diff --git a/lib/fcs/common/pages/welcome_page.dart b/lib/fcs/common/pages/welcome_page.dart index ff8d79c..03bb677 100644 --- a/lib/fcs/common/pages/welcome_page.dart +++ b/lib/fcs/common/pages/welcome_page.dart @@ -1,5 +1,4 @@ import 'package:fcs/fcs/common/pages/model/language_model.dart'; -import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/widgets/bottom_widgets.dart'; import 'package:fcs/widget/banner.dart'; @@ -8,12 +7,10 @@ import 'package:fcs/widget/localization/transalation.dart'; import 'package:fcs/widget/offline_redirect.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart' as intl; import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import '../helpers/theme.dart'; -import 'profile/profile_page.dart'; import 'signin/signin_page.dart'; final msgLog = Logger('backgroundMessageHandler'); diff --git a/lib/fcs/common/pages/widgets/bottom_widgets.dart b/lib/fcs/common/pages/widgets/bottom_widgets.dart index e16cae0..23c0db0 100644 --- a/lib/fcs/common/pages/widgets/bottom_widgets.dart +++ b/lib/fcs/common/pages/widgets/bottom_widgets.dart @@ -1,5 +1,6 @@ import 'package:fcs/fcs/common/pages/contact/contact_page.dart'; import 'package:fcs/fcs/common/pages/term/term_page.dart'; +import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -14,18 +15,14 @@ class BottomWidgets extends StatelessWidget { children: [ InkWell( onTap: () { - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => ContactPage(), - )); + Navigator.of(context).push(BottomUpPageRoute(ContactPage())); }, child: _buildSmallButton( context, "contact.btn", SimpleLineIcons.support), ), InkWell( onTap: () { - Navigator.of(context).push(CupertinoPageRoute( - builder: (context) => TermPage(), - )); + Navigator.of(context).push(BottomUpPageRoute(TermPage())); }, child: _buildSmallButton(context, "term.btn", Icons.info_outline), ), diff --git a/lib/fcs/common/pages/widgets/display_text.dart b/lib/fcs/common/pages/widgets/display_text.dart index c49714c..a018725 100644 --- a/lib/fcs/common/pages/widgets/display_text.dart +++ b/lib/fcs/common/pages/widgets/display_text.dart @@ -11,6 +11,7 @@ class DisplayText extends StatelessWidget { final int maxLines; final bool withBorder; final Color borderColor; + final Widget icon; const DisplayText({ Key key, @@ -20,6 +21,7 @@ class DisplayText extends StatelessWidget { this.maxLines = 1, this.withBorder = false, this.borderColor, + this.icon, }) : super(key: key); @override Widget build(BuildContext context) { @@ -41,7 +43,7 @@ class DisplayText extends StatelessWidget { child: Row( children: [ iconData == null - ? Container() + ? icon == null ? Container() : icon : Padding( padding: const EdgeInsets.all(8.0), child: Icon( diff --git a/lib/fcs/common/pages/widgets/fcs_id_icon.dart b/lib/fcs/common/pages/widgets/fcs_id_icon.dart new file mode 100644 index 0000000..38a016f --- /dev/null +++ b/lib/fcs/common/pages/widgets/fcs_id_icon.dart @@ -0,0 +1,18 @@ +import 'package:flutter/cupertino.dart'; + +class FcsIDIcon extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + width: 25, + height: 25, + child: FittedBox( + child: Image.asset("assets/logo.jpg"), + fit: BoxFit.fill, + ), + ), + ); + } +} diff --git a/lib/fcs/common/services/common_imp.dart b/lib/fcs/common/services/common_imp.dart new file mode 100644 index 0000000..19a2d47 --- /dev/null +++ b/lib/fcs/common/services/common_imp.dart @@ -0,0 +1,29 @@ +import 'package:fcs/fcs/common/data/providers/common_data_provider.dart'; +import 'package:fcs/fcs/common/data/providers/user_data_provider.dart'; +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; +import 'package:flutter/material.dart'; + +import 'common_service.dart'; + +class CommonServiceImp implements CommonService { + CommonServiceImp({ + @required this.commonDataProvider, + }); + + final CommonDataProvider commonDataProvider; + + @override + Future createPaymentMethod(PaymentMethod paymentMethod) { + return commonDataProvider.createPaymentMethod(paymentMethod); + } + + @override + Future deletePayment(String id) { + return commonDataProvider.deletePaymentMethod(id); + } + + @override + Future updatePaymentMethod(PaymentMethod paymentMethod) { + return commonDataProvider.updatePaymentMethod(paymentMethod); + } +} diff --git a/lib/fcs/common/services/common_service.dart b/lib/fcs/common/services/common_service.dart new file mode 100644 index 0000000..01c8566 --- /dev/null +++ b/lib/fcs/common/services/common_service.dart @@ -0,0 +1,8 @@ +import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; + +abstract class CommonService { + // Payment Service + Future createPaymentMethod(PaymentMethod paymentMethod); + Future updatePaymentMethod(PaymentMethod paymentMethod); + Future deletePayment(String id); +} diff --git a/lib/fcs/common/services/services.dart b/lib/fcs/common/services/services.dart index ed6020e..82c0e4d 100644 --- a/lib/fcs/common/services/services.dart +++ b/lib/fcs/common/services/services.dart @@ -1,7 +1,10 @@ import 'package:fcs/fcs/common/data/providers/auth_fb.dart'; +import 'package:fcs/fcs/common/data/providers/common_data_provider.dart'; import 'package:fcs/fcs/common/data/providers/package_data_provider.dart'; import 'package:fcs/fcs/common/data/providers/user_data_provider.dart'; import 'package:fcs/fcs/common/services/auth_imp.dart'; +import 'package:fcs/fcs/common/services/common_imp.dart'; +import 'package:fcs/fcs/common/services/common_service.dart'; import 'package:fcs/fcs/common/services/messaging_imp.dart'; import 'package:fcs/fcs/common/services/messaging_service.dart'; import 'package:fcs/fcs/common/services/package_imp.dart'; @@ -18,6 +21,7 @@ class Services { UserService _userService; PackageService _packageService; MessagingService _messagingService; + CommonService _commonService; Services._() { _authService = AuthServiceImp( authFb: AuthFb.instance, @@ -28,10 +32,12 @@ class Services { _messagingService = MessagingServiceImp(); _packageService = PackageServiceImp( connectivity: null, packageDataProvider: PackageDataProvider()); + _commonService = CommonServiceImp(commonDataProvider: CommonDataProvider()); } AuthService get authService => _authService; UserService get userService => _userService; MessagingService get messagingService => _messagingService; PackageService get packageService => _packageService; + CommonService get commonService => _commonService; }