This commit is contained in:
Sai Naw Wun
2020-10-07 02:33:06 +06:30
parent 01a2798a74
commit 65dda16fe6
475 changed files with 1543 additions and 90780 deletions

View File

@@ -0,0 +1,370 @@
import 'package:fcs/domain/entities/shipment.dart';
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/localization/app_translations.dart';
import 'package:fcs/pages/fcs_shipment/model/fcs_shipment_model.dart';
import 'package:fcs/pages/main/model/main_model.dart';
import 'package:fcs/pages/widgets/label_widgets.dart';
import 'package:fcs/pages/widgets/progress.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import '../main/util.dart';
class FcsShipmentEditor extends StatefulWidget {
final Shipment shipment;
FcsShipmentEditor({this.shipment});
@override
_FcsShipmentEditorState createState() => _FcsShipmentEditorState();
}
class _FcsShipmentEditorState extends State<FcsShipmentEditor> {
var dateFormatter = new DateFormat('dd MMM yyyy');
TextEditingController _shipmentNumberController = new TextEditingController();
TextEditingController _cutoffDateController = new TextEditingController();
TextEditingController _arrivalDateController = new TextEditingController();
TextEditingController _departureDateControler = new TextEditingController();
TextEditingController _consigneeController = new TextEditingController();
TextEditingController _portController = new TextEditingController();
TextEditingController _destinationController = new TextEditingController();
TextEditingController _statusController = new TextEditingController();
TextEditingController _remarkController = new TextEditingController();
Shipment _shipment = new Shipment();
bool _isLoading = false;
String _currentShipment;
@override
void initState() {
super.initState();
if (widget.shipment != null) {
_shipment = widget.shipment;
_shipmentNumberController.text = _shipment.shipmentNumber;
_arrivalDateController.text = dateFormatter.format(_shipment.arrivalDate);
_departureDateControler.text =
dateFormatter.format(_shipment.departureDate);
_statusController.text = _shipment.status;
}
}
@override
void dispose() {
super.dispose();
}
Widget showShipmentNumber(BuildContext context) {
return Container(
padding: EdgeInsets.only(top: 10),
child: Row(
children: <Widget>[
Icon(Icons.text_rotation_none),
Padding(
padding: const EdgeInsets.only(right: 8.0),
child: labeledText(
context, _shipmentNumberController.text, "shipment.number"),
),
],
),
);
}
Widget showShipmentTypes(
BuildContext context, FcsShipmentModel shipmentModel) {
return Row(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Icon(MaterialCommunityIcons.box_shadow),
SizedBox(
width: 10,
),
new Flexible(
child: Container(
width: 200.0,
child: DropdownButton<String>(
value: _currentShipment,
isExpanded: true,
hint: Text(
'Select shipment type',
),
onChanged: changedDropDown,
items: shipmentModel.shipmentType
.map<DropdownMenuItem<String>>((String shipment) {
return new DropdownMenuItem<String>(
value: shipment,
child: new Text(shipment,
style:
new TextStyle(color: Colors.black87, fontSize: 17)),
);
}).toList(),
),
),
),
],
);
}
void changedDropDown(selected) {
setState(() {
_currentShipment = selected;
});
}
@override
Widget build(BuildContext context) {
var shipmentModel = Provider.of<FcsShipmentModel>(context);
final cargoBtn = Container(
padding: EdgeInsets.only(top: 5),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Download Cargo Manifest'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
final commercialBtn = Container(
padding: EdgeInsets.only(top: 20),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Download Commercial Invoice'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
final packingBtn = Container(
padding: EdgeInsets.only(top: 5),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Download Packing List'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
final dmsBtn = Container(
padding: EdgeInsets.only(top: 5),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Download DMS'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
final createBtn = Container(
padding: EdgeInsets.only(top: 20),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Create FCS Shipment'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
final updateBtn = Container(
padding: EdgeInsets.only(top: 5),
child: Align(
alignment: Alignment.bottomCenter,
child: Center(
child: Container(
width: 250,
child: FlatButton(
child: Text('Update FCS Shipment'),
color: primaryColor,
textColor: Colors.white,
onPressed: () {
Navigator.pop(context);
},
),
))),
);
return LocalProgress(
inAsyncCall: _isLoading,
child: Scaffold(
appBar: AppBar(
centerTitle: true,
leading: new IconButton(
icon: new Icon(Icons.close),
onPressed: () => Navigator.of(context).pop(),
),
backgroundColor: primaryColor,
title: Text(AppTranslations.of(context).text("shipment.form.title")),
),
body: Card(
child: Column(
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: ListView(children: <Widget>[
// _showCustomerData(mainModel.customer),
widget.shipment == null
? fcsInput('FCS Shipment Number', Ionicons.ios_airplane,
controller: _shipmentNumberController)
: Container(
child: TextFormField(
controller: _shipmentNumberController,
readOnly: true,
decoration: InputDecoration(
fillColor: Colors.white,
labelText: 'FCS Shipment Number',
labelStyle:
TextStyle(fontSize: 16, color: Colors.grey),
filled: true,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
icon: Icon(
Ionicons.ios_airplane,
color: primaryColor,
),
)),
),
widget.shipment == null
? Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput('Cutoff Date', Icons.date_range,
controller: _cutoffDateController),
)
: Container(),
Container(
padding:
EdgeInsets.only(top: widget.shipment == null ? 5 : 0),
child: fcsInput('ETA', Icons.date_range,
controller: _arrivalDateController),
),
Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput('Departure Date', Icons.date_range,
controller: _departureDateControler),
),
widget.shipment == null
? Container(
padding: EdgeInsets.only(top: 5),
child: DropdownButtonFormField(
decoration: InputDecoration(
fillColor: Colors.white,
labelText: 'FCS Shipment Type',
icon: Icon(Ionicons.ios_airplane,
color: primaryColor)),
items: shipmentModel.shipmentType
.map((e) =>
DropdownMenuItem(child: Text(e), value: e))
.toList(),
onChanged: (selected) => {
setState(() {
_currentShipment = selected;
})
},
),
)
: Container(),
widget.shipment == null
? Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput('Consignee', Icons.work,
controller: _consigneeController),
)
: Container(),
widget.shipment == null
? Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput(
'Port of Loading', FontAwesomeIcons.ship,
controller: _portController),
)
: Container(),
widget.shipment == null
? Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput('Final Destination',
MaterialCommunityIcons.location_enter,
controller: _destinationController),
)
: Container(),
widget.shipment == null
? Container()
: Container(
padding: EdgeInsets.only(top: 5),
child: TextFormField(
controller: _statusController,
cursorColor: primaryColor,
decoration: InputDecoration(
fillColor: Colors.white,
labelText: 'Status',
filled: true,
labelStyle: TextStyle(
fontSize: 16, color: Colors.grey),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: Colors.grey, width: 1.0)),
icon: Icon(Icons.av_timer,
color: primaryColor))),
),
widget.shipment == null
? Container()
: Container(
padding: EdgeInsets.only(top: 5),
child: fcsInput('Remark', MaterialCommunityIcons.note,
controller: _remarkController),
),
widget.shipment == null ? Container() : commercialBtn,
widget.shipment == null ? Container() : packingBtn,
widget.shipment == null ? Container() : dmsBtn,
widget.shipment == null ? Container() : cargoBtn,
widget.shipment == null ? createBtn : updateBtn,
SizedBox(height: 15)
]),
)),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,153 @@
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/localization/app_translations.dart';
import 'package:fcs/pages/fcs_shipment/model/fcs_shipment_model.dart';
import 'package:fcs/pages/widgets/bottom_up_page_route.dart';
import 'package:fcs/pages/widgets/local_text.dart';
import 'package:fcs/pages/widgets/progress.dart';
import 'package:provider/provider.dart';
import 'package:flutter/material.dart';
import 'fcs_shipment_editor.dart';
import 'fcs_shipment_list_row.dart';
class FcsShipmentList extends StatefulWidget {
@override
_FcsShipmentListState createState() => _FcsShipmentListState();
}
class _FcsShipmentListState extends State<FcsShipmentList> {
bool _isLoading = false;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return LocalProgress(
inAsyncCall: _isLoading,
child: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
centerTitle: true,
leading: new IconButton(
icon: new Icon(Icons.close),
onPressed: () => Navigator.of(context).pop(),
),
backgroundColor: primaryColor,
title: LocalText(context, 'shipment.list.title',
color: Colors.white, fontSize: 20),
actions: <Widget>[
IconButton(
icon: Icon(
Icons.search,
color: Colors.white,
),
iconSize: 30,
// onPressed: () => showPlacesSearch(context),
),
],
bottom: TabBar(
unselectedLabelColor: Colors.grey,
tabs: [
Tab(
text: "Upcoming",
),
Tab(text: "Completed"),
Tab(text: "Canceled"),
],
),
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
_newShipment();
},
icon: Icon(Icons.add),
label: Text(AppTranslations.of(context).text("shipment.add")),
backgroundColor: primaryColor,
),
body: TabBarView(
children: [_upComing(), _completed(), _canceled()],
)),
),
);
}
_newShipment() {
Navigator.of(context).push(BottomUpPageRoute(FcsShipmentEditor()));
}
Widget _upComing() {
var shipmentModel = Provider.of<FcsShipmentModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: shipmentModel.upcoming.length,
itemBuilder: (BuildContext context, int index) {
return FcsShipmentListRow(
shipment: shipmentModel.upcoming[index]);
}),
),
],
);
}
Widget _completed() {
var shipmentModel = Provider.of<FcsShipmentModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: shipmentModel.completed.length,
itemBuilder: (BuildContext context, int index) {
return FcsShipmentListRow(
shipment: shipmentModel.completed[index]);
}),
),
],
);
}
Widget _canceled() {
var shipmentModel = Provider.of<FcsShipmentModel>(context);
return Column(
children: <Widget>[
Expanded(
child: new ListView.separated(
separatorBuilder: (context, index) => Divider(
color: Colors.black,
),
scrollDirection: Axis.vertical,
padding: EdgeInsets.only(top: 15),
shrinkWrap: true,
itemCount: shipmentModel.canceled.length,
itemBuilder: (BuildContext context, int index) {
return FcsShipmentListRow(
shipment: shipmentModel.canceled[index]);
}),
),
],
);
}
}

View File

@@ -0,0 +1,95 @@
import 'package:fcs/domain/entities/shipment.dart';
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/widgets/bottom_up_page_route.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:intl/intl.dart';
import 'fcs_shipment_editor.dart';
class FcsShipmentListRow extends StatefulWidget {
final Shipment shipment;
const FcsShipmentListRow({this.shipment});
@override
_FcsShipmentListRowState createState() => _FcsShipmentListRowState();
}
class _FcsShipmentListRowState extends State<FcsShipmentListRow> {
var dateFormatter = new DateFormat('dd MMM yyyy');
final double dotSize = 15.0;
Shipment _shipment = new Shipment();
@override
void initState() {
super.initState();
if (widget.shipment != null) {
_shipment = widget.shipment;
}
}
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(left: 15, right: 15),
child: InkWell(
onTap: () {
Navigator.of(context)
.push(BottomUpPageRoute(FcsShipmentEditor(shipment: _shipment)));
},
child: Row(
children: <Widget>[
Expanded(
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: new Row(
children: <Widget>[
Container(
padding: EdgeInsets.only(left: 5, right: 10),
child: Icon(
Ionicons.ios_airplane,
color: primaryColor,
size: 30,
),
),
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: new Text(
_shipment.shipmentNumber == null
? ''
: _shipment.shipmentNumber,
style: new TextStyle(
fontSize: 15.0, color: Colors.black),
),
),
Padding(
padding: const EdgeInsets.only(left: 10.0, top: 10),
child: new Text(
dateFormatter.format(_shipment.shipDate),
style: new TextStyle(
fontSize: 15.0, color: Colors.grey),
),
)
],
),
),
],
),
),
),
Padding(
padding: const EdgeInsets.all(0),
child: getStatus(_shipment.status),
),
],
),
),
);
}
}

View File

@@ -0,0 +1,84 @@
import 'package:fcs/domain/entities/shipment.dart';
import 'package:fcs/pages/main/model/base_model.dart';
class FcsShipmentModel extends BaseModel {
List<String> shipmentType = ['Air', 'Ship', 'Cargo Truck'];
List<Shipment> shipments = [
Shipment(
shipDate: DateTime(2020, 4, 23),
shipmentNumber: 'A103B',
status: 'In Progress',
arrivalDate: DateTime(2020, 4, 30),
departureDate: DateTime(2020, 4, 23)),
Shipment(
shipDate: DateTime(2020, 4, 2),
shipmentNumber: 'A100A',
status: 'Ready to ship',
arrivalDate: DateTime(2020, 4, 28),
departureDate: DateTime(2020, 4, 15)),
Shipment(
shipDate: DateTime(2020, 4, 2),
shipmentNumber: 'A100B',
status: 'Arrived',
arrivalDate: DateTime(2020, 4, 28),
departureDate: DateTime(2020, 4, 15)),
Shipment(
shipDate: DateTime(2020, 4, 10),
shipmentNumber: 'A102B',
status: 'Canceled',
arrivalDate: DateTime(2020, 4, 20),
departureDate: DateTime(2020, 4, 10)),
Shipment(
shipDate: DateTime(2020, 4, 2),
shipmentNumber: 'A100B',
status: 'Canceled',
arrivalDate: DateTime(2020, 4, 20),
departureDate: DateTime(2020, 4, 23)),
Shipment(
shipDate: DateTime(2020, 4, 10),
shipmentNumber: 'A102B',
status: 'Arrived',
arrivalDate: DateTime(2020, 4, 30),
departureDate: DateTime(2020, 4, 20),
)
];
List<Shipment> get canceled {
List<Shipment> _p = shipments.where((e) => e.status == "Canceled").toList()
..sort((e1, e2) {
return e1.shipDate.compareTo(e2.shipDate);
});
return _p;
}
List<Shipment> get completed {
return shipments.where((e) => e.status == "Arrived").toList()
..sort((e1, e2) {
return e1.shipDate.compareTo(e2.shipDate);
});
}
List<Shipment> get upcoming {
List<Shipment> _shipments = shipments
.where((e) =>
e.status == "In Progress" ||
e.status == "Ready to ship" ||
e.status == "Processed" ||
e.status == "Rescheduled")
.toList();
_shipments.sort((e1, e2) {
return e1.shipDate.compareTo(e2.shipDate);
});
return _shipments;
}
void initUser(user) {
super.initUser(user);
}
@override
logout() async {
shipments = [];
}
}