add packages

This commit is contained in:
Sai Naw Wun
2020-09-16 02:29:50 +06:30
parent ad527409ec
commit 1ed6f4f00e
30 changed files with 684 additions and 456 deletions

View File

@@ -102,7 +102,8 @@
"package.create.name":"Customer Name", "package.create.name":"Customer Name",
"package.create.phone":"Phone Number", "package.create.phone":"Phone Number",
"package.tracking.id":"Tracking ID", "package.tracking.id":"Tracking ID",
"package.create.packages":"Create Packages", "package.create.packages":"Complete receiving",
"package.create.market":"Market",
"package.edit.title":"PACKAGE", "package.edit.title":"PACKAGE",
"package.arrival.date":"Arrival Date", "package.arrival.date":"Arrival Date",
@@ -111,10 +112,15 @@
"package.weight":"Weight", "package.weight":"Weight",
"package.amount":"Amount", "package.amount":"Amount",
"market.edit.title":"Markets",
"market.edit.name":"Market Name",
"market.remove.confirm":"Remove this market?",
"btn.save": "Save", "btn.save": "Save",
"btn.approve":"Approve", "btn.approve":"Approve",
"btn.delete":"Delete", "btn.delete":"Delete",
"btn.select":"Select",
"btn.cancel":"Cancel",
"================================================================":"", "================================================================":"",

View File

@@ -103,7 +103,8 @@
"package.create.name":"နာမည်", "package.create.name":"နာမည်",
"package.create.phone":"ဖုန်းနံပါတ်", "package.create.phone":"ဖုန်းနံပါတ်",
"package.tracking.id":"Tracking ID", "package.tracking.id":"Tracking ID",
"package.create.packages":"အထုပ် အသစ်များ သိမ်းဆည်းရန်", "package.create.packages":"အထုပ် အသစ်များ လက်ခံမည်",
"package.create.market":"Market",
"package.new":"New Package", "package.new":"New Package",
"package.edit.title":"PACKAGE", "package.edit.title":"PACKAGE",
@@ -113,10 +114,16 @@
"package.weight":"Weight", "package.weight":"Weight",
"package.amount":"Amount", "package.amount":"Amount",
"market.edit.title":"Markets",
"market.edit.name":"Market Name",
"market.remove.confirm":"Remove this market?",
"btn.save":"သိမ်းဆည်းရန်", "btn.save":"သိမ်းဆည်းရန်",
"btn.approve":"အတည်ပြုရန်", "btn.approve":"အတည်ပြုရန်",
"btn.delete":"ဖျက်ရန်", "btn.delete":"ဖျက်ရန်",
"btn.select":"ရွေးချယ်ပါ",
"btn.cancel":"Cancel",
"================================================================":"", "================================================================":"",

View File

@@ -6,6 +6,7 @@ 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/customers/model/customer_model.dart';
import 'package:fcs/fcs/common/pages/faq/model/faq_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/initial_language_selection.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/language_model.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart' as fcs; 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/package_model.dart';
@@ -93,6 +94,7 @@ class _AppState extends State<App> {
final StaffModel staffModel = new StaffModel(); final StaffModel staffModel = new StaffModel();
final ShipmentModel shipmentModel = new ShipmentModel(); final ShipmentModel shipmentModel = new ShipmentModel();
final PackageModel packageModel = new PackageModel(); final PackageModel packageModel = new PackageModel();
final MarketModel marketModel = new MarketModel();
AppTranslationsDelegate _newLocaleDelegate; AppTranslationsDelegate _newLocaleDelegate;
static FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = static FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
@@ -105,7 +107,8 @@ class _AppState extends State<App> {
..addModel(customerModel) ..addModel(customerModel)
..addModel(staffModel) ..addModel(staffModel)
..addModel(shipmentModel) ..addModel(shipmentModel)
..addModel(packageModel); ..addModel(packageModel)
..addModel(marketModel);
mainModel2.init(); mainModel2.init();
_newLocaleDelegate = AppTranslationsDelegate(newLocale: null); _newLocaleDelegate = AppTranslationsDelegate(newLocale: null);
@@ -256,6 +259,7 @@ class _AppState extends State<App> {
ChangeNotifierProvider.value(value: contactModel), ChangeNotifierProvider.value(value: contactModel),
ChangeNotifierProvider.value(value: termModel), ChangeNotifierProvider.value(value: termModel),
ChangeNotifierProvider.value(value: faqModel), ChangeNotifierProvider.value(value: faqModel),
ChangeNotifierProvider.value(value: marketModel),
], ],
child: Consumer<LanguageModel>( child: Consumer<LanguageModel>(
builder: (context, value, child) { builder: (context, value, child) {

View File

@@ -5,7 +5,6 @@ import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/auth_result.dart' as fcs; import 'package:fcs/fcs/common/domain/entities/auth_result.dart' as fcs;
import 'package:fcs/fcs/common/domain/entities/auth_status.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/setting.dart';
import 'package:fcs/fcs/common/domain/entities/setting.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart';
import 'package:fcs/fcs/common/domain/exceiptions/signin_exception.dart'; import 'package:fcs/fcs/common/domain/exceiptions/signin_exception.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
@@ -61,6 +60,7 @@ class AuthFb {
_verificationId = verificationId; _verificationId = verificationId;
print("codeSent " + phoneNumber); print("codeSent " + phoneNumber);
codeSentCompleted = true; codeSentCompleted = true;
completer.complete(fcs.AuthResult(authStatus: AuthStatus.SMS_SENT));
}; };
final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
@@ -136,8 +136,10 @@ class AuthFb {
user.privileges = privileges.split(":").toList(); user.privileges = privileges.split(":").toList();
} }
User _user = await getUserFromFirestore(user.id); User _user = await getUserFromFirestore(user.id);
user.fcsID = _user.fcsID; if (_user != null) {
user.name = _user.name; user.fcsID = _user.fcsID;
user.name = _user.name;
}
return user; return user;
} }

View File

@@ -1,5 +1,4 @@
import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart';
import 'package:fcs/fcs/common/helpers/api_helper.dart'; import 'package:fcs/fcs/common/helpers/api_helper.dart';
import 'package:fcs/fcs/common/helpers/firebase_helper.dart'; import 'package:fcs/fcs/common/helpers/firebase_helper.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@@ -7,10 +6,9 @@ import 'package:logging/logging.dart';
class PackageDataProvider { class PackageDataProvider {
final log = Logger('PackageDataProvider'); final log = Logger('PackageDataProvider');
Future<void> createPackages(User user, List<Package> packages) async { Future<void> createPackages(List<Package> packages, String fcsID) async {
List<String> strs = packages.map((e) => e.trackingID).toList(); List<Map<String, dynamic>> json = packages.map((e) => e.toJson()).toList();
return await requestAPI("/packages", "POST", return await requestAPI("/packages", "POST",
payload: {"fcs_id": user.fcsID, "tracking_ids": strs}, payload: {"packages": json, "fcs_id": fcsID}, token: await getToken());
token: await getToken());
} }
} }

View File

@@ -3,6 +3,8 @@ const user_collection = "users";
const invitations_collection = "invitations"; const invitations_collection = "invitations";
const setting_doc_id = "setting"; const setting_doc_id = "setting";
const privilege_collection = "privileges"; const privilege_collection = "privileges";
const markets_collection = "markets";
const packages_collection = "packages";
const ok_doc_id = "ok"; const ok_doc_id = "ok";

View File

@@ -0,0 +1,28 @@
class Market {
String id;
String name;
Market({
this.id,
this.name,
});
Map<String, dynamic> toMap() {
return {
'id': id,
'name': name,
};
}
factory Market.fromMap(Map<String, dynamic> map, String id) {
return Market(
id: id,
name: map['name'],
);
}
@override
String toString() {
return 'Market{id: $id, name: $name}';
}
}

View File

@@ -1,13 +1,19 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fcs/fcs/common/domain/vo/shipment_status.dart'; import 'package:fcs/fcs/common/domain/vo/shipment_status.dart';
class Package { class Package {
String id; String id;
String trackingID; String trackingID;
String userID; String userID;
String fcsID;
String userName; String userName;
String phoneNumber; String phoneNumber;
String status; String currentStatus;
DateTime currentStatusDate;
List<Map<String, dynamic>> allStatus;
List<String> photoUrls;
String status;
String shipmentNumber; String shipmentNumber;
String senderFCSID; String senderFCSID;
String senderName; String senderName;
@@ -39,6 +45,9 @@ class Package {
this.id, this.id,
this.trackingID, this.trackingID,
this.userID, this.userID,
this.userName,
this.fcsID,
this.phoneNumber,
this.shipmentNumber, this.shipmentNumber,
this.senderFCSID, this.senderFCSID,
this.senderName, this.senderName,
@@ -57,5 +66,36 @@ class Package {
this.cargoDesc, this.cargoDesc,
this.market, this.market,
this.shipmentHistory, this.shipmentHistory,
this.allStatus,
this.currentStatus,
this.currentStatusDate,
this.photoUrls,
}); });
factory Package.fromMap(Map<String, dynamic> map, String docID) {
var _currentStatusDate = (map['current_status_date'] as Timestamp);
List<Map<String, dynamic>> _allStatus = List.from(map['all_status'])
.map((e) => Map<String, dynamic>.from(e))
.toList();
List<String> _photoUrls =
map['photo_urls'] == null ? [] : map['photo_urls'].cast<List<String>>();
return Package(
id: docID,
userID: map['user_id'],
fcsID: map['fcs_id'],
trackingID: map['tracking_id'],
market: map['market'],
userName: map['user_name'],
phoneNumber: map['phone_number'],
currentStatus: map['current_status'],
currentStatusDate:
_currentStatusDate != null ? _currentStatusDate.toDate() : null,
photoUrls: _photoUrls,
allStatus: _allStatus);
}
Map<String, dynamic> toJson() =>
{'id': id, 'tracking_id': trackingID, 'market': market, 'fcs_id': fcsID};
} }

View File

@@ -116,6 +116,7 @@ class Setting {
factory Setting.fromMap(Map<String, dynamic> map) { factory Setting.fromMap(Map<String, dynamic> map) {
var ts = (map['price_last_update'] as Timestamp); var ts = (map['price_last_update'] as Timestamp);
var list = (map['bank_accounts'] as List); var list = (map['bank_accounts'] as List);
List<BankAccount> bankAccounts = []; List<BankAccount> bankAccounts = [];
if (list != null) { if (list != null) {
list.asMap().forEach((index, item) { list.asMap().forEach((index, item) {

View File

@@ -23,7 +23,10 @@ class CustomerModel extends BaseModel {
@override @override
logout() async { logout() async {
if (customerListener != null) customerListener.cancel();
if (invitationListener != null) invitationListener.cancel();
customers = []; customers = [];
invitations = [];
} }
Future<void> inviteUser(String userName, String phoneNumber) { Future<void> inviteUser(String userName, String phoneNumber) {

View File

@@ -73,9 +73,11 @@ class _HomePageState extends State<HomePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
User user = Provider.of<MainModel>(context).user; User user = Provider.of<MainModel>(context).user;
if (user == null) {
return Container();
}
login = Provider.of<MainModel>(context).isLogin(); login = Provider.of<MainModel>(context).isLogin();
// var owner =true;// Provider.of<MainModel>(context).isOwner();
var customer = Provider.of<MainModel>(context).isCustomer();
LanguageModel languageModel = Provider.of<LanguageModel>(context); LanguageModel languageModel = Provider.of<LanguageModel>(context);
final faqBtn = _buildBtn("faq.btn", final faqBtn = _buildBtn("faq.btn",

View File

@@ -0,0 +1,192 @@
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';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
typedef void FindCallBack();
class MarketEditor extends StatefulWidget {
const MarketEditor();
@override
_MarketEditorState createState() => _MarketEditorState();
}
class _MarketEditorState extends State<MarketEditor> {
TextEditingController _marketNameCtl = new TextEditingController();
bool _isLoading = false;
List<String> markets = [];
@override
void initState() {
super.initState();
}
List<Widget> showMarkets(BuildContext context, List<Market> markets) {
return markets.map((p) {
return new ListTile(
title: new Row(
children: <Widget>[
Expanded(
child: new Text(
p.name,
style: TextStyle(
fontSize: 15.0,
),
),
),
Spacer(),
IconButton(
icon: Icon(Icons.remove, color: primaryColor),
onPressed: () => _remove(p),
)
],
));
}).toList();
}
@override
Widget build(BuildContext context) {
List<Market> markets = Provider.of<MarketModel>(context).markets;
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,
"market.edit.title",
fontSize: 20,
color: primaryColor,
),
),
body: Padding(
padding: const EdgeInsets.only(left: 12.0, right: 12),
child: ListView(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.only(right: 18.0),
child: IconButton(
icon: Icon(Icons.add, color: primaryColor),
onPressed: () => _showDialog(context),
),
),
],
),
Column(
children: showMarkets(context, markets),
),
SizedBox(
height: 10,
)
],
),
),
));
}
_remove(Market market) {
if (market == null) {
showMsgDialog(context, "Esrror", "Invalid market!");
return;
}
showConfirmDialog(
context, "market.remove.confirm", () => _removeMarket(market));
}
_removeMarket(Market market) async {
setState(() {
_isLoading = true;
});
MarketModel marketModel = Provider.of<MarketModel>(context, listen: false);
try {
await marketModel.deleteMarket(market.id);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
_add() async {
if (_marketNameCtl.text == "") {
showMsgDialog(context, "Esrror", "Invalid market name!");
return;
}
setState(() {
_isLoading = true;
});
MarketModel marketModel = Provider.of<MarketModel>(context, listen: false);
try {
await marketModel.addMarket(_marketNameCtl.text);
_marketNameCtl.text = "";
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
_showDialog(BuildContext context) async {
await showDialog<String>(
context: context,
child: new AlertDialog(
contentPadding: const EdgeInsets.all(16.0),
content: new Row(
children: <Widget>[
new Expanded(
child: InputText(
labelTextKey: "market.edit.name",
controller: _marketNameCtl,
autoFocus: true,
),
)
],
),
actions: <Widget>[
new FlatButton(
child: LocalText(context, "btn.cancel", color: primaryColor),
onPressed: () {
Navigator.pop(context);
}),
new FlatButton(
child: LocalText(
context,
"btn.save",
color: primaryColor,
),
onPressed: () {
Navigator.pop(context);
_add();
})
],
),
);
}
}

View File

@@ -0,0 +1,57 @@
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/market.dart';
import 'package:fcs/fcs/common/helpers/firebase_helper.dart';
import 'package:fcs/fcs/common/pages/model/base_model.dart';
import 'package:logging/logging.dart';
class MarketModel extends BaseModel {
final log = Logger('MarketModel');
StreamSubscription<QuerySnapshot> listener;
List<Market> markets = [];
void initUser(user) async {
super.initUser(user);
_loadMarkets();
}
@override
logout() async {
markets = [];
}
Future<void> _loadMarkets() async {
if (user == null || !user.hasStaffs()) return;
try {
if (listener != null) listener.cancel();
listener = Firestore.instance
.collection("/$config_collection/$setting_doc_id/$markets_collection")
.snapshots()
.listen((QuerySnapshot snapshot) {
markets.clear();
markets = snapshot.documents.map((documentSnapshot) {
var user = Market.fromMap(
documentSnapshot.data, documentSnapshot.documentID);
return user;
}).toList();
notifyListeners();
});
} catch (e) {
log.warning("Error!! $e");
}
}
Future<void> addMarket(String marketName) async {
await request("/markets", "POST",
payload: {"name": marketName}, token: await getToken());
}
Future<void> deleteMarket(String id) async {
await request("/markets", "DELETE",
payload: {"id": id}, token: await getToken());
}
}

View File

@@ -1,69 +0,0 @@
import 'package:barcode_scan/barcode_scan.dart';
import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/vo/buyer.dart';
import 'package:fcs/widget/progress.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
class BarcodeScreenPage extends StatefulWidget {
final BuyerProduct buyerProduct;
const BarcodeScreenPage({Key key, this.buyerProduct}) : super(key: key);
@override
_BarcodeScreenPageState createState() => _BarcodeScreenPageState();
}
class _BarcodeScreenPageState extends State<BarcodeScreenPage> {
final _formKey = GlobalKey<FormState>();
bool _isLoading = false;
String scanResult;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return LocalProgress(
inAsyncCall: _isLoading,
child: Scaffold(
appBar: AppBar(
backgroundColor: primaryColor,
title: Text("Bar Code Scranner"),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
InkWell(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"Scan : ",
style: TextStyle(
color: primaryColor,
fontWeight: FontWeight.bold,
fontSize: 20),
),
Icon(
Ionicons.ios_qr_scanner,
size: 50,
),
],
),
onTap: () async {
await scan();
},
)
],
)),
);
}
Future scan() async {
var result = await BarcodeScanner.scan();
print("ScanResult => $result");
setState(() => scanResult = result);
}
}

View File

@@ -1,9 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart';
import 'package:fcs/fcs/common/domain/vo/shipment_status.dart';
import 'package:fcs/fcs/common/pages/model/base_model.dart'; import 'package:fcs/fcs/common/pages/model/base_model.dart';
import 'package:fcs/fcs/common/services/services.dart'; import 'package:fcs/fcs/common/services/services.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
@@ -12,174 +12,11 @@ class PackageModel extends BaseModel {
final log = Logger('PackageModel'); final log = Logger('PackageModel');
StreamSubscription<QuerySnapshot> listener; StreamSubscription<QuerySnapshot> listener;
static List<ShipmentStatus> statusHistory = [ List<Package> packages = [];
ShipmentStatus(status: "Received", date: DateTime(2020, 6, 1), done: true),
ShipmentStatus(status: "Processed", date: DateTime(2020, 6, 1), done: true),
ShipmentStatus(status: "Shipped", date: DateTime(2020, 6, 5), done: false),
ShipmentStatus(status: "Arrived", date: DateTime(2020, 6, 7), done: false),
ShipmentStatus(
status: "Delivered", date: DateTime(2020, 6, 15), done: false)
];
static List<Package> packages = [
Package(
shipmentNumber: "A202",
receiverNumber: "3",
receiverName: "Ko Myo Min",
boxNumber: "1",
rate: 7,
packageType: "General",
weight: 25,
status: "Received",
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
cargoDesc: "Computers",
arrivedDate: DateTime(2020, 6, 1),
market: "Amazon",
id: "PKG2039",
trackingID: "23-234s-asdfl",
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A202",
receiverNumber: "3",
receiverName: "Ko Myo Min",
boxNumber: "2",
rate: 7,
packageType: "General",
weight: 20,
status: "Received",
cargoDesc: "Clothes",
arrivedDate: DateTime(2020, 6, 1),
market: "Macy",
trackingID: "asd-sdf-23498",
id: "PKG2040",
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A202",
receiverNumber: "3",
receiverName: "Ko Myo Min",
boxNumber: "3",
rate: 7,
packageType: "General",
weight: 15,
cargoDesc: "Shoes",
status: "Processed",
market: "Macy",
trackingID: "8923-234-sd",
id: "PKG2041",
arrivedDate: DateTime(2020, 6, 1),
receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon',
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A202",
receiverNumber: "2",
receiverName: "Ma Aye",
boxNumber: "1",
rate: 8,
packageType: "Medicine",
weight: 15,
status: "Processed",
market: "Macy",
trackingID: "lsdf-sd09sdf",
cargoDesc: "Dietary supplement",
id: "PKG2042",
arrivedDate: DateTime(2020, 6, 1),
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon',
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A202",
receiverNumber: "2",
receiverName: "Ma Aye",
boxNumber: "2",
rate: 7,
packageType: "General",
cargoDesc: "Handbags",
weight: 55,
market: "Macy",
trackingID: "234-sdflsdf-213",
status: "Shipped",
id: "PKG2043",
arrivedDate: DateTime(2020, 6, 1),
receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon',
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A201",
receiverNumber: "1",
receiverName: "Ko Wai",
boxNumber: "1",
rate: 9,
packageType: "Dangerous",
cargoDesc: "Phones and Scooters",
weight: 25,
status: "Arrived",
market: "Amazon",
trackingID: "sdf-asdf-23489",
id: "PKG2044",
arrivedDate: DateTime(2020, 5, 21),
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon',
shipmentHistory: statusHistory),
Package(
shipmentNumber: "A201",
receiverNumber: "1",
receiverName: "Ko Wai",
boxNumber: "2",
rate: 7,
packageType: "General",
cargoDesc: "Construction tools",
weight: 5,
status: "Processed",
market: "Amazon",
id: "PKG2045",
trackingID: "oiuw-sdfpo-234",
arrivedDate: DateTime(2020, 5, 21),
receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon',
shipmentHistory: statusHistory),
];
List<Package> get getPackages {
return packages
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
List<Package> get completed {
return packages.where((e) => e.status == "Processed").toList()
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
List<Package> get shipped {
return packages.where((e) => e.status == "Shipped").toList()
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
List<Package> get arrived {
return packages.where((e) => e.status == "Arrived").toList()
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
List<Package> get delivered {
return packages.where((e) => e.status == "Delivered").toList()
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
List<Package> get upcoming {
return packages.where((e) => e.status == "Received").toList()
..sort((e1, e2) {
return e2.packageNumber.compareTo(e1.packageNumber);
});
}
void initUser(user) { void initUser(user) {
super.initUser(user); super.initUser(user);
_loadPackages();
} }
@override @override
@@ -188,9 +25,39 @@ class PackageModel extends BaseModel {
packages = []; packages = [];
} }
Future<void> _loadPackages() async {
if (user == null) return;
String path = "";
if (user.isCustomer()) {
path = "/$user_collection/${user.id}/$packages_collection";
} else {
path = "/$packages_collection";
}
try {
listener = Firestore.instance
.collection("$path")
.where("is_delivered", isEqualTo: false)
.snapshots()
.listen((QuerySnapshot snapshot) {
packages.clear();
packages = snapshot.documents.map((documentSnapshot) {
var package = Package.fromMap(
documentSnapshot.data, documentSnapshot.documentID);
return package;
}).toList();
notifyListeners();
});
} catch (e) {
log.warning("Error!! $e");
}
}
Future<List<User>> searchUser(String term) { Future<List<User>> searchUser(String term) {
return Services.instance.userService.searchUser(term); return Services.instance.userService.searchUser(term);
} }
createPackages(User user, List<Package> packages) {} Future<void> createPackages(User user, List<Package> packages) {
return Services.instance.packageService
.createPackages(packages, user.fcsID);
}
} }

View File

@@ -3,7 +3,7 @@ import 'package:fcs/fcs/common/domain/vo/shipping_address.dart';
import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/fcs/common/localization/app_translations.dart'; import 'package:fcs/fcs/common/localization/app_translations.dart';
import 'package:fcs/fcs/common/pages/model/main_model.dart'; import 'package:fcs/fcs/common/pages/model/main_model.dart';
import 'package:fcs/fcs/common/pages/package/barcode_screen_page.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_editor.dart';
import 'package:fcs/fcs/common/pages/package/shipping_address_list.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/package/shipping_address_row.dart';
@@ -12,6 +12,7 @@ import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart';
import 'package:fcs/fcs/common/pages/widgets/fcs_expansion_tile.dart'; import 'package:fcs/fcs/common/pages/widgets/fcs_expansion_tile.dart';
import 'package:fcs/fcs/common/pages/widgets/my_data_table.dart'; import 'package:fcs/fcs/common/pages/widgets/my_data_table.dart';
import 'package:fcs/fcs/common/pages/widgets/progress.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/material.dart';
import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_icons/flutter_icons.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';

View File

@@ -84,10 +84,10 @@ class _PackageListState extends State<PackageList> {
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15), padding: EdgeInsets.only(top: 15),
shrinkWrap: true, shrinkWrap: true,
itemCount: packageModel.getPackages.length, itemCount: packageModel.packages.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return PackageListRow( return PackageListRow(
package: packageModel.getPackages[index], package: packageModel.packages[index],
isReadOnly: false, isReadOnly: false,
); );
})), })),
@@ -100,124 +100,4 @@ class _PackageListState extends State<PackageList> {
BottomUpPageRoute(PackageNew()), BottomUpPageRoute(PackageNew()),
); );
} }
Widget _upComing() {
var packageModel = Provider.of<PackageModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: packageModel.upcoming.length,
itemBuilder: (BuildContext context, int index) {
return PackageListRow(
package: packageModel.upcoming[index],
isReadOnly: false,
);
}),
),
],
);
}
Widget _completed() {
var packageModel = Provider.of<PackageModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: packageModel.completed.length,
itemBuilder: (BuildContext context, int index) {
return PackageListRow(
package: packageModel.completed[index],
isReadOnly: false,
);
}),
),
],
);
}
Widget _shipped() {
var packageModel = Provider.of<PackageModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: packageModel.shipped.length,
itemBuilder: (BuildContext context, int index) {
return PackageListRow(
package: packageModel.shipped[index],
isReadOnly: false,
);
}),
),
],
);
}
Widget _arrived() {
var packageModel = Provider.of<PackageModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: packageModel.arrived.length,
itemBuilder: (BuildContext context, int index) {
return PackageListRow(
package: packageModel.arrived[index],
isReadOnly: false,
);
}),
),
],
);
}
Widget _delivered() {
var packageModel = Provider.of<PackageModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: packageModel.delivered.length,
itemBuilder: (BuildContext context, int index) {
return PackageListRow(
package: packageModel.delivered[index],
isReadOnly: false,
);
}),
),
],
);
}
} }

View File

@@ -92,12 +92,12 @@ class _PackageListRowtate extends State<PackageListRow> {
children: <Widget>[ children: <Widget>[
Padding( Padding(
padding: const EdgeInsets.all(3.0), padding: const EdgeInsets.all(3.0),
child: getStatus(_package.status), child: getStatus(_package.currentStatus),
), ),
Padding( Padding(
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
child: new Text( child: new Text(
dateFormat.format(_package.arrivedDate), dateFormat.format(_package.currentStatusDate),
style: new TextStyle(fontSize: 15.0, color: Colors.grey), style: new TextStyle(fontSize: 15.0, color: Colors.grey),
), ),
), ),

View File

@@ -1,18 +1,19 @@
import 'package:barcode_scan/barcode_scan.dart';
import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart';
import 'package:fcs/fcs/common/domain/entities/user.dart'; import 'package:fcs/fcs/common/domain/entities/user.dart';
import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/fcs/common/pages/package/tracking_id_page.dart';
import 'package:fcs/fcs/common/pages/package/user_serach.dart'; import 'package:fcs/fcs/common/pages/package/user_serach.dart';
import 'package:fcs/fcs/common/pages/staff/model/staff_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/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/display_text.dart';
import 'package:fcs/fcs/common/pages/widgets/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart';
import 'package:fcs/fcs/common/pages/widgets/progress.dart'; import 'package:fcs/fcs/common/pages/widgets/progress.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'model/package_model.dart';
typedef void FindCallBack(); typedef void FindCallBack();
class PackageNew extends StatefulWidget { class PackageNew extends StatefulWidget {
@@ -22,8 +23,6 @@ class PackageNew extends StatefulWidget {
} }
class _PackageNewState extends State<PackageNew> { class _PackageNewState extends State<PackageNew> {
TextEditingController _phoneInput = new TextEditingController();
bool _isLoading = false; bool _isLoading = false;
User user; User user;
@@ -114,7 +113,7 @@ class _PackageNewState extends State<PackageNew> {
Icons.add, Icons.add,
color: primaryColor, color: primaryColor,
), ),
onPressed: _scan, onPressed: _addPackage,
) )
], ],
)), )),
@@ -133,71 +132,58 @@ class _PackageNewState extends State<PackageNew> {
)); ));
} }
void _scan() async { Widget _packageItem(BuildContext context, int index) {
PermissionStatus permission = return Padding(
await PermissionHandler().checkPermissionStatus(PermissionGroup.camera); padding: const EdgeInsets.only(bottom: 8.0, left: 15),
if (permission != PermissionStatus.granted) { child: Row(
Map<PermissionGroup, PermissionStatus> permissions = crossAxisAlignment: CrossAxisAlignment.start,
await PermissionHandler() children: [
.requestPermissions([PermissionGroup.camera]); Expanded(
if (permissions[PermissionGroup.camera] != PermissionStatus.granted) { child: Column(
showMsgDialog(context, "Error", "Camera permission is not granted"); crossAxisAlignment: CrossAxisAlignment.start,
return null; children: [
} Text(packages[index].market),
} Text(packages[index].trackingID),
// DisplayText(
// labelText: "Tracking ID",
// text: packages[index].trackingID,
// ),
],
),
),
IconButton(
icon: Icon(
Icons.remove,
color: primaryColor,
),
onPressed: () {
setState(() {
packages.removeAt(index);
});
},
)
],
),
);
}
String barcode; _addPackage() async {
try { Package package = await Navigator.push<Package>(
barcode = await BarcodeScanner.scan(); context,
} on PlatformException catch (e) { BottomUpPageRoute(TrackingIDPage()),
if (e.code == BarcodeScanner.CameraAccessDenied) { );
print('The user did not grant the camera permission!');
} else {
print('Unknown error: $e');
}
} on FormatException {
print(
'null (User returned using the "back"-button before scanning anything. Result)');
} catch (e) {
print('Unknown error: $e');
}
if (barcode != null) { if (package != null) {
if (packages.any((e) => e.trackingID == barcode)) { if (packages.any((e) => e.trackingID == package.trackingID)) {
showMsgDialog(context, "Error", "Already scanned!"); showMsgDialog(context, "Error", "Already scanned!");
return; return;
} }
setState(() { setState(() {
packages.add(Package(trackingID: barcode)); packages.add(package);
}); });
} }
} }
Widget _packageItem(BuildContext context, int index) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: DisplayText(
labelText: "Tracking ID",
text: packages[index].trackingID,
),
),
IconButton(
icon: Icon(
Icons.remove,
color: primaryColor,
),
onPressed: () {
setState(() {
packages.removeAt(index);
});
},
)
],
);
}
_create() async { _create() async {
if (user == null || packages == null || packages.length == 0) { if (user == null || packages == null || packages.length == 0) {
showMsgDialog(context, "Error", "Invalid user!"); showMsgDialog(context, "Error", "Invalid user!");
@@ -206,9 +192,10 @@ class _PackageNewState extends State<PackageNew> {
setState(() { setState(() {
_isLoading = true; _isLoading = true;
}); });
StaffModel staffModel = Provider.of<StaffModel>(context, listen: false); PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
try { try {
// await staffModel.updatePrivileges(this.selectedUser.id, privilegesIDs()); await packageModel.createPackages(user, packages);
Navigator.pop(context); Navigator.pop(context);
} catch (e) { } catch (e) {
showMsgDialog(context, "Error", e.toString()); showMsgDialog(context, "Error", e.toString());

View File

@@ -0,0 +1,175 @@
import 'package:barcode_scan/barcode_scan.dart';
import 'package:fcs/fcs/common/domain/entities/market.dart';
import 'package:fcs/fcs/common/domain/entities/package.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';
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/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:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
const MANAGE_MARKET = "Manage Market";
class TrackingIDPage extends StatefulWidget {
const TrackingIDPage({Key key}) : super(key: key);
@override
_TrackingIDPageState createState() => _TrackingIDPageState();
}
class _TrackingIDPageState extends State<TrackingIDPage> {
TextEditingController _transcationIDCtl = new TextEditingController();
bool _isLoading = false;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
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,
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(18.0),
child: ListView(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Expanded(
child: InputText(
labelTextKey: "package.tracking.id",
controller: _transcationIDCtl,
)),
IconButton(
icon: Icon(MaterialCommunityIcons.barcode_scan,
size: 30, color: primaryColor),
onPressed: _scan,
),
],
),
SizedBox(
height: 30,
),
dropDown(),
SizedBox(
height: 30,
),
fcsButton(context, getLocalString(context, "btn.select"),
callack: _select)
],
),
),
)),
);
}
String selectedMarket;
Widget dropDown() {
List<Market> _markets = Provider.of<MarketModel>(context).markets;
List<String> 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: 20,
),
),
Container(
width: 150,
child: DropdownButton<String>(
value: selectedMarket,
style: TextStyle(color: Colors.black, fontSize: 14),
underline: Container(
height: 1,
color: Colors.grey,
),
onChanged: (String newValue) {
setState(() {
if (newValue == MANAGE_MARKET) {
selectedMarket = null;
_manageMarket();
return;
}
selectedMarket = newValue;
});
},
isExpanded: true,
items: markets.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: value == MANAGE_MARKET
? secondaryColor
: primaryColor)),
);
}).toList(),
),
),
],
);
}
_manageMarket() {
Navigator.push<Package>(
context,
BottomUpPageRoute(MarketEditor()),
);
}
_scan() async {
PermissionStatus permission =
await PermissionHandler().checkPermissionStatus(PermissionGroup.camera);
if (permission != PermissionStatus.granted) {
Map<PermissionGroup, PermissionStatus> permissions =
await PermissionHandler()
.requestPermissions([PermissionGroup.camera]);
if (permissions[PermissionGroup.camera] != PermissionStatus.granted) {
showMsgDialog(context, "Error", "Camera permission is not granted");
return null;
}
}
try {
String barcode = await BarcodeScanner.scan();
if (barcode != null) {
setState(() {
_transcationIDCtl.text = barcode;
});
}
} catch (e) {
print('error: $e');
}
}
_select() {
if (_transcationIDCtl.text == "" && selectedMarket == null) return;
Navigator.pop(context,
Package(trackingID: _transcationIDCtl.text, market: selectedMarket));
}
}

View File

@@ -20,7 +20,7 @@ class UserSearchDelegate extends SearchDelegate<User> {
UserSearchDelegate({this.callbackUserSelect}); UserSearchDelegate({this.callbackUserSelect});
@override @override
String get searchFieldLabel => 'Enter FCS ID or Name'; String get searchFieldLabel => 'Search by FCS ID or Name';
@override @override
ThemeData appBarTheme(BuildContext context) { ThemeData appBarTheme(BuildContext context) {

View File

@@ -54,7 +54,9 @@ class _ProfileState extends State<Profile> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
MainModel mainModel = Provider.of<MainModel>(context); MainModel mainModel = Provider.of<MainModel>(context);
if (mainModel.user == null) {
return Container();
}
final namebox = DisplayText( final namebox = DisplayText(
text: mainModel.user.name, text: mainModel.user.name,
labelText: getLocalString(context, "profile.name"), labelText: getLocalString(context, "profile.name"),

View File

@@ -1,3 +1,5 @@
import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:fcs/fcs/common/domain/constants.dart'; import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/role.dart'; import 'package:fcs/fcs/common/domain/entities/role.dart';
@@ -9,6 +11,7 @@ import 'package:logging/logging.dart';
class StaffModel extends BaseModel { class StaffModel extends BaseModel {
final log = Logger('StaffModel'); final log = Logger('StaffModel');
StreamSubscription<QuerySnapshot> listener;
List<User> employees = []; List<User> employees = [];
List<Privilege> privileges = []; List<Privilege> privileges = [];
@@ -21,6 +24,7 @@ class StaffModel extends BaseModel {
@override @override
logout() async { logout() async {
if (listener != null) listener.cancel();
employees = []; employees = [];
} }
@@ -28,7 +32,9 @@ class StaffModel extends BaseModel {
if (user == null || !user.hasStaffs()) return; if (user == null || !user.hasStaffs()) return;
try { try {
Firestore.instance if (listener != null) listener.cancel();
listener = Firestore.instance
.collection("/$user_collection") .collection("/$user_collection")
.where("is_employee", isEqualTo: true) .where("is_employee", isEqualTo: true)
.where("is_sys_admin", isEqualTo: false) .where("is_sys_admin", isEqualTo: false)
@@ -41,8 +47,6 @@ class StaffModel extends BaseModel {
return user; return user;
}).toList(); }).toList();
notifyListeners(); notifyListeners();
}).onError((e) {
log.warning("Error! $e");
}); });
} catch (e) { } catch (e) {
log.warning("Error!! $e"); log.warning("Error!! $e");

View File

@@ -1,6 +1,6 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
class BottomUpPageRoute extends PageRouteBuilder { class BottomUpPageRoute<T> extends PageRouteBuilder<T> {
final Widget child; final Widget child;
BottomUpPageRoute(this.child) BottomUpPageRoute(this.child)

View File

@@ -40,13 +40,15 @@ class DisplayText extends StatelessWidget {
padding: const EdgeInsets.only(top: 8.0, bottom: 8), padding: const EdgeInsets.only(top: 8.0, bottom: 8),
child: Row( child: Row(
children: [ children: [
Padding( iconData == null
padding: const EdgeInsets.all(8.0), ? Container()
child: Icon( : Padding(
iconData, padding: const EdgeInsets.all(8.0),
color: primaryColor, child: Icon(
), iconData,
), color: primaryColor,
),
),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

View File

@@ -14,6 +14,7 @@ class InputText extends StatelessWidget {
final bool withBorder; final bool withBorder;
final Color borderColor; final Color borderColor;
final TextInputType textInputType; final TextInputType textInputType;
final bool autoFocus;
const InputText( const InputText(
{Key key, {Key key,
@@ -24,6 +25,7 @@ class InputText extends StatelessWidget {
this.maxLines = 1, this.maxLines = 1,
this.withBorder = false, this.withBorder = false,
this.borderColor, this.borderColor,
this.autoFocus = false,
this.textInputType}) this.textInputType})
: super(key: key); : super(key: key);
@override @override
@@ -34,7 +36,7 @@ class InputText extends StatelessWidget {
padding: const EdgeInsets.only(top: 15.0, bottom: 5), padding: const EdgeInsets.only(top: 15.0, bottom: 5),
child: TextFormField( child: TextFormField(
controller: controller, controller: controller,
autofocus: false, autofocus: autoFocus,
cursorColor: primaryColor, cursorColor: primaryColor,
style: textStyle, style: textStyle,
maxLines: maxLines, maxLines: maxLines,

View File

@@ -15,7 +15,7 @@ class LocalText extends Text {
: super( : super(
AppTranslations.of(context).text(translationKey, AppTranslations.of(context).text(translationKey,
translationVariables: translationVariables), translationVariables: translationVariables),
style: Provider.of<LanguageModel>(context).isEng style: Provider.of<LanguageModel>(context, listen: false).isEng
? newLabelStyle( ? newLabelStyle(
color: color, color: color,
fontSize: fontSize, fontSize: fontSize,
@@ -45,12 +45,15 @@ class LocalLargeTitle extends Text {
class TextLocalStyle extends Text { class TextLocalStyle extends Text {
final BuildContext context; final BuildContext context;
TextLocalStyle(this.context, String text, {Color color, double fontSize,FontWeight fontWeight}) TextLocalStyle(this.context, String text,
{Color color, double fontSize, FontWeight fontWeight})
: super(text, : super(text,
style: Provider.of<LanguageModel>(context).isEng style: Provider.of<LanguageModel>(context).isEng
? TextStyle(color: color, fontSize: fontSize,fontWeight: fontWeight) ? TextStyle(
color: color, fontSize: fontSize, fontWeight: fontWeight)
: TextStyle( : TextStyle(
color: color, color: color,
fontFamily: "MyanmarUnicode", fontFamily: "MyanmarUnicode",
fontSize: fontSize,fontWeight: fontWeight)); fontSize: fontSize,
fontWeight: fontWeight));
} }

View File

@@ -0,0 +1,20 @@
import 'package:fcs/fcs/common/data/providers/package_data_provider.dart';
import 'package:fcs/fcs/common/domain/entities/connectivity.dart';
import 'package:fcs/fcs/common/domain/entities/package.dart';
import 'package:fcs/fcs/common/services/package_service.dart';
import 'package:flutter/material.dart';
class PackageServiceImp implements PackageService {
PackageServiceImp({
@required this.connectivity,
@required this.packageDataProvider,
});
final Connectivity connectivity;
final PackageDataProvider packageDataProvider;
@override
Future<void> createPackages(List<Package> packages, String fcsID) {
return packageDataProvider.createPackages(packages, fcsID);
}
}

View File

@@ -0,0 +1,5 @@
import 'package:fcs/fcs/common/domain/entities/package.dart';
abstract class PackageService {
Future<void> createPackages(List<Package> packages, String fcsID);
}

View File

@@ -1,8 +1,11 @@
import 'package:fcs/fcs/common/data/providers/auth_fb.dart'; import 'package:fcs/fcs/common/data/providers/auth_fb.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/data/providers/user_data_provider.dart';
import 'package:fcs/fcs/common/services/auth_imp.dart'; import 'package:fcs/fcs/common/services/auth_imp.dart';
import 'package:fcs/fcs/common/services/messaging_imp.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/messaging_service.dart';
import 'package:fcs/fcs/common/services/package_imp.dart';
import 'package:fcs/fcs/common/services/package_service.dart';
import 'package:fcs/fcs/common/services/user_imp.dart'; import 'package:fcs/fcs/common/services/user_imp.dart';
import 'package:fcs/fcs/common/services/user_service.dart'; import 'package:fcs/fcs/common/services/user_service.dart';
@@ -13,6 +16,7 @@ class Services {
AuthService _authService; AuthService _authService;
UserService _userService; UserService _userService;
PackageService _packageService;
MessagingService _messagingService; MessagingService _messagingService;
Services._() { Services._() {
_authService = AuthServiceImp( _authService = AuthServiceImp(
@@ -22,9 +26,12 @@ class Services {
_userService = UserServiceImp( _userService = UserServiceImp(
connectivity: null, userDataProvider: UserDataProvider()); connectivity: null, userDataProvider: UserDataProvider());
_messagingService = MessagingServiceImp(); _messagingService = MessagingServiceImp();
_packageService = PackageServiceImp(
connectivity: null, packageDataProvider: PackageDataProvider());
} }
AuthService get authService => _authService; AuthService get authService => _authService;
UserService get userService => _userService; UserService get userService => _userService;
MessagingService get messagingService => _messagingService; MessagingService get messagingService => _messagingService;
PackageService get packageService => _packageService;
} }