add image caches

This commit is contained in:
Sai Naw Wun
2020-09-18 21:33:41 +06:30
parent 00f647e915
commit cc56a18613
32 changed files with 479 additions and 295 deletions

View File

@@ -43,6 +43,9 @@
"faq.edit.answer":"Answer", "faq.edit.answer":"Answer",
"faq.edit.sn":"S/N", "faq.edit.sn":"S/N",
"faq.edit.delete.confirm":"Delete this FAQ?", "faq.edit.delete.confirm":"Delete this FAQ?",
"faq.edit.page":"Additional Page",
"faq.edit.page.label.eng":"Page label in English",
"faq.edit.page.label.mm":"Page label in Myanmar",
"language.selection.title":"Please select your language", "language.selection.title":"Please select your language",
@@ -104,6 +107,7 @@
"package.tracking.id":"Tracking ID", "package.tracking.id":"Tracking ID",
"package.create.packages":"Complete receiving", "package.create.packages":"Complete receiving",
"package.create.market":"Market", "package.create.market":"Market",
"package.delete.confirm":"Delete this package?",
"package.edit.status":"Status", "package.edit.status":"Status",
"package.edit.title":"Edit Package", "package.edit.title":"Edit Package",

View File

@@ -43,6 +43,10 @@
"faq.edit.answer":"အဖြေ", "faq.edit.answer":"အဖြေ",
"faq.edit.sn":"S/N", "faq.edit.sn":"S/N",
"faq.edit.delete.confirm":"Delete this FAQ?", "faq.edit.delete.confirm":"Delete this FAQ?",
"faq.edit.page":"Additional Page",
"faq.edit.page.label":"Page label",
"faq.edit.page.label.eng":"Page label in English",
"faq.edit.page.label.mm":"Page label in Myanmar",
"language.selection.title":"ဘာသာစကား ရွေးချယ်ပါ", "language.selection.title":"ဘာသာစကား ရွေးချယ်ပါ",
@@ -105,6 +109,7 @@
"package.tracking.id":"Tracking ID", "package.tracking.id":"Tracking ID",
"package.create.packages":"အထုပ် အသစ်များ လက်ခံမည်", "package.create.packages":"အထုပ် အသစ်များ လက်ခံမည်",
"package.create.market":"အွန်လိုင်စျေးဆိုင်", "package.create.market":"အွန်လိုင်စျေးဆိုင်",
"package.delete.confirm":"အထုပ်ကို ဖျက်မလား?",
"package.edit.title":"အထုပ် ပြင်ဆင်ခြင်း", "package.edit.title":"အထုပ် ပြင်ဆင်ခြင်း",
"package.edit.remark":"မှတ်ချက်", "package.edit.remark":"မှတ်ချက်",

View File

@@ -1,3 +1,7 @@
import 'dart:convert';
import 'package:fcs/config.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/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';
@@ -11,4 +15,38 @@ class PackageDataProvider {
return await requestAPI("/packages", "POST", return await requestAPI("/packages", "POST",
payload: {"packages": json, "fcs_id": fcsID}, token: await getToken()); payload: {"packages": json, "fcs_id": fcsID}, token: await getToken());
} }
Future<void> deletePackage(Package package) async {
return await requestAPI("/packages", "DELETE",
payload: {"id": package.id}, token: await getToken());
}
Future<List<Package>> searchPackage(String term) async {
if (term == null || term == '') return List();
var bytes = utf8.encode(term);
var base64Str = base64.encode(bytes);
HtmlEscape htmlEscape = const HtmlEscape();
String escapePackage = htmlEscape.convert(base64Str);
int limit = 20;
List<Package> packages = [];
try {
var data = await requestAPI(
"/api/fts/$packages_collection/$escapePackage/$limit", "GET",
url: Config.instance.reportURL, token: await getToken());
if (data == null) return List();
data.forEach((p) {
var package = Package.fromJson(p);
packages.add(package);
});
} catch (e) {
log.warning("buyer error:" + e.toString());
return null;
}
return packages;
}
} }

View File

@@ -11,6 +11,11 @@ const user_invited_status = "invited";
const pkg_files_path = "/packages"; const pkg_files_path = "/packages";
// Link page
const page_payment_methods = "payment_methods";
const page_buying_instructions = "buying_instructions";
//////////////////////////////
const ok_doc_id = "ok"; const ok_doc_id = "ok";
const biz_collection = "bizs"; const biz_collection = "bizs";

View File

@@ -5,18 +5,23 @@ class FAQ {
String questionMm; String questionMm;
String answerEng; String answerEng;
String answerMm; String answerMm;
String pageLinkLabelEng;
String pageLinkLabelMm;
String pageLink;
String question(bool isEng) => isEng ? questionEng : questionMm; String question(bool isEng) => isEng ? questionEng : questionMm;
String answer(bool isEng) => isEng ? answerEng : answerMm; String answer(bool isEng) => isEng ? answerEng : answerMm;
FAQ({ FAQ(
this.id, {this.id,
this.sn, this.sn,
this.questionEng, this.questionEng,
this.questionMm, this.questionMm,
this.answerEng, this.answerEng,
this.answerMm, this.answerMm,
}); this.pageLinkLabelEng,
this.pageLinkLabelMm,
this.pageLink});
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
@@ -26,6 +31,9 @@ class FAQ {
'answer_eng': answerEng, 'answer_eng': answerEng,
'question_mm': questionMm, 'question_mm': questionMm,
'answer_mm': answerMm, 'answer_mm': answerMm,
'page_link_label_eng': pageLinkLabelEng,
'page_link_label_mm': pageLinkLabelMm,
'page_link': pageLink,
}; };
} }
@@ -37,6 +45,9 @@ class FAQ {
answerEng: map['answer_eng'], answerEng: map['answer_eng'],
questionMm: map['question_mm'], questionMm: map['question_mm'],
answerMm: map['answer_mm'], answerMm: map['answer_mm'],
pageLinkLabelEng: map['page_link_label_eng'],
pageLinkLabelMm: map['page_link_label_mm'],
pageLink: map['page_link'],
); );
} }

View File

@@ -106,4 +106,20 @@ class Package {
"remark": remark, "remark": remark,
"photo_urls": photoUrls "photo_urls": photoUrls
}; };
factory Package.fromJson(Map<String, dynamic> json) {
return Package(
id: json['id'],
trackingID: json['tracking_id'],
market: json['market'],
userName: json['user_name'],
phoneNumber: json['phone_number'],
currentStatus: json['current_status'],
currentStatusDate: DateTime.parse(json['current_status_date']));
}
@override
String toString() {
return 'Package{id: $id, currentStatus: $currentStatus, market:$market, trackingID: $trackingID,}';
}
} }

View File

@@ -99,8 +99,9 @@ class _BuyingOnlinePagetate extends State<BuyingOnlinePage>
unselectedLabelColor: Colors.grey, unselectedLabelColor: Colors.grey,
controller: _tabController, controller: _tabController,
tabs: [ tabs: [
LocalText(context, "buy_online.fullname"), LocalText(context, "buy_online.fullname", color: primaryColor),
LocalText(context, "buy_online.first.last"), LocalText(context, "buy_online.first.last",
color: primaryColor),
], ],
), ),
), ),

View File

@@ -4,6 +4,7 @@ import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/fcs/common/pages/customer/customer_editor.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/customer/model/customer_model.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/user_search/user_serach.dart';
import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.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/local_text.dart';
import 'package:fcs/widget/progress.dart'; import 'package:fcs/widget/progress.dart';
@@ -40,14 +41,11 @@ class _CustomerListState extends State<CustomerList> {
onPressed: () => Navigator.of(context).pop(), onPressed: () => Navigator.of(context).pop(),
), ),
actions: <Widget>[ actions: <Widget>[
// IconButton( IconButton(
// icon: Icon( icon: Icon(Icons.search, color: Colors.white),
// Icons.search, onPressed: () => searchUser(context, callbackUserSelect: (u) {
// color: Colors.white, _select(u);
// ), })),
// iconSize: 30,
// onPressed: () => {},
// ),
], ],
backgroundColor: primaryColor, backgroundColor: primaryColor,
title: LocalText( title: LocalText(

View File

@@ -1,3 +1,4 @@
import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/faq.dart'; import 'package:fcs/fcs/common/domain/entities/faq.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';
@@ -12,6 +13,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart'; import 'package:flutter_icons/flutter_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
const info = "Select additional page";
class FAQEditor extends StatefulWidget { class FAQEditor extends StatefulWidget {
final FAQ faq; final FAQ faq;
const FAQEditor({this.faq}); const FAQEditor({this.faq});
@@ -25,10 +28,14 @@ class _FAQEditorState extends State<FAQEditor> {
TextEditingController _mmQ = new TextEditingController(); TextEditingController _mmQ = new TextEditingController();
TextEditingController _engA = new TextEditingController(); TextEditingController _engA = new TextEditingController();
TextEditingController _mmA = new TextEditingController(); TextEditingController _mmA = new TextEditingController();
TextEditingController _pageLabelEng = new TextEditingController();
TextEditingController _pageLabelMm = new TextEditingController();
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
bool _isLoading = false; bool _isLoading = false;
bool _isNew = false; bool _isNew = false;
String _pageLink = info;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@@ -39,6 +46,9 @@ class _FAQEditorState extends State<FAQEditor> {
_mmQ.text = widget.faq.questionMm; _mmQ.text = widget.faq.questionMm;
_engA.text = widget.faq.answerEng; _engA.text = widget.faq.answerEng;
_mmA.text = widget.faq.answerMm; _mmA.text = widget.faq.answerMm;
_pageLabelEng.text = widget.faq.pageLinkLabelEng;
_pageLabelMm.text = widget.faq.pageLinkLabelMm;
_pageLink = widget.faq.pageLink;
} }
} }
@@ -72,6 +82,38 @@ class _FAQEditorState extends State<FAQEditor> {
maxLines: 5, maxLines: 5,
withBorder: true, withBorder: true,
); );
final pageLinkBox = DropdownButton<String>(
value: _pageLink,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: primaryColor,
),
onChanged: (String newValue) {
setState(() {
_pageLink = newValue;
});
},
items: <String>[info, page_buying_instructions, page_payment_methods]
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(
value,
style:
TextStyle(color: value == info ? Colors.black : primaryColor),
),
);
}).toList(),
);
final pageLabelEngBox = InputText(
controller: _pageLabelEng,
labelTextKey: "faq.edit.page.label.eng",
);
final pageLabelMmBox = InputText(
controller: _pageLabelMm,
labelTextKey: "faq.edit.page.label.mm",
);
return LocalProgress( return LocalProgress(
inAsyncCall: _isLoading, inAsyncCall: _isLoading,
@@ -98,6 +140,12 @@ class _FAQEditorState extends State<FAQEditor> {
fontSize: 20, fontSize: 20,
color: Colors.white, color: Colors.white,
)), )),
actions: [
IconButton(
icon: Icon(Icons.delete),
onPressed: _delete,
)
],
), ),
SliverList( SliverList(
delegate: SliverChildListDelegate([ delegate: SliverChildListDelegate([
@@ -106,6 +154,7 @@ class _FAQEditorState extends State<FAQEditor> {
child: Padding( child: Padding(
padding: EdgeInsets.only(left: 24.0, right: 24.0), padding: EdgeInsets.only(left: 24.0, right: 24.0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
snBox, snBox,
Center(child: itemTitle(context, "faq.edit.eng")), Center(child: itemTitle(context, "faq.edit.eng")),
@@ -123,6 +172,11 @@ class _FAQEditorState extends State<FAQEditor> {
subItemTitle(context, "faq.edit.answer", subItemTitle(context, "faq.edit.answer",
iconData: MaterialCommunityIcons.message_reply_text), iconData: MaterialCommunityIcons.message_reply_text),
answerMmBox, answerMmBox,
Divider(),
Center(child: itemTitle(context, "faq.edit.page")),
pageLinkBox,
pageLabelEngBox,
pageLabelMmBox,
fcsButton(context, getLocalString(context, "btn.save"), fcsButton(context, getLocalString(context, "btn.save"),
callack: _save), callack: _save),
SizedBox( SizedBox(
@@ -151,7 +205,10 @@ class _FAQEditorState extends State<FAQEditor> {
questionEng: _engQ.text, questionEng: _engQ.text,
answerEng: _engA.text, answerEng: _engA.text,
questionMm: _mmQ.text, questionMm: _mmQ.text,
answerMm: _mmA.text); answerMm: _mmA.text,
pageLinkLabelEng: _pageLabelEng.text,
pageLinkLabelMm: _pageLabelMm.text,
pageLink: _pageLink);
if (_isNew) { if (_isNew) {
await faqModel.addFAQ(_faq); await faqModel.addFAQ(_faq);
} else { } else {
@@ -167,4 +224,25 @@ class _FAQEditorState extends State<FAQEditor> {
}); });
} }
} }
_delete() {
showConfirmDialog(context, "faq.edit.delete.confirm", _deleteFAQ);
}
_deleteFAQ() async {
setState(() {
_isLoading = true;
});
try {
FAQModel faqModel = Provider.of<FAQModel>(context, listen: false);
await faqModel.deleteFAQ(widget.faq);
Navigator.pop(context);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
} }

View File

@@ -1,9 +1,12 @@
import 'package:fcs/fcs/common/domain/constants.dart';
import 'package:fcs/fcs/common/domain/entities/faq.dart'; import 'package:fcs/fcs/common/domain/entities/faq.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/buying_instruction/buying_online.dart';
import 'package:fcs/fcs/common/pages/faq/faq_edit_page.dart'; import 'package:fcs/fcs/common/pages/faq/faq_edit_page.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'; import 'package:fcs/fcs/common/pages/model/main_model.dart';
import 'package:fcs/fcs/common/pages/payment_methods/payment_method_page.dart';
import 'package:fcs/fcs/common/pages/widgets/bottom_up_page_route.dart'; 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/local_text.dart'; import 'package:fcs/fcs/common/pages/widgets/local_text.dart';
@@ -115,6 +118,8 @@ class _FAQListPageState extends State<FAQListPage>
context, context,
faq.question(isEng), faq.question(isEng),
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w600,
color: primaryColor,
), ),
onEditPress: () { onEditPress: () {
Navigator.of(context).push<void>(CupertinoPageRoute( Navigator.of(context).push<void>(CupertinoPageRoute(
@@ -133,11 +138,42 @@ class _FAQListPageState extends State<FAQListPage>
Widget getAnwser(BuildContext context, FAQ faq) { Widget getAnwser(BuildContext context, FAQ faq) {
bool isEng = Provider.of<LanguageModel>(context).isEng; bool isEng = Provider.of<LanguageModel>(context).isEng;
return TextLocalStyle( return Column(
context, children: [
faq.answer(isEng), TextLocalStyle(
fontSize: 16, context,
fontWeight: FontWeight.w200, faq.answer(isEng),
fontSize: 16,
fontWeight: FontWeight.w200,
),
_pageLink(
faq.pageLink,
isEng ? faq.pageLinkLabelEng : faq.pageLinkLabelMm,
),
],
); );
} }
Widget _pageLink(String linkPage, String text) {
return linkPage == null || linkPage == "" || text == null || text == ""
? Container()
: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FlatButton(
color: primaryColor,
onPressed: () => _selectLinkPage(linkPage),
child: LocalText(context, "", text: text, color: Colors.white),
)
],
);
}
_selectLinkPage(String linkPage) {
if (linkPage == page_payment_methods) {
Navigator.of(context).push(BottomUpPageRoute(PaymentMethodPage()));
} else if (linkPage == page_buying_instructions) {
Navigator.of(context).push(BottomUpPageRoute(BuyingOnlinePage()));
}
}
} }

View File

@@ -179,7 +179,7 @@ class _HomePageState extends State<HomePage> {
List<Widget> widgets = []; List<Widget> widgets = [];
widgets.add(faqBtn); widgets.add(faqBtn);
if (user != null) { if (user != null) {
customer ? widgets.add(buyingBtn) : ""; // customer ? widgets.add(buyingBtn) : "";
// customer || owner ? widgets.add(pickUpBtn) : ""; // customer || owner ? widgets.add(pickUpBtn) : "";
// !customer ? widgets.add(shipmentBtn) : ""; // !customer ? widgets.add(shipmentBtn) : "";
// customer || owner ? widgets.add(notiBtn) : ""; // customer || owner ? widgets.add(notiBtn) : "";
@@ -191,7 +191,7 @@ class _HomePageState extends State<HomePage> {
// owner ? widgets.add(deliveryBtn) : ""; // owner ? widgets.add(deliveryBtn) : "";
user.hasCustomers() ? widgets.add(customersBtn) : ""; user.hasCustomers() ? widgets.add(customersBtn) : "";
// customer || owner ? widgets.add(invoicesBtn) : ""; // customer || owner ? widgets.add(invoicesBtn) : "";
widgets.add(paymentMethodBtn); // widgets.add(paymentMethodBtn);
// owner ? widgets.add(discountBtn) : ""; // owner ? widgets.add(discountBtn) : "";
// widgets.add(termBtn); // widgets.add(termBtn);
} }

View File

@@ -48,6 +48,10 @@ class MainModel extends ChangeNotifier {
return this.user != null && this.user.hasSupport(); return this.user != null && this.user.hasSupport();
} }
bool paymentMethodsEditable() {
return this.user != null && this.user.hasSupport();
}
bool termEditable() { bool termEditable() {
return this.user != null && this.user.hasSupport(); return this.user != null && this.user.hasSupport();
} }

View File

@@ -45,7 +45,6 @@ class PackageModel extends BaseModel {
.where("is_delivered", isEqualTo: false) .where("is_delivered", isEqualTo: false)
.snapshots() .snapshots()
.listen((QuerySnapshot snapshot) { .listen((QuerySnapshot snapshot) {
print("reloaded....");
packages.clear(); packages.clear();
packages = snapshot.documents.map((documentSnapshot) { packages = snapshot.documents.map((documentSnapshot) {
var package = Package.fromMap( var package = Package.fromMap(
@@ -59,13 +58,33 @@ class PackageModel extends BaseModel {
} }
} }
Future<Package> getPackage(String id) async {
if (user == null) return null;
String path = "";
if (user.isCustomer()) {
path = "/$user_collection/${user.id}/$packages_collection";
} else {
path = "/$packages_collection";
}
try {
DocumentSnapshot snap =
await Firestore.instance.collection("$path").document(id).get();
if (snap.exists) {
var package = Package.fromMap(snap.data, snap.documentID);
return package;
}
} catch (e) {
log.warning("Error!! $e");
}
return null;
}
Future<List<User>> searchUser(String term) { Future<List<User>> searchUser(String term) {
return Services.instance.userService.searchUser(term); return Services.instance.userService.searchUser(term);
} }
Future<List<Package>> searchPackage(String term) { Future<List<Package>> searchPackage(String term) {
// return Services.instance.userService.searchUser(term); return Services.instance.packageService.searchPackage(term);
return null;
} }
Future<void> createPackages(User user, List<Package> packages) { Future<void> createPackages(User user, List<Package> packages) {
@@ -88,4 +107,8 @@ class PackageModel extends BaseModel {
await request("/packages", "PUT", await request("/packages", "PUT",
payload: package.toJson(), token: await getToken()); payload: package.toJson(), token: await getToken());
} }
Future<void> deletePackage(Package package) {
return Services.instance.packageService.deletePackage(package);
}
} }

View File

@@ -36,7 +36,7 @@ class _PackageEditorPageState extends State<PackageEditorPage> {
void initState() { void initState() {
super.initState(); super.initState();
_package = widget.package; _package = widget.package;
selectedMarket = _package.market; selectedMarket = _package.market ?? "";
_descCtl.text = _package.desc; _descCtl.text = _package.desc;
_remarkCtl.text = _package.remark; _remarkCtl.text = _package.remark;
multiImgController.setImageUrls = _package.photoUrls; multiImgController.setImageUrls = _package.photoUrls;
@@ -97,6 +97,12 @@ class _PackageEditorPageState extends State<PackageEditorPage> {
fontSize: 20, fontSize: 20,
color: primaryColor, color: primaryColor,
), ),
actions: [
IconButton(
icon: Icon(Icons.delete, color: primaryColor),
onPressed: _delete,
)
],
), ),
body: Padding( body: Padding(
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
@@ -145,6 +151,9 @@ class _PackageEditorPageState extends State<PackageEditorPage> {
List<Market> _markets = Provider.of<MarketModel>(context).markets; List<Market> _markets = Provider.of<MarketModel>(context).markets;
List<String> markets = _markets.map((e) => e.name).toList(); List<String> markets = _markets.map((e) => e.name).toList();
markets.insert(0, MANAGE_MARKET); markets.insert(0, MANAGE_MARKET);
if (!markets.contains(selectedMarket)) {
markets.insert(0, selectedMarket);
}
return Row( return Row(
children: [ children: [
@@ -226,4 +235,26 @@ class _PackageEditorPageState extends State<PackageEditorPage> {
}); });
} }
} }
_delete() {
showConfirmDialog(context, "package.delete.confirm", _deletePackage);
}
_deletePackage() async {
setState(() {
_isLoading = true;
});
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
try {
await packageModel.deletePackage(_package);
Navigator.pop<bool>(context, true);
} catch (e) {
showMsgDialog(context, "Error", e.toString());
} finally {
setState(() {
_isLoading = false;
});
}
}
} }

View File

@@ -11,9 +11,12 @@ import 'package:fcs/fcs/common/pages/widgets/progress.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';
import 'package:provider/provider.dart';
import 'package:timeline_list/timeline.dart'; import 'package:timeline_list/timeline.dart';
import 'package:timeline_list/timeline_model.dart'; import 'package:timeline_list/timeline_model.dart';
import 'model/package_model.dart';
final DateFormat dateFormat = DateFormat("d MMM yyyy"); final DateFormat dateFormat = DateFormat("d MMM yyyy");
class PackageInfo extends StatefulWidget { class PackageInfo extends StatefulWidget {
@@ -33,8 +36,14 @@ class _PackageInfoState extends State<PackageInfo> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_package = widget.package; initPackage(widget.package);
multiImgController.setImageUrls = _package.photoUrls; }
initPackage(Package package) {
setState(() {
_package = package;
multiImgController.setImageUrls = package.photoUrls;
});
} }
@override @override
@@ -100,12 +109,7 @@ class _PackageInfoState extends State<PackageInfo> {
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
icon: Icon(Icons.edit, color: primaryColor), icon: Icon(Icons.edit, color: primaryColor),
onPressed: () => Navigator.push<Package>( onPressed: _gotoEditor,
context,
BottomUpPageRoute(PackageEditorPage(
package: widget.package,
)),
),
) )
], ],
), ),
@@ -183,4 +187,20 @@ class _PackageInfoState extends State<PackageInfo> {
))) )))
.toList(); .toList();
} }
_gotoEditor() async {
bool deleted = await Navigator.push<bool>(
context,
BottomUpPageRoute(PackageEditorPage(
package: widget.package,
)));
if (deleted ?? false) {
Navigator.pop(context);
} else {
PackageModel packageModel =
Provider.of<PackageModel>(context, listen: false);
Package p = await packageModel.getPackage(_package.id);
initPackage(p);
}
}
} }

View File

@@ -1,6 +1,9 @@
import 'package:fcs/fcs/common/domain/entities/package.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/package/model/package_model.dart'; import 'package:fcs/fcs/common/pages/package/model/package_model.dart';
import 'package:fcs/fcs/common/pages/package/package_info.dart';
import 'package:fcs/fcs/common/pages/package/package_list_row.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/package_new.dart';
import 'package:fcs/fcs/common/pages/package_search/package_serach.dart'; import 'package:fcs/fcs/common/pages/package_search/package_serach.dart';
@@ -33,6 +36,7 @@ class _PackageListState extends State<PackageList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var packageModel = Provider.of<PackageModel>(context); var packageModel = Provider.of<PackageModel>(context);
bool isCustomer = context.select((MainModel m) => m.isCustomer());
return LocalProgress( return LocalProgress(
inAsyncCall: _isLoading, inAsyncCall: _isLoading,
@@ -51,38 +55,30 @@ class _PackageListState extends State<PackageList> {
color: Colors.white, color: Colors.white,
), ),
actions: <Widget>[ actions: <Widget>[
// IconButton( isCustomer
// icon: Icon( ? Container()
// Ionicons.ios_barcode, : IconButton(
// color: Colors.white, icon: Icon(
// ), Icons.search,
// iconSize: 30, color: Colors.white,
// onPressed: () { ),
// Navigator.push( iconSize: 30,
// context, onPressed: () => searchPackage(context,
// BottomUpPageRoute(BarcodeScreenPage()), callbackPackageSelect: _searchCallback),
// ); ),
// },
// ),
IconButton(
icon: Icon(
Icons.search,
color: Colors.white,
),
iconSize: 30,
onPressed: () => searchPackage(context),
),
], ],
), ),
floatingActionButton: FloatingActionButton.extended( floatingActionButton: isCustomer
onPressed: () { ? Container()
_newPackage(); : FloatingActionButton.extended(
}, onPressed: () {
icon: Icon(Icons.add), _newPackage();
label: },
Text(AppTranslations.of(context).text("package.create.title")), icon: Icon(Icons.add),
backgroundColor: primaryColor, label: Text(
), AppTranslations.of(context).text("package.create.title")),
backgroundColor: primaryColor,
),
body: new ListView.separated( body: new ListView.separated(
separatorBuilder: (context, index) => Divider( separatorBuilder: (context, index) => Divider(
color: Colors.black, color: Colors.black,
@@ -93,6 +89,7 @@ class _PackageListState extends State<PackageList> {
itemCount: packageModel.packages.length, itemCount: packageModel.packages.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return PackageListRow( return PackageListRow(
key: ValueKey(packageModel.packages[index].id),
package: packageModel.packages[index], package: packageModel.packages[index],
); );
})), })),
@@ -105,4 +102,14 @@ class _PackageListState extends State<PackageList> {
BottomUpPageRoute(PackageNew()), BottomUpPageRoute(PackageNew()),
); );
} }
_searchCallback(Package package) async {
var packageModel = Provider.of<PackageModel>(context, listen: false);
Package _package = await packageModel.getPackage(package.id);
if (_package == null) return;
Navigator.push(
context,
BottomUpPageRoute(PackageInfo(package: _package)),
);
}
} }

View File

@@ -1,29 +1,20 @@
import 'package:fcs/fcs/common/domain/entities/package.dart'; import 'package:fcs/fcs/common/domain/entities/package.dart';
import 'package:fcs/fcs/common/pages/package/package_editor.dart';
import 'package:fcs/fcs/common/pages/package/package_info.dart'; import 'package:fcs/fcs/common/pages/package/package_info.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/bottom_up_page_route.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
class PackageListRow extends StatefulWidget { typedef CallbackPackageSelect(Package package);
class PackageListRow extends StatelessWidget {
final Package package; final Package package;
const PackageListRow({this.package}); final CallbackPackageSelect callbackPackageSelect;
@override
_PackageListRowtate createState() => _PackageListRowtate();
}
class _PackageListRowtate extends State<PackageListRow> {
final double dotSize = 15.0; final double dotSize = 15.0;
Package _package = new Package();
final DateFormat dateFormat = new DateFormat("dd MMM yyyy"); final DateFormat dateFormat = new DateFormat("dd MMM yyyy");
@override PackageListRow({Key key, this.package, this.callbackPackageSelect})
void initState() { : super(key: key);
super.initState();
_package = widget.package;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -31,9 +22,13 @@ class _PackageListRowtate extends State<PackageListRow> {
padding: EdgeInsets.only(left: 15, right: 15), padding: EdgeInsets.only(left: 15, right: 15),
child: InkWell( child: InkWell(
onTap: () { onTap: () {
if (callbackPackageSelect != null) {
callbackPackageSelect(package);
return;
}
Navigator.push( Navigator.push(
context, context,
BottomUpPageRoute(PackageInfo(package: _package)), BottomUpPageRoute(PackageInfo(package: package)),
); );
}, },
child: Row( child: Row(
@@ -50,7 +45,7 @@ class _PackageListRowtate extends State<PackageListRow> {
Padding( Padding(
padding: const EdgeInsets.only(left: 8.0), padding: const EdgeInsets.only(left: 8.0),
child: new Text( child: new Text(
_package.id == null ? '' : _package.trackingID, package.id == null ? '' : package.trackingID,
style: new TextStyle( style: new TextStyle(
fontSize: 15.0, color: Colors.black), fontSize: 15.0, color: Colors.black),
), ),
@@ -58,21 +53,11 @@ class _PackageListRowtate extends State<PackageListRow> {
Padding( Padding(
padding: const EdgeInsets.only(left: 8.0), padding: const EdgeInsets.only(left: 8.0),
child: new Text( child: new Text(
_package.market == null ? '' : _package.market, package.market == null ? '' : package.market,
style: new TextStyle( style: new TextStyle(
fontSize: 15.0, color: Colors.black), fontSize: 15.0, color: Colors.black),
), ),
), ),
// Padding(
// padding: const EdgeInsets.only(left: 8.0),
// child: new Text(
// _package.trackingID == null
// ? ''
// : _package.trackingID,
// style: new TextStyle(
// fontSize: 15.0, color: Colors.grey),
// ),
// ),
], ],
), ),
), ),
@@ -84,36 +69,15 @@ 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.currentStatus), 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.currentStatusDate), dateFormat.format(package.currentStatusDate),
style: new TextStyle(fontSize: 15.0, color: Colors.grey), style: new TextStyle(fontSize: 15.0, color: Colors.grey),
), ),
), ),
// Padding(
// padding: const EdgeInsets.only(left: 8.0, top: 5, bottom: 5),
// child: Row(
// children: <Widget>[
// new Text(
// _package.weight == null
// ? ''
// : _package.weight.toString() + 'lb - ',
// style:
// new TextStyle(fontSize: 15.0, color: Colors.grey),
// ),
// new Text(
// _package.price == null
// ? ""
// : "\$ " + _package.price.toString(),
// style:
// new TextStyle(fontSize: 15.0, color: Colors.grey),
// ),
// ],
// ),
// ),
], ],
) )
], ],

View File

@@ -143,7 +143,7 @@ class _PackageNewState extends State<PackageNew> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(packages[index].market), Text(packages[index].market ?? ""),
Text(packages[index].trackingID), Text(packages[index].trackingID),
// DisplayText( // DisplayText(
// labelText: "Tracking ID", // labelText: "Tracking ID",

View File

@@ -32,6 +32,7 @@ class _ShippingAddressListState extends State<ShippingAddressList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var shipmentModel = Provider.of<ShipmentModel>(context); var shipmentModel = Provider.of<ShipmentModel>(context);
return LocalProgress( return LocalProgress(
inAsyncCall: _isLoading, inAsyncCall: _isLoading,
child: Scaffold( child: Scaffold(

View File

@@ -1,88 +0,0 @@
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<PackageSearchRow> {
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: <Widget>[
Expanded(
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: new Row(
children: <Widget>[
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: <Widget>[
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),
),
],
),
),
],
),
),
),
],
),
),
),
);
}
}

View File

@@ -1,12 +1,14 @@
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/helpers/theme.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/model/package_model.dart';
import 'package:fcs/fcs/common/pages/package_search/package_search_row.dart'; import 'package:fcs/fcs/common/pages/package/package_list_row.dart';
import 'package:fcs/fcs/common/pages/util.dart';
import 'package:flutter/material.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'; import 'package:provider/provider.dart';
typedef CallbackPackageSelect(Package package);
Future<Package> searchPackage(BuildContext context, Future<Package> searchPackage(BuildContext context,
{CallbackPackageSelect callbackPackageSelect}) async => {CallbackPackageSelect callbackPackageSelect}) async =>
await showSearch<Package>( await showSearch<Package>(
@@ -21,7 +23,7 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
PackageSearchDelegate({this.callbackPackageSelect}); PackageSearchDelegate({this.callbackPackageSelect});
@override @override
String get searchFieldLabel => 'Search by FCS ID or Name'; String get searchFieldLabel => 'Search by Tracking ID/Customer Name';
@override @override
ThemeData appBarTheme(BuildContext context) { ThemeData appBarTheme(BuildContext context) {
@@ -40,6 +42,11 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
@override @override
List<Widget> buildActions(BuildContext context) { List<Widget> buildActions(BuildContext context) {
return [ return [
IconButton(
icon: Icon(MaterialCommunityIcons.barcode_scan,
size: 30, color: Colors.white),
onPressed: () => _scan(context),
),
IconButton( IconButton(
icon: Icon(Icons.clear), icon: Icon(Icons.clear),
onPressed: () => query = '', onPressed: () => query = '',
@@ -76,7 +83,7 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
padding: EdgeInsets.only(top: 15), padding: EdgeInsets.only(top: 15),
child: ListView( child: ListView(
children: snapshot.data children: snapshot.data
.map((u) => PackageSearchRow( .map((u) => PackageListRow(
package: u, package: u,
callbackPackageSelect: callbackPackageSelect, callbackPackageSelect: callbackPackageSelect,
)) ))
@@ -110,8 +117,32 @@ class PackageSearchDelegate extends SearchDelegate<Package> {
child: Center( child: Center(
child: Opacity( child: Opacity(
opacity: 0.2, opacity: 0.2,
child: Icon(Icons.perm_identity, size: 200, color: primaryColor)), child: Icon(Octicons.package, size: 200, color: primaryColor)),
), ),
); );
} }
_scan(BuildContext context) 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) {
query = barcode;
showResults(context);
}
} catch (e) {
print('error: $e');
}
}
} }

View File

@@ -1,6 +1,7 @@
import 'package:fcs/fcs/common/domain/entities/payment_method.dart'; import 'package:fcs/fcs/common/domain/entities/payment_method.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/payment_methods/model/payment_method_model.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/payment_methods/payment_method_editor.dart';
import 'package:fcs/fcs/common/pages/util.dart'; import 'package:fcs/fcs/common/pages/util.dart';
@@ -24,6 +25,8 @@ class _PaymentMethodPageState extends State<PaymentMethodPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
PaymentMethodModel mainModel = Provider.of<PaymentMethodModel>(context); PaymentMethodModel mainModel = Provider.of<PaymentMethodModel>(context);
bool isEditable =
context.select((MainModel m) => m.paymentMethodsEditable());
return LocalProgress( return LocalProgress(
inAsyncCall: _isLoading, inAsyncCall: _isLoading,
@@ -57,26 +60,28 @@ class _PaymentMethodPageState extends State<PaymentMethodPage> {
itemCount: mainModel.paymentMethods.length, itemCount: mainModel.paymentMethods.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
var method = mainModel.paymentMethods[index]; var method = mainModel.paymentMethods[index];
return _item(method); return _item(method, isEditable);
}, },
), ),
), ),
floatingActionButton: FloatingActionButton.extended( floatingActionButton: isEditable
onPressed: () { ? FloatingActionButton.extended(
Navigator.push( onPressed: () {
context, Navigator.push(
BottomUpPageRoute(PaymentMethodEditor()), context,
); BottomUpPageRoute(PaymentMethodEditor()),
}, );
icon: Icon(Icons.add), },
label: LocalText(context, "pm.new", color: Colors.white), icon: Icon(Icons.add),
backgroundColor: primaryColor, label: LocalText(context, "pm.new", color: Colors.white),
), backgroundColor: primaryColor,
)
: Container(),
), ),
); );
} }
_item(PaymentMethod method) { _item(PaymentMethod method, bool isEditable) {
final accountName = _itemRow(method.accountName, "pm.account.name", final accountName = _itemRow(method.accountName, "pm.account.name",
iconData: MaterialCommunityIcons.bank); iconData: MaterialCommunityIcons.bank);
final accountNumber = _itemRow(method.account, "pm.account.no", final accountNumber = _itemRow(method.account, "pm.account.no",
@@ -86,14 +91,16 @@ class _PaymentMethodPageState extends State<PaymentMethodPage> {
final link = _itemRow(method.link, "pm.link", iconData: Icons.link); final link = _itemRow(method.link, "pm.link", iconData: Icons.link);
return InkWell( return InkWell(
onTap: () { onTap: isEditable
Navigator.push( ? () {
context, Navigator.push(
BottomUpPageRoute(PaymentMethodEditor( context,
paymentMethod: method, BottomUpPageRoute(PaymentMethodEditor(
)), paymentMethod: method,
); )),
}, );
}
: null,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[

View File

@@ -96,6 +96,7 @@ Future<void> showConfirmDialog(
context, context,
translationKey, translationKey,
translationVariables: translationVariables, translationVariables: translationVariables,
color: primaryColor,
), ),
), ),
content: Container( content: Container(

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
class DisplayImageSource { class DisplayImageSource {
@@ -8,7 +9,7 @@ class DisplayImageSource {
DisplayImageSource({this.url, this.file}); DisplayImageSource({this.url, this.file});
ImageProvider get imageProvider => ImageProvider get imageProvider =>
file == null ? NetworkImage(url) : FileImage(file); file == null ? CachedNetworkImageProvider(url) : FileImage(file);
@override @override
bool operator ==(other) { bool operator ==(other) {

View File

@@ -31,7 +31,7 @@ class _FcsExpansionTileState extends State<FcsExpansionTile> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Theme( return Theme(
data: ThemeData( data: ThemeData(
accentColor: secondaryColor, dividerColor: Colors.transparent), accentColor: primaryColor, dividerColor: Colors.transparent),
child: ExpansionTile( child: ExpansionTile(
onExpansionChanged: (value) { onExpansionChanged: (value) {
setState(() { setState(() {
@@ -44,6 +44,8 @@ class _FcsExpansionTileState extends State<FcsExpansionTile> {
children: widget.children, children: widget.children,
trailing: widget.isEdit trailing: widget.isEdit
? IconButton( ? IconButton(
padding: EdgeInsets.all(0),
iconSize: 20,
onPressed: () => onPressed: () =>
widget.onEditPress != null ? widget.onEditPress() : {}, widget.onEditPress != null ? widget.onEditPress() : {},
icon: Icon( icon: Icon(

View File

@@ -1,53 +0,0 @@
import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
getImgSlider(List<String> images) {
return Container(
height: 130,
width: 500,
child: ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
itemCount: images.length + 1,
scrollDirection: Axis.horizontal,
itemBuilder: (context, index) {
if (index == images.length) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
width: 200,
height: 70,
decoration: BoxDecoration(
border: Border.all(
color: primaryColor,
width: 2.0,
),
),
child: Icon(SimpleLineIcons.plus),
),
);
} else {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
width: 200,
height: 70,
decoration: BoxDecoration(
border: Border.all(
color: primaryColor,
width: 2.0,
),
),
child: Image.network(
"https://lh3.googleusercontent.com/Fu9J7YpHnHK8QPr3kdAyEbTFyvB3h9Na69-j8CpQqWbMQP9sGplj7hVqQ5beKKLGgdyA8f5zIfqWdp2ITxuqlGkWDVuTyAtj_Rmw=w0",
width: 50,
height: 50),
),
);
}
},
),
);
}

View File

@@ -11,10 +11,12 @@ class LocalText extends Text {
double fontSize, double fontSize,
FontWeight fontWeight, FontWeight fontWeight,
List<String> translationVariables, List<String> translationVariables,
String text,
bool underline = false}) bool underline = false})
: super( : super(
AppTranslations.of(context).text(translationKey, text ??
translationVariables: translationVariables), AppTranslations.of(context).text(translationKey,
translationVariables: translationVariables),
style: Provider.of<LanguageModel>(context, listen: false).isEng style: Provider.of<LanguageModel>(context, listen: false).isEng
? newLabelStyle( ? newLabelStyle(
color: color, color: color,

View File

@@ -1,5 +1,6 @@
import 'dart:io'; import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:fcs/fcs/common/helpers/theme.dart'; import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/fcs/common/pages/widgets/show_img.dart'; import 'package:fcs/fcs/common/pages/widgets/show_img.dart';
import 'package:fcs/fcs/common/pages/widgets/show_multiple_img.dart'; import 'package:fcs/fcs/common/pages/widgets/show_multiple_img.dart';
@@ -95,6 +96,7 @@ class _MultiImageFileState extends State<MultiImageFile> {
MaterialPageRoute( MaterialPageRoute(
builder: (context) => ShowMultiImage( builder: (context) => ShowMultiImage(
displayImageSources: fileContainers, displayImageSources: fileContainers,
initialPage: index,
)), )),
), ),
child: Stack(alignment: Alignment.topLeft, children: <Widget>[ child: Stack(alignment: Alignment.topLeft, children: <Widget>[
@@ -110,8 +112,17 @@ class _MultiImageFileState extends State<MultiImageFile> {
), ),
), ),
child: fileContainers[index].file == null child: fileContainers[index].file == null
? Image.network(fileContainers[index].url, ? CachedNetworkImage(
width: 50, height: 50) imageUrl: fileContainers[index].url,
placeholder: (context, url) => Container(
width: 50,
height: 50,
child: CircularProgressIndicator()),
errorWidget: (context, url, error) =>
Icon(Icons.error),
)
// Image.network(fileContainers[index].url,
// width: 50, height: 50)
: Image.file(fileContainers[index].file, : Image.file(fileContainers[index].file,
width: 50, height: 50), width: 50, height: 50),
), ),

View File

@@ -1,3 +1,4 @@
import 'package:fcs/fcs/common/helpers/theme.dart';
import 'package:fcs/fcs/common/pages/widgets/display_image_source.dart'; import 'package:fcs/fcs/common/pages/widgets/display_image_source.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view.dart';
@@ -5,12 +6,22 @@ import 'package:photo_view/photo_view_gallery.dart';
class ShowMultiImage extends StatefulWidget { class ShowMultiImage extends StatefulWidget {
final List<DisplayImageSource> displayImageSources; final List<DisplayImageSource> displayImageSources;
const ShowMultiImage({Key key, this.displayImageSources}) : super(key: key); final int initialPage;
const ShowMultiImage(
{Key key, this.displayImageSources, this.initialPage = 0})
: super(key: key);
@override @override
_ShowMultiImageState createState() => _ShowMultiImageState(); _ShowMultiImageState createState() => _ShowMultiImageState();
} }
class _ShowMultiImageState extends State<ShowMultiImage> { class _ShowMultiImageState extends State<ShowMultiImage> {
PageController pageController;
@override
void initState() {
pageController = PageController(initialPage: widget.initialPage);
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@@ -37,6 +48,10 @@ class _ShowMultiImageState extends State<ShowMultiImage> {
), ),
), ),
), ),
backgroundDecoration: const BoxDecoration(
color: primaryColor,
),
pageController: pageController,
))); )));
} }
} }

View File

@@ -17,4 +17,14 @@ class PackageServiceImp implements PackageService {
Future<void> createPackages(List<Package> packages, String fcsID) { Future<void> createPackages(List<Package> packages, String fcsID) {
return packageDataProvider.createPackages(packages, fcsID); return packageDataProvider.createPackages(packages, fcsID);
} }
@override
Future<List<Package>> searchPackage(String term) {
return packageDataProvider.searchPackage(term);
}
@override
Future<void> deletePackage(Package package) {
return packageDataProvider.deletePackage(package);
}
} }

View File

@@ -2,4 +2,6 @@ import 'package:fcs/fcs/common/domain/entities/package.dart';
abstract class PackageService { abstract class PackageService {
Future<void> createPackages(List<Package> packages, String fcsID); Future<void> createPackages(List<Package> packages, String fcsID);
Future<void> deletePackage(Package package);
Future<List<Package>> searchPackage(String term);
} }

View File

@@ -76,6 +76,7 @@ dependencies:
flutter_pdfview: ^1.0.3 flutter_pdfview: ^1.0.3
flutter_local_notifications: ^1.4.4+4 flutter_local_notifications: ^1.4.4+4
share: ^0.6.5 share: ^0.6.5
cached_network_image: ^2.3.2+1