Browse Source

Merge remote-tracking branch 'origin/new_revision_app' into new_revision_app

# Conflicts:
#	lib/mine/recharge_page.dart
new_revision_app
fmk 2 years ago
parent
commit
1ed8f1fec8
  1. 4
      lib/base_state.dart
  2. 2
      lib/community/community_details.dart
  3. 1
      lib/community/community_view/class_details.dart
  4. 2
      lib/community/community_view/community_dynamic.dart
  5. 37
      lib/home/welfare_page.dart
  6. 4
      lib/main.dart
  7. 4
      lib/main_page.dart
  8. 206
      lib/message/system_message.dart
  9. 4
      lib/mine/recharge_page.dart
  10. 17
      lib/order/edit_remarks_page.dart
  11. 4
      lib/order/order_detail_page.dart
  12. 3
      lib/order/order_history_page.dart
  13. 10
      lib/order/order_view/order_address.dart
  14. 5
      lib/settlement/settlement.dart
  15. 26
      lib/settlement/settlement_view/distribution.dart
  16. 7
      lib/settlement/settlement_view/pay_method.dart
  17. 25
      lib/store/shop_details_page.dart
  18. 48
      lib/store/store_order.dart
  19. 184
      lib/store/store_view/product_sku.dart
  20. 70
      lib/store/store_view/shop_goods.dart
  21. 3
      lib/union/union_list.dart
  22. 6
      lib/view_widget/activity_poster.dart

4
lib/base_state.dart

@ -59,8 +59,10 @@ abstract class BaseState<T extends StatefulWidget> extends State<T>
params["activityId"] = pushMap["info"];
break;
case 3:
routeName = "/router/union_detail_page";
routeName = "/router/store_order";
params["id"] = pushMap["info"];
params["tenant"] = pushMap["tenant"];
params["storeName"] = pushMap["storeName"];
break;
case 4:
routeName = "/router/integral_store_page";

2
lib/community/community_details.dart

@ -105,7 +105,7 @@ class _CommunityDetails extends State<CommunityDetails>
void _focusNodeListener() {
/*if (_focusNode.hasFocus || _focusNode.consumeKeyboardToken()){
setState(() {
emojiShowing = false;
smileyPadGone = true;
});
}*/
}

1
lib/community/community_view/class_details.dart

@ -213,6 +213,7 @@ class _ClassDetails extends State<ClassDetails> with WidgetsBindingObserver {
child: Column(
children: [
Container(
height: MediaQuery.of(context).size.width / 1.5,
child: Stack(
children: [
ClassDetailsVideo(

2
lib/community/community_view/community_dynamic.dart

@ -226,7 +226,7 @@ class _CommunityDynamic extends State<CommunityDynamic> {
},
child: MImage(
(widget?.article?.authorHeadImg ??
"https://lmg.jj20.com/up/allimg/tx30/09041130358711081.jpg"),
""),
width: 44,
height: 44,
isCircle: true,

37
lib/home/welfare_page.dart

@ -50,8 +50,7 @@ class _WelfarePage extends State<WelfarePage> {
super.initState();
SharedPreferences.getInstance().then((value) => {
apiService = ApiService(Dio(), context: context, token: value.getString("token")),
queryGoods(),
queryCoupon(),
_onRefresh(),
});
}
@ -108,6 +107,8 @@ class _WelfarePage extends State<WelfarePage> {
"searchKey": "",
"state": 0
}).catchError((onError) {
SmartDialog.showToast(AppUtils.dioErrorTypeToString(onError.type),
alignment: Alignment.center);
refreshController.refreshFailed();
refreshController.loadFailed();
});
@ -134,7 +135,7 @@ class _WelfarePage extends State<WelfarePage> {
_onRefresh(){
queryGoods();
// queryCoupon();
queryCoupon();
}
@ -262,7 +263,13 @@ class _WelfarePage extends State<WelfarePage> {
),
],
)),
AspectRatio(
coupon.length == 0?
NoDataView(
src: "assets/image/ka.webp",
isShowBtn: false,
text: S.of(context).haimeiyouyouhuiquankeyilingqu,
fontSize: 16.sp,
): AspectRatio(
aspectRatio: 1.10,
child: Swiper(
onIndexChanged: (it){
@ -288,12 +295,11 @@ class _WelfarePage extends State<WelfarePage> {
children: [
Container(
child: weekList(coupon[position]),
// weekList(testList2[position]),
),
],
);
},
itemCount:coupon.length,
itemCount:coupon.length ?? 0,
),
)
],
@ -302,7 +308,14 @@ class _WelfarePage extends State<WelfarePage> {
}
Widget weekList(List<Coupon> cops){
return Expanded(child:(cops != null && cops.length > 0)?ListView.builder(
return Expanded(
child:(cops == null && cops.length == 0)?
NoDataView(
src: "assets/image/ka.webp",
isShowBtn: false,
text: S.of(context).haimeiyouyouhuiquankeyilingqu,
fontSize: 16.sp,
):ListView.builder(
padding: EdgeInsets.zero,
itemCount: cops.length,
scrollDirection: Axis.vertical,
@ -315,14 +328,10 @@ class _WelfarePage extends State<WelfarePage> {
child: weekCoupon(cops[position]),
);
},
):NoDataView(
src: "assets/image/ka.webp",
isShowBtn: false,
text: S.of(context).haimeiyouyouhuiquankeyilingqu,
fontSize: 16.sp,
),);
}
///
Widget weekCoupon(Coupon cop) {
return Container(
height: 95.h,
@ -396,6 +405,7 @@ class _WelfarePage extends State<WelfarePage> {
);
}
///
Widget weekWidget(Coupon cop) {
if (cop.bizType == 1) {
return Column(
@ -581,6 +591,7 @@ class _WelfarePage extends State<WelfarePage> {
}
}
///
Widget weekBtn(Coupon cop) {
if(cop.status == 0)
return Align(
@ -645,6 +656,7 @@ class _WelfarePage extends State<WelfarePage> {
);
}
///
receiveCoupon(couponId) async {
couponIndex = swiperIndex;
BaseData baseData = await apiService.receiveCoupon(couponId);
@ -881,7 +893,6 @@ class _WelfarePage extends State<WelfarePage> {
);
}
String pointPrice(Goods goodsPrice){
if(goodsPrice == null)
return "";

4
lib/main.dart

@ -199,7 +199,7 @@ class MyApp extends StatelessWidget {
} else if (locales[0].countryCode == "CN"){
locale = Locale.fromSubtags(languageCode: 'zh', countryCode: 'CH');
} else{
locale = Locale.fromSubtags(languageCode: 'en', countryCode: 'CH');
locale = Locale.fromSubtags(languageCode: 'en', countryCode: 'US');
}
return appLocale ?? locale;
},
@ -325,7 +325,7 @@ Map<String, WidgetBuilder> routers = <String, WidgetBuilder>{
'/router/help_feedback_page': (context, {arguments}) => HelpFeedbackPage(),
'/router/founder_story_page': (context, {arguments}) => FounderStoryPage(),
'/router/system_msg_page': (context, {arguments}) => SystemMessagePage(),
'/router/edit_remarks_page': (context, {arguments}) => EditRemarksPage(),
'/router/edit_remarks_page': (context, {arguments}) => EditRemarksPage(arguments: arguments),
// '/router/hot_article_page': (context, {arguments}) => HotArticlePage(),
'/router/address_map_page': (context, {arguments}) => AddressMapPage(),
'/router/roll_center_page': (context, {arguments}) => RollCenterPage(),

4
lib/main_page.dart

@ -297,8 +297,10 @@ class _MainPage extends State<MainPage> with WidgetsBindingObserver {
params["activityId"] = pushMap["info"];
break;
case 3:
routeName = "/router/union_detail_page";
routeName = "/router/store_order";
params["id"] = pushMap["info"];
params["tenant"] = pushMap["tenant"];
params["storeName"] = pushMap["storeName"];
break;
case 4:
routeName = "/router/integral_store_page";

206
lib/message/system_message.dart

@ -102,7 +102,8 @@ class _SystemMessagePage extends State<SystemMessagePage> {
token: value.getString("token"),
);
}
BaseData<List<MsgStats>> baseData = await apiService.stats().catchError((onError) {});
BaseData<List<MsgStats>> baseData =
await apiService.stats().catchError((onError) {});
if (baseData != null && baseData.isSuccess) {
setState(() {
msgNumber.forEach((key, value) {
@ -125,34 +126,34 @@ class _SystemMessagePage extends State<SystemMessagePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(
background: Colors.white,
leadingColor: Colors.black,
title: S.of(context).xiaoxi,
titleSize: 18.sp,
titleColor: Colors.black,
actions: [
Container(
margin: EdgeInsets.only(right: 16.w),
alignment: Alignment.centerRight,
child: GestureDetector(
onTap: () {
setState(() {
queryMsgStats();
});
},
child: Text(
S.of(context).biaoweiyidu,
style: TextStyle(
fontSize: 16.sp,
fontWeight:MyFontWeight.semi_bold,
color: Color(0xFF353535),
),
),
),
),
],
),
// appBar: MyAppBar(
// background: Colors.white,
// leadingColor: Colors.black,
// title: S.of(context).xiaoxi,
// titleSize: 18.sp,
// titleColor: Colors.black,
// actions: [
// Container(
// margin: EdgeInsets.only(right: 16.w),
// alignment: Alignment.centerRight,
// child: GestureDetector(
// onTap: () {
// setState(() {
// queryMsgStats();
// });
// },
// child: Text(
// S.of(context).biaoweiyidu,
// style: TextStyle(
// fontSize: 16.sp,
// fontWeight:MyFontWeight.semi_bold,
// color: Color(0xFF353535),
// ),
// ),
// ),
// ),
// ],
// ),
body: SmartRefresher(
enablePullDown: true,
enablePullUp: true,
@ -177,15 +178,73 @@ class _SystemMessagePage extends State<SystemMessagePage> {
child: Container(
child: Column(
children: [
Container(
color: Colors.white,
padding: EdgeInsets.only(
top: MediaQuery.of(context).padding.top + 10.h,
bottom: 15.h,right: 16.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Navigator.of(context).pop();
},
child: Container(
alignment: Alignment.centerRight,
margin: EdgeInsets.only(left: 12,),
padding: EdgeInsets.all(6),
child: Icon(
Icons.arrow_back_ios,
color: Colors.black,
size: 24,
),
),
),
Spacer(),
Expanded(
child: Text(
S.of(context).xiaoxi,
style: TextStyle(
color: Colors.black,
fontSize: 16.sp,
fontWeight: MyFontWeight.regular,
),
)),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
queryMsgStats();
});
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: Text(
S.of(context).biaoweiyidu,
style: TextStyle(
color: Colors.black,
fontSize: 16.sp,
fontWeight: FontWeight.bold,
),
),
),
),
],
),
),
newsSurvey(),
SizedBox(height: 16.h,),
SizedBox(
height: 16.h,
),
buildMessage(),
],
),
),
),
),
),
);
}
@ -196,10 +255,11 @@ class _SystemMessagePage extends State<SystemMessagePage> {
padding: EdgeInsets.only(top: 16.h, bottom: 16.h),
child: Row(
children: [
Expanded(child: GestureDetector(
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context)
.pushNamed('/router/system_details',arguments: {"msgType":5}).then((value) {
Navigator.of(context).pushNamed('/router/system_details',
arguments: {"msgType": 5}).then((value) {
setState(() {
msgNumber["5"] = 0;
});
@ -237,8 +297,7 @@ class _SystemMessagePage extends State<SystemMessagePage> {
backgroup: Color(0xFFFF441A),
fontSize: 8.sp,
radius: 100,
)
),
)),
)
],
),
@ -252,14 +311,12 @@ class _SystemMessagePage extends State<SystemMessagePage> {
),
)
],
)
)
),
Expanded(child:
GestureDetector(
))),
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context)
.pushNamed('/router/system_details',arguments: {"msgType":6}).then((value) {
Navigator.of(context).pushNamed('/router/system_details',
arguments: {"msgType": 6}).then((value) {
setState(() {
msgNumber["6"] = 0;
});
@ -297,8 +354,7 @@ class _SystemMessagePage extends State<SystemMessagePage> {
backgroup: Color(0xFFFF441A),
fontSize: 8.sp,
radius: 100,
)
),
)),
)
],
),
@ -312,13 +368,12 @@ class _SystemMessagePage extends State<SystemMessagePage> {
),
),
],
)
)),
Expanded(child:
GestureDetector(
))),
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context)
.pushNamed('/router/system_details',arguments: {"msgType":4}).then((value) {
Navigator.of(context).pushNamed('/router/system_details',
arguments: {"msgType": 4}).then((value) {
setState(() {
msgNumber["4"] = 0;
});
@ -356,8 +411,7 @@ class _SystemMessagePage extends State<SystemMessagePage> {
backgroup: Color(0xFFFF441A),
fontSize: 8.sp,
radius: 100,
)
),
)),
)
],
),
@ -371,9 +425,7 @@ class _SystemMessagePage extends State<SystemMessagePage> {
),
),
],
)
)
),
))),
],
),
);
@ -413,15 +465,17 @@ class _SystemMessagePage extends State<SystemMessagePage> {
return GestureDetector(
onTap: () {
if (messages[position].typed == 2)
Navigator.of(context)
.pushNamed('/router/system_details',arguments: {"msgType":2}).then((value) {
Navigator.of(context).pushNamed(
'/router/system_details',
arguments: {"msgType": 2}).then((value) {
setState(() {
msgNumber["2"] = 0;
});
});
else if (messages[position].typed == 3)
Navigator.of(context)
.pushNamed('/router/system_details',arguments: {"msgType":3}).then((value) {
Navigator.of(context).pushNamed(
'/router/system_details',
arguments: {"msgType": 3}).then((value) {
setState(() {
msgNumber["3"] = 0;
});
@ -431,8 +485,7 @@ class _SystemMessagePage extends State<SystemMessagePage> {
);
}),
],
)
);
));
}
Widget buildMessageItem(Message message) {
@ -472,13 +525,15 @@ class _SystemMessagePage extends State<SystemMessagePage> {
SizedBox(
width: 12.w,
),
Expanded(child:Column(
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(child:Text(
Expanded(
child: Text(
(message.typed == 1)
? S.of(context).xitongtongzhi
: (message.typed == 2)
@ -499,20 +554,23 @@ class _SystemMessagePage extends State<SystemMessagePage> {
),
],
),
SizedBox(height:4.h,),
(message.typed != 3) ?
Row(
SizedBox(
height: 4.h,
),
(message.typed != 3)
? Row(
mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child:
Text(
Expanded(
child: Text(
S.of(context).ninyouyigexindedingdan,
style: TextStyle(
fontSize: 10.sp,
color: Color(0xFF353535),
),
),),
),
),
if (msgNumber["2"].toString() != "0")
RoundButton(
width: 16,
@ -525,13 +583,13 @@ class _SystemMessagePage extends State<SystemMessagePage> {
radius: 100,
),
],
):
Row(
)
: Row(
mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child:
Text(
Expanded(
child: Text(
message.content,
style: TextStyle(
fontSize: 10.sp,

4
lib/mine/recharge_page.dart

@ -296,6 +296,7 @@ class _RechargePage extends State<RechargePage> {
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 2;
@ -328,6 +329,7 @@ class _RechargePage extends State<RechargePage> {
),
SizedBox(height:10.h),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 3;
@ -632,7 +634,7 @@ class _RechargePage extends State<RechargePage> {
Widget checkView(var index) {
return Container(
padding: EdgeInsets.only(right: 16.w),
padding: EdgeInsets.only(right: 16.w,left: 46.w),
alignment: Alignment.center,
child: Image.asset(
checkIndex != index

17
lib/order/edit_remarks_page.dart

@ -5,6 +5,9 @@ import 'package:huixiang/view_widget/my_appbar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class EditRemarksPage extends StatefulWidget {
final Map<String, dynamic> arguments;
EditRemarksPage({this.arguments});
@override
State<StatefulWidget> createState() {
return _EditRemarksPage();
@ -14,6 +17,14 @@ class EditRemarksPage extends StatefulWidget {
class _EditRemarksPage extends State<EditRemarksPage> {
TextEditingController commentTextController = TextEditingController();
@override
void initState() {
super.initState();
if((widget.arguments["remake"]??"") != "")
commentTextController.text = widget.arguments["remake"];
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -75,7 +86,8 @@ class _EditRemarksPage extends State<EditRemarksPage> {
controller: commentTextController,
keyboardType: TextInputType.multiline,
maxLines: 10,
decoration: InputDecoration(
decoration:
InputDecoration(
isDense: true,
hintText: '请填写备注信息,例如:面包切一刀',
hintStyle: TextStyle(
@ -97,7 +109,8 @@ class _EditRemarksPage extends State<EditRemarksPage> {
),
GestureDetector(
onTap: (){
Navigator.pop(context,commentTextController.text);
String notes = commentTextController.text;
Navigator.pop(context,notes);
},
child: Container(
padding: EdgeInsets.all(16.h),

4
lib/order/order_detail_page.dart

@ -34,11 +34,11 @@ class OrderDetailPage extends StatefulWidget {
class _OrderDetailPage extends State<OrderDetailPage> {
ApiService apiService;
MinApiService minService;
int jumpState;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((value) {
apiService = ApiService(
Dio(),
@ -48,6 +48,7 @@ class _OrderDetailPage extends State<OrderDetailPage> {
);
queryDetails();
});
jumpState = widget.arguments["jumpState"];
}
///
@ -183,6 +184,7 @@ class _OrderDetailPage extends State<OrderDetailPage> {
paySelected,
_orderCancel,
orderInfo,
jumpState
),
///

3
lib/order/order_history_page.dart

@ -155,7 +155,7 @@ class _OrderHistoryList extends State<OrderHistoryList>
return InkWell(
onTap: () {
Navigator.of(context).pushNamed('/router/order_details',
arguments: {"id": orderInfos[position].id});
arguments: {"id": orderInfos[position].id,"jumpState":2});
},
child: orderItem(orderInfos[position]),
);
@ -469,6 +469,7 @@ class _OrderHistoryList extends State<OrderHistoryList>
text: orderInfo.finalPayPrice,
style: TextStyle(
fontSize: 12.sp,
fontWeight: FontWeight.bold,
color: Colors.black,
),

10
lib/order/order_view/order_address.dart

@ -22,6 +22,7 @@ class OrderAddress extends StatefulWidget {
final Function orderCancel;
final Function() carryOnPay;
final OrderInfo orderInfo;
final int jumpState;
OrderAddress(
this.orderStatus,
@ -33,7 +34,8 @@ class OrderAddress extends StatefulWidget {
this.center,
this.carryOnPay,
this.orderCancel,
this.orderInfo,);
this.orderInfo,
this.jumpState);
@override
State<StatefulWidget> createState() {
@ -271,7 +273,10 @@ class _OrderAddress extends State<OrderAddress> {
widget.orderInfo.storeVO.storeName,
);
} else {
Navigator.of(context).pushNamed(
if(widget.jumpState == 1){
Navigator.of(context).pop();
}else if(widget.jumpState == 2){
Navigator.of(context).popAndPushNamed(
'/router/store_order',
arguments: {
"id": widget.orderInfo.storeVO.id,
@ -280,6 +285,7 @@ class _OrderAddress extends State<OrderAddress> {
},
);
}
}
}

5
lib/settlement/settlement.dart

@ -698,6 +698,7 @@ class _Settlement extends State<Settlement> {
'/router/order_details',
arguments: {
"id": orderId,
"jumpState":1,
},
);
// Navigator.of(context).pop();
@ -771,7 +772,7 @@ class _Settlement extends State<Settlement> {
payChannel,
tableId ?? 0);
}, queryAddress, storeInfo, address,
selectedAddress, pageType),
selectedAddress, pageType,widget.arguments["distance"]),
SizedBox(
height: 16,
@ -810,7 +811,7 @@ class _Settlement extends State<Settlement> {
() {
Navigator.of(context).pushNamed(
'/router/edit_remarks_page',
arguments: {},
arguments: {"remake":remakers}
).then((value) => {
setState(() {
if (value != null) remakers = value;

26
lib/settlement/settlement_view/distribution.dart

@ -26,9 +26,10 @@ class DistributionMode extends StatefulWidget {
final StoreInfo storeInfo;
final Address address;
final String pageType;
final double distance;
DistributionMode(this.queryOrderInfo, this.queryAddress, this.storeInfo,
this.address, this.selectedNewAddress, this.pageType);
this.address, this.selectedNewAddress, this.pageType, this.distance);
@override
State<StatefulWidget> createState() {
@ -261,11 +262,21 @@ class _DistributionMode extends State<DistributionMode> {
Column(
children: [
RoundButton(
// width: 41.w,
height: 13,
text: distance.length > 3
? "${distance}km"
: "距离您${distance}km",
? ((widget.distance ?? 0) > 1000
? "${((widget.distance ?? 0) / 1000 * 100).toInt() / 100.0}km"
: S.of(context).mi(
((widget.distance ?? 0) *
100)
.toInt() /
100.0))
: "距离您${(widget.distance ?? 0) > 1000 ?
"${((widget.distance ?? 0) / 1000 * 100).toInt() / 100.0}km"
: S.of(context).mi(((widget.distance ?? 0) * 100).toInt() / 100.0)}",
// distance.length > 3
// ? "${distance}km"
// : "距离您${distance}km",
textColor: Color(0xFF34A262),
fontWeight: MyFontWeight.semi_bold,
radius: 7.5,
@ -310,12 +321,13 @@ class _DistributionMode extends State<DistributionMode> {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
(widget.storeInfo.storeName == "一心回乡商城") ?
Icon(
(widget.storeInfo.storeName == "一心回乡商城")
? Icon(
Icons.local_shipping,
color: Color(0xFF727272),
size: 24,
):Image.asset(
)
: Image.asset(
"assets/image/icon_permission_location.webp",
height: 24.h,
width: 24.w,

7
lib/settlement/settlement_view/pay_method.dart

@ -90,6 +90,7 @@ class _PayMethod extends State<PayMethod> {
),
if(!(widget.settleOrderInfo?.isRaise ?? false))
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 1;
@ -134,6 +135,7 @@ class _PayMethod extends State<PayMethod> {
),
if(!(widget.settleOrderInfo?.isRaise ?? false))
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 2;
@ -178,6 +180,7 @@ class _PayMethod extends State<PayMethod> {
),
if(mGreenMoney!="0.00" && !(widget.settleOrderInfo?.isRaise ?? false))
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 3;
@ -231,6 +234,7 @@ class _PayMethod extends State<PayMethod> {
),
if(mRaiseMoney!="0" && (widget.settleOrderInfo?.isRaise ?? false))
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 4;
@ -284,6 +288,7 @@ class _PayMethod extends State<PayMethod> {
),
if(!(widget.settleOrderInfo?.isRaise ?? false))
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
checkIndex = 5;
@ -320,7 +325,7 @@ class _PayMethod extends State<PayMethod> {
Widget checkView(var index) {
return Container(
padding: EdgeInsets.only(right: 16.w),
padding: EdgeInsets.only(right:36.w),
alignment: Alignment.center,
child: Image.asset(
checkIndex != index

25
lib/store/shop_details_page.dart

@ -65,6 +65,7 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
String storeId;
String parentId;
int numberOfPeople = 0;
int index;
@override
void initState() {
@ -91,7 +92,6 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
buildCount();
}
///
queryStoreInfo() async {
SharedPreferences value = await SharedPreferences.getInstance();
@ -152,7 +152,6 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
});
}
///
queryMiNiDetail(id) async {
BaseData<MiNiDetail> baseData =
@ -938,10 +937,8 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
child: Container(
margin: EdgeInsets.only(left: 16, top: 52),
padding: EdgeInsets.all(5),
child: Icon(
Icons.arrow_back_ios,
size: 24,
color: Color(0xFF353535),
child: Image.asset(
"assets/image/integral_return.webp",
),
),
),
@ -959,9 +956,7 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
context,
state,
) {
return WillPopScope(
onWillPop: () async => false,
child:Container(
return Container(
alignment: Alignment.topCenter,
padding: EdgeInsets.symmetric(horizontal: 14.w,vertical: 16),
height: MediaQuery.of(context).size.height / 3 * 2,
@ -1095,7 +1090,7 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
setState(() {
counts -= 1;
});
reduce(miNiDetail, selectSkus);
// reduce(miNiDetail, selectSkus);
});
},
child: Icon(
@ -1103,11 +1098,6 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
color: Color(0xFF32A060),
size: 24,
)
// Image.asset(
// "assets/image/reduce.webp",
// width: 22,
// height: 22,
// ),
),
Padding(
padding: EdgeInsets.only(left: 8, right: 8),
@ -1124,7 +1114,7 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
onTap: () {
state(() {
counts += 1;
add(miNiDetail, selectSkus);
// add(miNiDetail, selectSkus);
});
},
child: Icon(
@ -1151,13 +1141,14 @@ class _ShopDetailsPage extends State<ShopDetailsPage> {
callback: () {
state(() {
_addShopCar(miNiDetail, selectSkus, counts);
counts = 1;
Navigator.of(context).pop();
});
},
),
],
),
));
);
});
},
backgroundColor: Colors.transparent,

48
lib/store/store_order.dart

@ -515,12 +515,12 @@ class _StoreOrderPage extends State<StoreOrderPage>
Spacer(),
GestureDetector(
onTap: () {
// if(AppUtils.compareTime(storeInfo.openStartTime,DateFormat('HH:mm:ss').format(DateTime.now()))
// &&(!AppUtils.compareTime(storeInfo.openEndTime,DateFormat('HH:mm:ss').format(DateTime.now())))){
if(AppUtils.compareTime(storeInfo.openStartTime,DateFormat('HH:mm:ss').format(DateTime.now()))
&&(!AppUtils.compareTime(storeInfo.openEndTime,DateFormat('HH:mm:ss').format(DateTime.now())))){
toDownOrder();
// }
// else
// SmartDialog.showToast("营业时间:${storeInfo.openStartTime}-${storeInfo.openEndTime}", alignment: Alignment.center);
}
else
SmartDialog.showToast("营业时间:${storeInfo.openStartTime}-${storeInfo.openEndTime}", alignment: Alignment.center);
},
child: RoundButton(
width: 103.w,
@ -649,6 +649,7 @@ class _StoreOrderPage extends State<StoreOrderPage>
"cid": cid,
"shoppingCart": shopCarGoods,
"numberOfPeople": numberOfPeople,
"distance":widget.arguments["distance"],
},
);
if (tableId > 0) {
@ -737,15 +738,16 @@ class _StoreOrderPage extends State<StoreOrderPage>
_queryMiNiDetail(String id, int count) async {
EasyLoading.show(status: S.current.zhengzaijiazai);
if (count < 0) {
shopCarGoods.shoppingCartSkuItemList.forEach((element) {
shopCarGoods.shoppingCartSkuItemList.forEach((element) async{
if (element.productId == id) {
shopCartReduce(element);
await shopCartReduce(element);
setState(() {});
}
});
return;
}
BaseData<MiNiDetail> baseData = await minService.miNiDetail(id);
EasyLoading.dismiss();
if (baseData != null && baseData.isSuccess) {
showStoreSelector(baseData.data, id, count);
}
@ -758,20 +760,19 @@ class _StoreOrderPage extends State<StoreOrderPage>
} else {
EasyLoading.dismiss();
dialogShowing = true;
SmartDialog.show(
widget: ProductSku(
showModalBottomSheet(
backgroundColor: Colors.transparent,
context: context,
builder: (_) {
return ProductSku(
miNiDetail,
shopCarGoods,
id,
_addShopCar,
add,
reduce,
),
onDismiss: () {
dialogShowing = false;
},
alignmentTemp: Alignment.bottomCenter,
);
});
}
}
@ -822,12 +823,10 @@ class _StoreOrderPage extends State<StoreOrderPage>
},
],
});
EasyLoading.dismiss();
// EasyLoading.dismiss();
if (baseDate != null && baseDate.isSuccess) {
queryShopCar().then((value) {
this.shopCarGoods = value;
this.shopCarGoods = await queryShopCar();
setState(() {});
});
} else {
SmartDialog.showToast(baseDate?.msg, alignment: Alignment.center);
}
@ -917,7 +916,7 @@ class _StoreOrderPage extends State<StoreOrderPage>
if (productSku == null) return;
String skuId = productSku.id;
if (shopCarGoods == null) {
await _addShopCar(miNiDetail, selectSkus, 2);
await _addShopCar(miNiDetail, selectSkus, 1);
return;
}
int shopSkuIndex = shopCarGoods.shoppingCartSkuItemList
@ -932,17 +931,16 @@ class _StoreOrderPage extends State<StoreOrderPage>
.firstWhere((element) => skuId == element.id);
shopCarTemp["shoppingCartSkuItemList"] = [cartSkuItem.toJson()];
} else {
await _addShopCar(miNiDetail, selectSkus, 2);
await _addShopCar(miNiDetail, selectSkus, 1);
return;
}
BaseData<List<ShoppingCart>> baseDate =
await minService.shoppingCartSingle(shopCarTemp);
if (baseDate.isSuccess) {
queryShopCar().then((value) {
this.shopCarGoods = value;
this.shopCarGoods = await queryShopCar();
debugPrint("count.toString()");
setState(() {});
});
}
}
@ -956,7 +954,7 @@ class _StoreOrderPage extends State<StoreOrderPage>
if (productSku == null) return;
String skuId = productSku.id;
if (shopCarGoods == null) {
await _addShopCar(miNiDetail, selectSkus, 2);
await _addShopCar(miNiDetail, selectSkus, 1);
return;
}
ShoppingCartSkuItemListBean shopSkuItem = shopCarGoods
@ -970,7 +968,7 @@ class _StoreOrderPage extends State<StoreOrderPage>
shopCarGoods.shoppingCartSkuItemList[shopSkuIndex].buyNum -= 1;
}
} else {
await _addShopCar(miNiDetail, selectSkus, 2);
await _addShopCar(miNiDetail, selectSkus, 1);
return;
}
shopCarGoods.tableId = "$tableId";

184
lib/store/store_view/product_sku.dart

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -9,24 +10,18 @@ import 'package:huixiang/view_widget/custom_image.dart';
import 'package:huixiang/view_widget/round_button.dart';
class ProductSku extends StatefulWidget {
final MiNiDetail miNiDetail;
final String productId;
final Function(MiNiDetail miNiDetail, List<String> selectSkus, int count) addShopCar;
final Function(MiNiDetail miNiDetail, List<String> selectSkus, int count)
addShopCar;
final Function(MiNiDetail miNiDetail, List<String> selectSkus) add;
final Function(MiNiDetail miNiDetail, List<String> selectSkus) reduce;
final ShoppingCart shopCarGoods;
final int buttonType;
ProductSku(
this.miNiDetail,
this.shopCarGoods,
this.productId,
this.addShopCar,
this.add,
this.reduce,
{ this.buttonType}
);
ProductSku(this.miNiDetail, this.shopCarGoods, this.productId,
this.addShopCar, this.add, this.reduce,
{this.buttonType});
@override
State<StatefulWidget> createState() {
@ -36,8 +31,9 @@ class ProductSku extends StatefulWidget {
class _ProductSku extends State<ProductSku> {
List<String> selectSkus = [];
int count = 1;
int count = 1, realCount = 0;
String selectedPrice = "";
bool _isTapEd = false;
@override
void initState() {
@ -63,10 +59,13 @@ class _ProductSku extends State<ProductSku> {
if (productSku == null) return;
selectedPrice = productSku.skuPrice;
String skuId = productSku.id;
if (widget.shopCarGoods == null || widget.shopCarGoods.shoppingCartSkuItemList == null) return;
int shopSkuIndex = widget.shopCarGoods.shoppingCartSkuItemList.indexWhere((element) => skuId == element.id);
if (widget.shopCarGoods == null ||
widget.shopCarGoods.shoppingCartSkuItemList == null) return;
int shopSkuIndex = widget.shopCarGoods.shoppingCartSkuItemList
.indexWhere((element) => skuId == element.id);
if (shopSkuIndex >= 0) {
count = widget.shopCarGoods.shoppingCartSkuItemList[shopSkuIndex].buyNum;
realCount = count;
}
}
@ -81,13 +80,13 @@ class _ProductSku extends State<ProductSku> {
return gg;
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
debugPrint("ssssasdadsasdadasd");
SmartDialog.dismiss();
// debugPrint("ssssasdadsasdadasd");
// SmartDialog.dismiss();
Navigator.of(context).pop();
return true;
},
child: StatefulBuilder(builder: (context1, state) {
@ -124,7 +123,8 @@ class _ProductSku extends State<ProductSku> {
SizedBox(
width: 10,
),
Expanded(child:Column(
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -141,7 +141,10 @@ class _ProductSku extends State<ProductSku> {
padding: EdgeInsets.only(top: 4, bottom: 7),
child: Text(
"已选: " +
(selectSkus.map((e) => "$e").toList().toString()),
(selectSkus
.map((e) => "$e")
.toList()
.toString()),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
@ -175,8 +178,8 @@ class _ProductSku extends State<ProductSku> {
)),
InkWell(
onTap: () {
// Navigator.of(context).pop();
SmartDialog.dismiss();
Navigator.of(context).pop();
// SmartDialog.dismiss();
},
child: Image.asset(
"assets/image/cancel.webp",
@ -187,11 +190,14 @@ class _ProductSku extends State<ProductSku> {
),
],
),
if (widget.miNiDetail.attrList != null && widget.miNiDetail.attrList.length > 0)
if (widget.miNiDetail.attrList != null &&
widget.miNiDetail.attrList.length > 0)
SizedBox(
height: 10,
),
if (widget.miNiDetail.attrList != null && widget.miNiDetail.attrList.length > 0 && widget.miNiDetail.attrList[0].attrName!="")
if (widget.miNiDetail.attrList != null &&
widget.miNiDetail.attrList.length > 0 &&
widget.miNiDetail.attrList[0].attrName != "")
Expanded(
child: ListView.builder(
itemCount: widget.miNiDetail.attrList.length,
@ -231,12 +237,15 @@ class _ProductSku extends State<ProductSku> {
),
),
InkWell(
onTap: () {
if (count > 1)
setState(() {
onTap: () async {
if(count == 1)
return;
_isTapEd = true;
EasyLoading.show(status: S.current.zhengzaijiazai);
await widget.reduce(widget.miNiDetail, selectSkus);
count -= 1;
});
widget.reduce(widget.miNiDetail, selectSkus);
setState(() {});
EasyLoading.dismiss();
},
child: Image.asset(
"assets/image/reduce.webp",
@ -256,11 +265,17 @@ class _ProductSku extends State<ProductSku> {
),
),
InkWell(
onTap: () {
setState(() {
onTap: () async {
_isTapEd = true;
EasyLoading.show(status: S.current.zhengzaijiazai);
if (count == 1 && realCount == 0)
await widget.addShopCar(
widget.miNiDetail, selectSkus, 2);
else
await widget.add(widget.miNiDetail, selectSkus);
count += 1;
});
widget.add(widget.miNiDetail, selectSkus);
setState(() {});
EasyLoading.dismiss();
},
child: Image.asset(
"assets/image/add.webp",
@ -284,8 +299,9 @@ class _ProductSku extends State<ProductSku> {
backgroup: Color(0xFF32A060),
fontSize: 16.sp,
callback: () {
// Navigator.of(context).pop();
SmartDialog.dismiss();
Navigator.of(context).pop();
// SmartDialog.dismiss();
if (!_isTapEd)
widget.addShopCar(widget.miNiDetail, selectSkus, 1);
},
),
@ -300,18 +316,21 @@ class _ProductSku extends State<ProductSku> {
backgroup: Color(0xFF32A060),
fontSize: 16.sp,
callback: () {
// Navigator.of(context).pop();
SmartDialog.dismiss();
Navigator.of(context).pop();
// SmartDialog.dismiss();
widget.addShopCar(widget.miNiDetail, selectSkus, count);
},
),
///
if (widget.buttonType == 2)
Row(
children: [
Expanded(child: GestureDetector(
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).pushReplacementNamed('/router/group_details');
Navigator.of(context)
.pushReplacementNamed('/router/group_details');
},
child: Container(
alignment: Alignment.center,
@ -350,8 +369,8 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"原价购买",
style: TextStyle(
fontSize: 12.sp,
@ -362,10 +381,13 @@ class _ProductSku extends State<ProductSku> {
],
),
),
),),
Expanded(child: GestureDetector(
),
),
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).popAndPushNamed('/router/bargain_details');
Navigator.of(context)
.popAndPushNamed('/router/bargain_details');
},
child: Container(
alignment: Alignment.center,
@ -408,29 +430,32 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"我要砍价",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.medium,
color: Colors.white,
),
),),
),
),
],
),
)),),
)),
),
],
),
///
if (widget.buttonType == 3)
Row(
children: [
Expanded(child:GestureDetector(
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).popAndPushNamed('/router/group_details');
Navigator.of(context)
.popAndPushNamed('/router/group_details');
},
child: Container(
alignment: Alignment.center,
@ -469,8 +494,8 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"原价购买",
style: TextStyle(
fontSize: 12.sp,
@ -481,10 +506,13 @@ class _ProductSku extends State<ProductSku> {
],
),
),
),),
Expanded(child:GestureDetector(
),
),
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).popAndPushNamed('/router/bargain_details');
Navigator.of(context)
.popAndPushNamed('/router/bargain_details');
},
child: Container(
alignment: Alignment.center,
@ -527,27 +555,32 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"我要秒杀",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.medium,
color: Colors.white,
),
),),
),
),
],
),
)),),
)),
),
],
),
///
if (widget.buttonType == 4)
Row(
children: [
Expanded(child: GestureDetector(
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).popAndPushNamed('/router/group_details');
Navigator.of(context)
.popAndPushNamed('/router/group_details');
},
child: Container(
alignment: Alignment.center,
@ -586,8 +619,8 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"单人购买",
style: TextStyle(
fontSize: 12.sp,
@ -599,9 +632,11 @@ class _ProductSku extends State<ProductSku> {
),
),
)),
Expanded(child:GestureDetector(
Expanded(
child: GestureDetector(
onTap: () {
Navigator.of(context).popAndPushNamed('/router/bargain_details');
Navigator.of(context)
.popAndPushNamed('/router/bargain_details');
},
child: Container(
alignment: Alignment.center,
@ -644,18 +679,20 @@ class _ProductSku extends State<ProductSku> {
],
),
),
Expanded(child:
Text(
Expanded(
child: Text(
"我要开团",
style: TextStyle(
fontSize: 12.sp,
fontWeight: MyFontWeight.medium,
color: Colors.white,
),
),),
),
),
],
),
)),),
)),
),
],
),
SizedBox(
@ -669,7 +706,8 @@ class _ProductSku extends State<ProductSku> {
}
Widget attrItem(Function fc, AttrListBean attrListBean, position) {
if (attrListBean.attrValueList != null && attrListBean.attrValueList.length > 0)
if (attrListBean.attrValueList != null &&
attrListBean.attrValueList.length > 0)
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -727,7 +765,8 @@ class _ProductSku extends State<ProductSku> {
return Wrap(
runSpacing: 10.0,
spacing: 10.0,
children: arrays.take(arrays.length).map<Widget>((AttrValueListBean tag) {
children:
arrays.take(arrays.length).map<Widget>((AttrValueListBean tag) {
return GestureDetector(
onTap: () {
fc(tag.attrValue);
@ -763,5 +802,4 @@ class _ProductSku extends State<ProductSku> {
),
));
}
}

70
lib/store/store_view/shop_goods.dart

@ -94,10 +94,10 @@ class _ShopGoods extends State<ShopGoods> {
Widget build(BuildContext context) {
return Container(
color: Colors.white,
padding: EdgeInsets.only(
right: 16.w,
// bottom: 20.h,
),
// padding: EdgeInsets.only(
// right: 16.w,
// // bottom: 20.h,
// ),
height: 123.h,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
@ -125,7 +125,8 @@ class _ShopGoods extends State<ShopGoods> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
Padding(padding: EdgeInsets.only(right: 16.w),
child: Row(
children: [
Expanded(
child: Text(
@ -156,11 +157,12 @@ class _ShopGoods extends State<ShopGoods> {
// ),
// ),
],
),
),),
SizedBox(
height: 2.h,
),
Row(
Padding(padding: EdgeInsets.only(right: 16.w),
child: Row(
children: [
Expanded(
child: Text(
@ -180,11 +182,12 @@ class _ShopGoods extends State<ShopGoods> {
width: 10,
),
],
),
)),
SizedBox(
height: 7.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
@ -219,23 +222,11 @@ class _ShopGoods extends State<ShopGoods> {
// ),
],
),
Spacer(),
if (!widget.isShopCart &&
(widget.productListBean?.attrStyle ?? 0) == 1)
Stack(
children: [
Container(
margin: EdgeInsets.only(right: 8, top: 4),
child: RoundButton(
// width: 49.w,
text: S.of(context).xuanguige,
textColor: Colors.white,
fontWeight: MyFontWeight.medium,
radius: 3,
backgroup: Color(0xFF32A060),
fontSize: 11.sp,
padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 3.w),
callback: () {
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async{
if(widget.storeInfo.posType.code == "NORMALSTORE"&& widget.tableId == 0){
showDeleteDialog();
}else{
@ -247,6 +238,21 @@ class _ShopGoods extends State<ShopGoods> {
0);
}
},
child:Container(
padding: EdgeInsets.only(right: 16.w),
child: Stack(
children: [
Container(
padding: EdgeInsets.only(left:35.w,top: 4.h,bottom: 4.h,),
margin: EdgeInsets.only(right: 8, top: 4),
child: RoundButton(
text: S.of(context).xuanguige,
textColor: Colors.white,
fontWeight: MyFontWeight.medium,
radius: 3,
backgroup: Color(0xFF32A060),
fontSize: 11.sp,
padding: EdgeInsets.symmetric(vertical: 5.h,horizontal: 3.w),
),
),
Positioned(
@ -266,26 +272,32 @@ class _ShopGoods extends State<ShopGoods> {
),
),
],
),
),)),
if (widget.isShopCart ||
(widget.productListBean?.attrStyle ?? 0) == 0)
InkWell(
onTap: () {
Spacer(),
if (widget.isShopCart ||
(widget.productListBean?.attrStyle ?? 0) == 0)
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async{
if(widget.storeInfo.posType.code == "NORMALSTORE" && widget.tableId == 0){
showDeleteDialog();
}else{
widget.reduce(widget.shoppingCartSkuItemListBean);}
},
child: Container(
padding: EdgeInsets.only(left: 15.w,right: 6.w),
child: Image.asset(
"assets/image/reduce.webp",
width: 22,
height: 22.h,
),
),
),
if (widget.isShopCart ||
(widget.productListBean?.attrStyle ?? 0) == 0)
Container(
width: 30,
alignment: Alignment.center,
child: Text(
"${widget.count}",
@ -299,6 +311,7 @@ class _ShopGoods extends State<ShopGoods> {
if (widget.isShopCart ||
(widget.productListBean?.attrStyle ?? 0) == 0)
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () async{
if(widget.storeInfo.posType.code == "NORMALSTORE" && widget.tableId == 0){
showDeleteDialog();
@ -317,12 +330,15 @@ class _ShopGoods extends State<ShopGoods> {
widget.queryShoppingCart();
}
},
child: Container(
padding: EdgeInsets.only(left: 6.w,right:16.w),
child: Image.asset(
"assets/image/add.webp",
width: 22,
height: 22.h,
),
),
),
],
),
SizedBox(

3
lib/union/union_list.dart

@ -87,7 +87,8 @@ class _UnionList extends State<UnionList> {
arguments: {
"id": widget.storeList[position].id,
"tenant": widget.storeList[position].tenantCode,
"storeName": widget.storeList[position].storeName
"storeName": widget.storeList[position].storeName,
"distance":widget.storeList[position].distance
},
);
}

6
lib/view_widget/activity_poster.dart

@ -22,7 +22,9 @@ class ActivityPoster extends StatefulWidget {
class _ActivityPoster extends State<ActivityPoster> {
@override
Widget build(BuildContext context) {
return Container(
return WillPopScope(
onWillPop: () async => false,
child:Container(
width: double.infinity,
alignment: Alignment.center,
margin: EdgeInsets.only(
@ -69,7 +71,7 @@ class _ActivityPoster extends State<ActivityPoster> {
) )
],
),
);
));
}
/// contentType 0123,4:,5:

Loading…
Cancel
Save