Merge branch 'development' into Haroon
# Conflicts: # lib/config/config.dartmerge-requests/352/head
commit
2242b78116
@ -0,0 +1,53 @@
|
||||
class ServicePrice {
|
||||
String currency;
|
||||
double maxPrice;
|
||||
double maxTotalPrice;
|
||||
double maxVAT;
|
||||
double minPrice;
|
||||
double minTotalPrice;
|
||||
double minVAT;
|
||||
int price;
|
||||
int totalPrice;
|
||||
int vat;
|
||||
|
||||
ServicePrice({
|
||||
this.currency,
|
||||
this.maxPrice,
|
||||
this.maxTotalPrice,
|
||||
this.maxVAT,
|
||||
this.minPrice,
|
||||
this.minTotalPrice,
|
||||
this.minVAT,
|
||||
this.price,
|
||||
this.totalPrice,
|
||||
this.vat});
|
||||
|
||||
ServicePrice.fromJson(dynamic json) {
|
||||
currency = json["Currency"];
|
||||
maxPrice = json["MaxPrice"];
|
||||
maxTotalPrice = json["MaxTotalPrice"];
|
||||
maxVAT = json["MaxVAT"];
|
||||
minPrice = json["MinPrice"];
|
||||
minTotalPrice = json["MinTotalPrice"];
|
||||
minVAT = json["MinVAT"];
|
||||
price = json["Price"];
|
||||
totalPrice = json["TotalPrice"];
|
||||
vat = json["VAT"];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
var map = <String, dynamic>{};
|
||||
map["Currency"] = currency;
|
||||
map["MaxPrice"] = maxPrice;
|
||||
map["MaxTotalPrice"] = maxTotalPrice;
|
||||
map["MaxVAT"] = maxVAT;
|
||||
map["MinPrice"] = minPrice;
|
||||
map["MinTotalPrice"] = minTotalPrice;
|
||||
map["MinVAT"] = minVAT;
|
||||
map["Price"] = price;
|
||||
map["TotalPrice"] = totalPrice;
|
||||
map["VAT"] = vat;
|
||||
return map;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
import 'package:diplomaticquarterapp/pages/conference/clipped_video.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class RRTAgreementPage extends StatelessWidget{
|
||||
TranslationBase localize;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
localize = TranslationBase.of(context);
|
||||
|
||||
return AppScaffold(
|
||||
appBarTitle: localize.userAgreement,
|
||||
isShowAppBar: true,
|
||||
showHomeAppBarIcon: false,
|
||||
body: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(localize.rrtUserAgreementTitle, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w500, fontSize: 22), maxLines: 100, textAlign: TextAlign.center),
|
||||
SizedBox(height: 20),
|
||||
text(localize.rrtUserAgreementP1),
|
||||
text(localize.rrtUserAgreementP2),
|
||||
text(localize.rrtUserAgreementP3)
|
||||
],
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
Widget text(String string)=> Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 15),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
width: 10, height: 10,
|
||||
decoration: BoxDecoration(borderRadius: BorderRadius.circular(20), color: Colors.black)
|
||||
),
|
||||
SizedBox(width: 20),
|
||||
Expanded(child: Text(string, style: TextStyle(color: Colors.black87, fontSize: 18), maxLines: 100, textAlign: TextAlign.justify)),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
}
|
@ -1,94 +1,54 @@
|
||||
import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart';
|
||||
import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart';
|
||||
import 'package:diplomaticquarterapp/locator.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-order-list-item.dart';
|
||||
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
||||
class RRTLogPage extends StatefulWidget{
|
||||
final List<PrescriptionsOrder> orders;
|
||||
|
||||
const RRTLogPage({this.orders});
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() => RRTLogPageState();
|
||||
|
||||
}
|
||||
class RRTLogPageState extends State<RRTLogPage>{
|
||||
|
||||
RRTViewModel viewModel;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BaseView<RRTViewModel>(
|
||||
onModelReady: (viewModel){
|
||||
|
||||
},
|
||||
builder: (ctx, vm, widget){
|
||||
return BaseView<RRTViewModel>(
|
||||
onModelReady: (vm) => viewModel = vm,
|
||||
builder: (ctx, vm, widgetState){
|
||||
return ListView.builder(
|
||||
itemCount: 10,
|
||||
itemBuilder: (ctx, idx) => RRTLogListItem()
|
||||
);
|
||||
itemCount: widget.orders.length,
|
||||
itemBuilder: (ctx, idx) {
|
||||
var order = widget.orders[idx];
|
||||
return RRTLogListItem(order, onCancel: deleteOrder);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ------------------------
|
||||
// List Item Widget
|
||||
// ------------------------
|
||||
|
||||
|
||||
final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5));
|
||||
|
||||
class RRTLogListItem extends StatelessWidget{
|
||||
BuildContext _context;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_context = context;
|
||||
|
||||
return Container(
|
||||
padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)]
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_contentItem(label: "Request ID", value: "2318"),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: "Status", value: "2318"),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: "Pickup Date", value: "2318"),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: "Location", value: "2318"),
|
||||
_item_content_seperator,
|
||||
SizedBox(height: 10),
|
||||
FractionallySizedBox(child: cancelButton())
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _contentItem({@required String label, String value}){
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),),
|
||||
SizedBox(height: 5,),
|
||||
Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),),
|
||||
],
|
||||
),
|
||||
);
|
||||
deleteOrder(PrescriptionsOrder order) async {
|
||||
GifLoaderDialogUtils.showMyDialog(context);
|
||||
var success = await viewModel.cancelOrder(order);
|
||||
GifLoaderDialogUtils.hideDialog(context);
|
||||
if(success)
|
||||
setState(() {
|
||||
widget.orders.remove(order);
|
||||
});
|
||||
}
|
||||
|
||||
Widget cancelButton() => MaterialButton(
|
||||
height: 45,
|
||||
color: Color(0xFFc5272d),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
||||
onPressed: () { },
|
||||
child: Text("CANCEL", style: TextStyle(color: Colors.white, fontSize: 13),),
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,71 @@
|
||||
|
||||
import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final _item_content_seperator = Container(height: 0.25, padding: EdgeInsets.all(10), color: Colors.grey.withOpacity(0.5));
|
||||
|
||||
class RRTLogListItem extends StatelessWidget{
|
||||
final PrescriptionsOrder order;
|
||||
final Function(PrescriptionsOrder) onCancel;
|
||||
RRTLogListItem(this.order, {this.onCancel});
|
||||
|
||||
BuildContext _context;
|
||||
|
||||
TranslationBase localize;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_context = context;
|
||||
localize = TranslationBase.of(context);
|
||||
|
||||
return Container(
|
||||
padding: EdgeInsets.all(15), margin: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(15),
|
||||
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.25), spreadRadius: 1, blurRadius: 3)]
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
_contentItem(label: localize.reqId, value: order.iD.toString()),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: localize.status, value: order.getStatusName(localize)),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: localize.pickupDate, value: order.getFormattedDateTime()),
|
||||
_item_content_seperator,
|
||||
_contentItem(label: localize.location, value: order.getNearestProjectDescription()),
|
||||
_item_content_seperator,
|
||||
SizedBox(height: 10),
|
||||
|
||||
if(onCancel != null)
|
||||
FractionallySizedBox(child: cancelButton())
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _contentItem({@required String label, String value}){
|
||||
return Container(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label, style: TextStyle(color: Theme.of(_context).appBarTheme.color, fontSize: 9, letterSpacing: 1),),
|
||||
SizedBox(height: 5,),
|
||||
Text(value, style: TextStyle(color: Theme.of(_context).appBarTheme.color,fontWeight: FontWeight.bold, fontSize: 14),),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget cancelButton() => MaterialButton(
|
||||
height: 45,
|
||||
color: Color(0xFFc5272d),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
||||
onPressed: () => onCancel(order),
|
||||
child: Text(localize.cancel, style: TextStyle(color: Colors.white, fontSize: 13),),
|
||||
|
||||
);
|
||||
}
|
@ -0,0 +1,195 @@
|
||||
import 'package:diplomaticquarterapp/core/model/pharmacies/Addresses.dart';
|
||||
import 'package:diplomaticquarterapp/core/viewModels/er/rrt-view-model.dart';
|
||||
import 'package:diplomaticquarterapp/models/rrt/service_price.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart';
|
||||
import 'package:diplomaticquarterapp/pages/ErService/rapid-response-team/rrt-main-screen.dart';
|
||||
import 'package:diplomaticquarterapp/pages/base/base_view.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
|
||||
import 'package:diplomaticquarterapp/uitl/utils.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/dialogs/alert_dialog.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
|
||||
class RRTPlaceOrderPage extends StatelessWidget{
|
||||
TranslationBase localize;
|
||||
RRTViewModel viewModel;
|
||||
Addresses selectedAddress;
|
||||
final ServicePrice servicePrice;
|
||||
|
||||
RRTPlaceOrderPage({@required this.selectedAddress, @required this.servicePrice});
|
||||
|
||||
TextEditingController noteController = TextEditingController(text: '');
|
||||
BuildContext _context;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_context = context;
|
||||
localize = TranslationBase.of(context);
|
||||
var lat = selectedAddress.latLong.split(',').first;
|
||||
var lng = selectedAddress.latLong.split(',').last;
|
||||
|
||||
return BaseView<RRTViewModel>(
|
||||
onModelReady: (vm) => viewModel = vm,
|
||||
builder: (ctx,vm,wState){
|
||||
return AppScaffold(
|
||||
appBarTitle: localize.rapidResponseTeam,
|
||||
isShowAppBar: true,
|
||||
body: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Expanded(
|
||||
child: SingleChildScrollView(
|
||||
padding: EdgeInsets.all(20),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
Text(localize.selectedLocation, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
|
||||
|
||||
selectedAddressField(),
|
||||
|
||||
AspectRatio(
|
||||
aspectRatio: 3/1,
|
||||
child: ClipRRect(
|
||||
clipBehavior: Clip.hardEdge,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
child: Image.network(
|
||||
"https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng &zoom=16&size=800x400&maptype=roadmap&markers=color:red%7C$lat,$lng&key=AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8",
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(height: 10,),
|
||||
|
||||
Container(
|
||||
height: 70,
|
||||
margin: EdgeInsets.symmetric(vertical: 5),
|
||||
padding: EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white, borderRadius: BorderRadius.circular(10),
|
||||
boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))]
|
||||
),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(localize.totalAmountPayable, style: TextStyle(fontSize: 13),),
|
||||
SizedBox(height: 5,),
|
||||
Text("${servicePrice.totalPrice ?? '- - -'} ${localize.sar}" , style: TextStyle(fontWeight: FontWeight.bold, fontSize: 18),),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
height: 70,
|
||||
margin: EdgeInsets.symmetric(vertical: 5),
|
||||
padding: EdgeInsets.symmetric(horizontal: 0, vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white, borderRadius: BorderRadius.circular(10),
|
||||
boxShadow: [BoxShadow(blurRadius: 5, spreadRadius: 2, offset: Offset(2,2), color: Colors.grey.withOpacity(0.25))]
|
||||
),
|
||||
child: TextField(
|
||||
controller: noteController,
|
||||
style: TextStyle(fontSize: 18.0),
|
||||
decoration: InputDecoration(
|
||||
filled: true,
|
||||
fillColor: Colors.white,
|
||||
labelText: localize.notes,
|
||||
contentPadding: const EdgeInsets.only(left: 14.0, bottom: 8.0, top: 8.0),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.white),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
enabledBorder: UnderlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.white),
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
)
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
submitButton(context)
|
||||
],
|
||||
)
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget selectedAddressField(){
|
||||
var address = "${selectedAddress.address1 ?? ''} ${selectedAddress.address2 ?? ''}";
|
||||
return Container(
|
||||
margin: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Expanded(
|
||||
child: MaterialButton(
|
||||
height: 50, color: Colors.white,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10) ),
|
||||
onPressed: (){},
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(child: Text(address, style: TextStyle(color: Colors.black87, fontSize: 15, letterSpacing: 1))),
|
||||
Icon(Icons.location_on_rounded, size: 30, color: Colors.black,)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget submitButton(BuildContext context){
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(15),
|
||||
child: MaterialButton(
|
||||
height: 50,
|
||||
color: Theme.of(context).appBarTheme.color,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
||||
onPressed: () => placeOrder(),
|
||||
child: Text(localize.submit, style: TextStyle(color: Colors.white, fontSize: 15, letterSpacing: 1),),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
placeOrder() async{
|
||||
if(selectedAddress != null && selectedAddress.latLong != null && selectedAddress.latLong.isNotEmpty && selectedAddress.latLong.split(',').length > 1){
|
||||
GifLoaderDialogUtils.showMyDialog(_context);
|
||||
|
||||
Map<String, dynamic> params = {};
|
||||
var cordinates = selectedAddress.latLong.split(',');
|
||||
var latlng = LatLng(double.parse(cordinates.first), double.parse(cordinates.last));
|
||||
params['Latitude'] = latlng.latitude;
|
||||
params['Longitude'] = latlng.longitude;
|
||||
params['Notes'] = noteController.text;
|
||||
var requestId = await viewModel.createOrder(params);
|
||||
|
||||
GifLoaderDialogUtils.hideDialog(_context);
|
||||
|
||||
if(requestId != null){
|
||||
AlertDialogBox(
|
||||
context: _context,
|
||||
title: '',
|
||||
confirmMessage: localize.rrtOrderSuccessMessage,
|
||||
okText: localize.ok,
|
||||
okFunction: (){
|
||||
AlertDialogBox.closeAlertDialog(_context);
|
||||
gotoRRTRoot();
|
||||
}
|
||||
).showAlertDialog(_context);
|
||||
}
|
||||
}else{
|
||||
AppToast.showErrorToast(message: 'Invalid location selected');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
gotoRRTRoot(){
|
||||
Navigator.popUntil(_context, (route) => Utils.route(route, equalsTo: ErOptions));
|
||||
}
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SelectionDialog<T> extends StatefulWidget{
|
||||
@override
|
||||
State<StatefulWidget> createState() => SelectionDialogState();
|
||||
|
||||
String title;
|
||||
List<T> items;
|
||||
show({@required String title, @required List<T> items}){
|
||||
this.title = title;
|
||||
}
|
||||
}
|
||||
|
||||
class SelectionDialogState extends State<SelectionDialog>{
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(15)),
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(15),
|
||||
child: Text(widget.title,),
|
||||
),
|
||||
|
||||
Container(height: 0.5, color: Colors.grey,),
|
||||
|
||||
ListView.separated(
|
||||
padding: EdgeInsets.all(10),
|
||||
itemCount: widget.items.length,
|
||||
itemBuilder: (ctx,idx) => item(idx),
|
||||
separatorBuilder: (ctx,idx) => Container(height: 0.25, color: Colors.grey.withOpacity(0.7),))
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget item(int idx){
|
||||
var model = widget.items[idx];
|
||||
return Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
height: 20,
|
||||
color: Colors.blue,
|
||||
child: Text(model.toString()),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue