add image caches
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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":"မှတ်ချက်",
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>[
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ Future<void> showConfirmDialog(
|
|||||||
context,
|
context,
|
||||||
translationKey,
|
translationKey,
|
||||||
translationVariables: translationVariables,
|
translationVariables: translationVariables,
|
||||||
|
color: primaryColor,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
content: Container(
|
content: Container(
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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,
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user