This commit is contained in:
ehaya
2020-05-10 14:09:07 +04:30
parent 66c1e7bf16
commit 158c53e534
192 changed files with 13165 additions and 1 deletions
@@ -0,0 +1,250 @@
import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/cycles.dart';
class CycleAddLabelBox extends StatelessWidget {
const CycleAddLabelBox({
Key key,
@required double deviceBlockSize,
@required this.labelValues,
@required this.labelVals,
@required this.initialLabelValue,
@required this.index,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
final TextEditingController labelValues;
final List<String> labelVals;
final String initialLabelValue;
final int index;
@override
Widget build(BuildContext context) {
return Container(
// color: Colors.blue,
height: 150,
child: Stack(
children: <Widget>[
Container(
padding: EdgeInsets.only(
right: 10,
bottom: 30,
left: 10,
top: 10,
),
decoration: BoxDecoration(
border: Border(
left: BorderSide(color: Colors.black, width: 2),
right: BorderSide(color: Colors.grey),
bottom: BorderSide(color: Colors.grey),
top: BorderSide(color: Colors.grey),
),
),
height: 120,
child: Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 7 * _deviceBlockSize,
),
SizedBox(
width: 4 * _deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
SizedBox(
width: _deviceBlockSize,
),
Text(
'Select Labels Included',
style: TextStyle(
fontSize: 3.5 * _deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w100,
),
),
],
),
Row(
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width -
(40 * _deviceBlockSize),
// height: 30,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
left: _deviceBlockSize,
),
border: InputBorder.none,
),
iconSize: 7 * _deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint: Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(
horizontal: 0),
child: TextFormField(
controller: labelValues,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
bottom: 12,
),
isDense: true,
),
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
),
),
),
isDense: true,
items: labelVals.map((val) {
return new DropdownMenuItem<String>(
value: val,
child: Container(
child: Text(
val,
style: TextStyle(
fontSize: 4 * _deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
Provider.of<CyclesProvider>(context,
listen: false)
.changeLabelVal(val, index);
// setState(() {
// labelValues[index]
// .text = val;
// });
},
),
),
Spacer(),
InkWell(
onTap: () {
scan().then(
(String result) {
if (result == 'cancel') {
print('cancel');
} else if (result == 'error') {
print('error');
} else if (result == 'access') {
print('access');
} else {
print(result);
Provider.of<CyclesProvider>(context,
listen: false)
.changeLabelVal(result, index);
// Navigator.of(context).pushNamed(
// CycleDetailScreen.route,
// arguments: result,
// );
}
},
);
},
child: Container(
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Icon(
FontAwesomeIcons.barcode,
size: 5 * _deviceBlockSize,
color: Colors.white,
),
),
)
],
),
]),
),
],
),
),
),
Positioned(
bottom: 15,
right: 0,
child: InkWell(
onTap: () {
Provider.of<CyclesProvider>(context).addLabelVal();
// setState(
// () {
// curLabelVal += 1;
// TextEditingController lbl =
// new TextEditingController();
// lbl.text = initialLabelValue;
// labelValues.add(lbl);
// },
// );
},
child: Container(
padding: EdgeInsets.all(3),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.deepOrange,
),
child: Icon(
Icons.add,
color: Colors.white,
),
),
),
),
],
),
);
}
Future<String> scan() async {
try {
var barcode = await BarcodeScanner.scan();
if (barcode.type.name == 'Cancelled') {
return 'cancel';
} else if (barcode.type.name == 'Failed') {
return 'error';
}
try {
var id = barcode.rawContent.contains('www.cssd-doc.com')
? barcode.rawContent.split('/')[5]
: barcode.rawContent;
return id;
} catch (_) {
return 'null';
}
} on PlatformException catch (_) {
return 'access';
} catch (_) {
return 'error';
}
}
}
@@ -0,0 +1,77 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
class CycleAddDatePicker extends StatefulWidget {
const CycleAddDatePicker({
Key key,
@required this.dateCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize, super(key: key);
final TextEditingController dateCTRL;
final double _deviceBlockSize;
@override
_CycleAddDatePickerState createState() => _CycleAddDatePickerState();
}
class _CycleAddDatePickerState extends State<CycleAddDatePicker> {
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
var res = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2010, 1),
lastDate: DateTime(2101),
);
if (res != null) {
// dateTimeFrom = res;
setState(
() {
widget.dateCTRL.text = DateFormat('y-M-d').format(res);
// dateValue = DateFormat('y-M-d').format(
// dateTimeFrom,
// ); // baraye tavize makane gharar giri baraye api
},
);
}
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Expanded(
child: TextField(
enabled: false,
controller: widget.dateCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.alignLeft,
size: 7 * widget._deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * widget._deviceBlockSize,
),
labelText: 'Date',
isDense: true,
contentPadding: EdgeInsets.only(
bottom: 7,
right: 3,
left: 3,
),
// border: InputBorder.none,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * widget._deviceBlockSize,
),
),
),
Icon(FontAwesomeIcons.angleDown)
],
),
);
}
}
@@ -0,0 +1,90 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/cycles.dart';
class CycleAddSaveButton extends StatelessWidget {
const CycleAddSaveButton({
Key key,
@required GlobalKey<FormState> form,
@required this.labelValues,
@required this.cycleNumberCTRL,
@required this.dateValue,
@required this.descriptionCTRL,
@required this.striizerIdCTRL,
@required double deviceBlockSize,
}) : _form = form,
_deviceBlockSize = deviceBlockSize,
super(key: key);
final GlobalKey<FormState> _form;
final List<TextEditingController> labelValues;
final TextEditingController cycleNumberCTRL;
final String dateValue;
final TextEditingController descriptionCTRL;
final TextEditingController striizerIdCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
if (!_form.currentState.validate()) {
return;
}
List<String> labels = [];
for (TextEditingController label in labelValues) {
labels.add(label.text);
}
Provider.of<CyclesProvider>(context).createCycleResult(
cycleNumberCTRL.text,
dateValue,
labels,
descriptionCTRL.text,
striizerIdCTRL.text,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Cycle added.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((_) {
Navigator.of(context).pushReplacementNamed(Routes.cycleResultScreen);
});
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
// margin:
// EdgeInsets.symmetric(horizontal: 35, vertical: 15),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.red, Colors.orange],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'SAVE',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,231 @@
import 'package:cssd/models/cycles_models.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class CycleDetailsDataBox extends StatelessWidget {
const CycleDetailsDataBox({
Key key,
@required this.datas,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final CycleDetailObject datas;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(20),
child: ListView(children: <Widget>[
SizedBox(
height: 10,
),
Text(
'CYCLE DETAILS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 10,
),
Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Color.fromRGBO(235, 235, 235, 1),
border: Border(
left: BorderSide(
color: Colors.black54,
width: 2,
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
DateFormat.yMMMd().format(
DateTime.parse(
datas.createDate,
),
),
style: TextStyle(
color: Colors.red,
),
),
Divider(),
Text(
'ID: ${datas.id}',
style: TextStyle(
color: Colors.red,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 30,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Sterilizer ID',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.sterileId.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Cycle Number',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.cycleNumber.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Date',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
DateFormat('d-M-y').format(
DateTime.parse(
datas.date,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Description',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.description.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 30,
),
Text(
'LABELS INCLUDED',
style: TextStyle(
color: Colors.orange,
letterSpacing: 3,
fontWeight: FontWeight.w700,
fontSize: 4.5 * _deviceBlockSize,
),
),
Container(
width: double.infinity,
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 20),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
border: Border.all(
color: Colors.grey,
),
),
child: ListView.separated(
shrinkWrap: true,
itemBuilder: (ctx, index) => RichText(
text: TextSpan(
text: 'Label ID ',
style: TextStyle(color: Colors.grey,fontFamily: 'montserrat',),
// style: DefaultTextStyle.of(context).style,
children: <TextSpan>[
TextSpan(
text: datas.labels[index],
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.orange,
),
),
],
),
),
separatorBuilder: (ctx, index) => Divider(),
itemCount: datas.labels.length,
),
),
SizedBox(height: 50,)
],
),
),
]),
);
}
}
@@ -0,0 +1,85 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
class CycleFilterDatePicker extends StatefulWidget {
const CycleFilterDatePicker({
Key key,
@required this.dateCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final TextEditingController dateCTRL;
final double _deviceBlockSize;
@override
_CycleFilterDatePickerState createState() => _CycleFilterDatePickerState();
}
class _CycleFilterDatePickerState extends State<CycleFilterDatePicker> {
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
var res = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2010, 1),
lastDate: DateTime(2101),
);
if (res != null) {
// dateTimeFrom = res;
setState(
() {
widget.dateCTRL.text = DateFormat('y-M-d').format(res);
// dateValue = DateFormat('y-M-d').format(
// dateTimeFrom,
// ); // baraye tavize makane gharar giri baraye api
},
);
}
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Expanded(
child: TextField(
enabled: false,
controller: widget.dateCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.calendarAlt,
size: 7 * widget._deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * widget._deviceBlockSize,
),
labelText: 'Date',
isDense: true,
contentPadding: EdgeInsets.only(
bottom: 5,
left: 2,
),
// border: InputBorder.none,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * widget._deviceBlockSize,
),
),
),
Icon(FontAwesomeIcons.angleDown)
],
),
// Divider(
// color: Colors.grey,
// )
],
),
);
}
}
@@ -0,0 +1,89 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/cycles.dart';
class CycleFilterSaveButton extends StatelessWidget {
const CycleFilterSaveButton({
Key key,
@required this.hospitalVals,
@required this.hospitalCTRL,
@required this.cycleIdCTRL,
@required this.cycleNumberCTRL,
@required this.striizerIdCTRL,
@required this.dateCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final List<Map<String, String>> hospitalVals;
final TextEditingController hospitalCTRL;
final TextEditingController cycleIdCTRL;
final TextEditingController cycleNumberCTRL;
final TextEditingController striizerIdCTRL;
final TextEditingController dateCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
String hospitalID;
hospitalVals.forEach(
(hospital) {
if (hospital['name'] == hospitalCTRL.text) {
hospitalID = hospital['id'];
}
},
);
Provider.of<CyclesProvider>(context).setFilters(
cycleIdCTRL.text,
cycleNumberCTRL.text,
striizerIdCTRL.text,
hospitalID,
dateCTRL.text,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Filters changed.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((_) {
Navigator.of(context).popAndPushNamed(Routes.cycleResultScreen);
});
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 5,
),
// margin:
// EdgeInsets.symmetric(horizontal: 35, vertical: 15),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.red, Colors.orange],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'FILTER',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,127 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class CycleFilterSelectorBox extends StatefulWidget {
const CycleFilterSelectorBox({
Key key,
@required double deviceBlockSize,
@required this.hospitalCTRL,
@required this.hospitalVals,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
final TextEditingController hospitalCTRL;
final List<Map<String, String>> hospitalVals;
@override
_CycleFilterSelectorBoxState createState() => _CycleFilterSelectorBoxState();
}
class _CycleFilterSelectorBoxState extends State<CycleFilterSelectorBox> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 7 * widget._deviceBlockSize,
),
SizedBox(
width: 4 * widget._deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
SizedBox(
width: widget._deviceBlockSize,
),
Text(
'Package',
style: TextStyle(
fontSize: 3.5 * widget._deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w100,
),
),
],
),
Container(
// height: 30,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
left: widget._deviceBlockSize,
),
border: InputBorder.none,
),
iconSize: 7 * widget._deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint: Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(
horizontal: 0,
),
child: TextFormField(
controller: widget.hospitalCTRL,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(bottom: 15),
isDense: true,
),
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
),
),
),
isDense: true,
items: widget.hospitalVals.map((val) {
return new DropdownMenuItem<String>(
value: val['name'],
child: Container(
child: Text(
val['name'],
style: TextStyle(
// color: _mainFontColor,
fontSize: 5 * widget._deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
widget.hospitalCTRL.text = val;
// packageValue[1] = val;
// packageCTRL.text = val;
// packageVals.forEach((package) {
// if (package['name'] == val) {
// packageValue[0] = package['id'];
// }
// });
});
},
),
),
]),
),
],
),
);
}
}
@@ -0,0 +1,45 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class CycleResultBanner extends StatelessWidget {
const CycleResultBanner({
Key key,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return Row(
// crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
'CYCLES',
style: TextStyle(
color: Colors.black,
fontSize: 7 * _deviceBlockSize,
fontWeight: FontWeight.w700,
letterSpacing: 2,
),
),
Spacer(),
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).popAndPushNamed(Routes.cycleFilterScreen);
},
child: Container(
padding: EdgeInsets.all(5),
child: Icon(
FontAwesomeIcons.filter,
size: 7 * _deviceBlockSize,
),
),
),
],
);
}
}
@@ -0,0 +1,139 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/models/cycles_models.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
class CycleItemBox extends StatelessWidget {
final CycleResultObject item;
final String labels;
const CycleItemBox({
Key key,
@required double deviceBlockSize,
this.item,
this.labels,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => Navigator.of(context).pushNamed(
Routes.cycleDetailScreen,
arguments: item.id,
),
child: Card(
elevation: 1,
child: Container(
padding: EdgeInsets.all(10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
padding: const EdgeInsets.all(8.0),
child: Text(
item.id,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
),
SizedBox(
width: 3 * _deviceBlockSize,
),
// Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 50 * _deviceBlockSize,
child: Text(
'Label Included:',
style: TextStyle(
fontSize: 3 * _deviceBlockSize,
color: Colors.grey,
),
),
),
Container(
width: 50 * _deviceBlockSize,
child: Text(
labels,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 3 * _deviceBlockSize,
),
),
),
Container(
width: 50 * _deviceBlockSize,
child: Row(
children: <Widget>[
Text(
'Date:',
style: TextStyle(
color: Colors.grey,
fontSize: 3 * _deviceBlockSize,
),
),
Text(
DateFormat('y-M-d').format(
DateTime.parse(
item.createdAt,
),
),
style: TextStyle(
fontSize: 3 * _deviceBlockSize,
),
),
],
),
)
],
),
Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).pushNamed(
Routes.cycleDetailScreen,
arguments: item.id,
);
// TestDetail(testResultId: item.id.toString());
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Icon(
FontAwesomeIcons.fileAlt,
size: 6 * _deviceBlockSize,
color: Colors.white,
),
),
),
],
)
],
),
],
),
),
),
);
}
}
@@ -0,0 +1,114 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/cycles.dart';
class CycleFilterBaner extends StatelessWidget {
const CycleFilterBaner({
Key key,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
Navigator.of(context).popAndPushNamed(Routes.cycleFilterScreen);
},
child: Chip(
backgroundColor: Colors.black,
label: Text(
'Filters',
style: TextStyle(
color: Colors.white,
),
),
deleteIcon: Icon(
FontAwesomeIcons.filter,
color: Colors.white,
size: 4 * _deviceBlockSize,
),
onDeleted: () {
Navigator.of(context).popAndPushNamed(Routes.cycleFilterScreen);
},
),
);
}
}
class CycleFilterChip extends StatelessWidget {
const CycleFilterChip({
Key key,
@required double deviceBlockSize,
@required String label,
@required String id,
@required String cycleNumber,
@required String sterilizerId,
@required String hospital,
@required String date,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
_id = id,
_cycleNumber = cycleNumber,
_sterilizerId = sterilizerId,
_hospital = hospital,
_date = date,
super(key: key);
final double _deviceBlockSize;
final String _label;
final String _id;
final String _cycleNumber;
final String _sterilizerId;
final String _hospital;
final String _date;
@override
Widget build(BuildContext context) {
return Row(children: <Widget>[
SizedBox(
width: _deviceBlockSize,
),
Chip(
backgroundColor: Colors.black,
label: Text(
_label,
style: TextStyle(
color: Colors.white,
),
),
deleteIcon: Icon(
Icons.close,
color: Colors.white,
),
onDeleted: () {
var cycleProvider = Provider.of<CyclesProvider>(context);
cycleProvider.setFilters(
_id,
_cycleNumber,
_sterilizerId,
_hospital,
_date,
);
// cycle.resetPageNumber();
// cycle.setFilters(
// '',
// cycle.filters.cycleNumber,
// cycle.filters.sterilizerId,
// cycle.filters.hospital,
// cycle.filters.date,
// );
cycleProvider.setLoading();
cycleProvider.getCycleResults().then((_) {
cycleProvider.resetLoading();
});
// _reloadItems();
},
),
]);
}
}
@@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/cycles.dart';
class CycleResultSearchBox extends StatelessWidget {
const CycleResultSearchBox({
Key key,
@required this.searchCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final TextEditingController searchCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return TextField(
onEditingComplete: () {
FocusScope.of(context).unfocus();
},
controller: searchCTRL,
onChanged: (value) {
Provider.of<CyclesProvider>(context, listen: false).search(value);
},
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.search,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Search by cycle ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
);
}
}
+182
View File
@@ -0,0 +1,182 @@
import 'package:cssd/config/routes.dart';
// import 'package:cssd/pages/test_result_screen.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class AppDrawer extends StatelessWidget {
@override
Widget build(BuildContext context) {
return SafeArea(
child: SizedBox(
width: 250,
child: Drawer(
child: Container(
padding: EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.black,
),
child: Column(
children: <Widget>[
ListTile(
leading: CircleAvatar(
backgroundColor: Colors.white,
),
title: Text(
'CSSD',
style: TextStyle(
color: Colors.white,
),
),
),
Divider(
color: Colors.white,
),
InkWell(
onTap: () =>
Navigator.of(context).pushNamed(Routes.myInfoScreen),
child: Container(
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15),
margin: EdgeInsets.only(top: 10),
decoration: BoxDecoration(
gradient:
LinearGradient(colors: [Colors.blue, Colors.green]),
borderRadius: BorderRadius.circular(5),
),
child: Row(
children: <Widget>[
Icon(
Icons.person_outline,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'My Info',
style: TextStyle(
color: Colors.white,
),
)
],
),
),
),
InkWell(
onTap: () =>
Navigator.of(context).pushNamed(Routes.testResultScreen),
child: Container(
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15),
margin: EdgeInsets.only(top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
),
child: Row(
children: <Widget>[
Icon(
Icons.assignment,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'Test Results',
style: TextStyle(
color: Colors.white,
),
)
],
),
),
),
InkWell(
onTap: () {
Navigator.of(context).pushNamed(Routes.labelResultScreen);
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15),
margin: EdgeInsets.only(top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
),
child: Row(
children: <Widget>[
Icon(
FontAwesomeIcons.tag,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'Labels',
style: TextStyle(
color: Colors.white,
),
)
],
),
),
),
InkWell(
onTap: () {
Navigator.of(context).pushNamed(Routes.cycleResultScreen);
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15),
margin: EdgeInsets.only(top: 10),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5),
),
child: Row(
children: <Widget>[
Icon(
Icons.refresh,
color: Colors.white,
),
SizedBox(
width: 10,
),
Text(
'Circles',
style: TextStyle(
color: Colors.white,
),
)
],
),
),
),
Container(
margin: EdgeInsets.only(left: 20),
child: ListTile(
leading: Icon(Icons.phone_bluetooth_speaker),
title: Text('All Test Result'),
dense: true,
),
),
Container(
margin: EdgeInsets.only(left: 20),
child: ListTile(
leading: Icon(Icons.settings),
title: Text('Manage Users'),
dense: true,
),
),
Container(
margin: EdgeInsets.only(left: 20),
child: ListTile(
leading: Icon(Icons.label),
title: Text('Manage Medical Center'),
dense: true,
),
),
],
),
),
elevation: 0,
),
),
);
}
}
+50
View File
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
class InputBox extends StatelessWidget {
const InputBox({
Key key,
@required double deviceBlockSize,
this.lable,
this.initialValue,
this.ico, this.isPass,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
final String lable;
final String initialValue;
final IconData ico;
final bool isPass;
@override
Widget build(BuildContext context) {
return Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
ico,
color: Colors.grey,
),
SizedBox(
width: _deviceBlockSize,
),
Expanded(
child: TextFormField(
decoration: InputDecoration(
isDense: false,
// border: UnderlineInputBorder(),
fillColor: Colors.red,
labelText: lable,
contentPadding: EdgeInsets.all(0),
),
style: TextStyle(
fontSize: 6 * _deviceBlockSize,
),
initialValue: initialValue,
),
),
],
);
}
}
+51
View File
@@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class PageHeader extends StatelessWidget {
const PageHeader({
Key key,
@required double deviceBlockSize,
@required String label,
@required String route,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
_route = route,
super(key: key);
final double _deviceBlockSize;
final String _label;
final String _route;
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Container(
child: Text(
_label,
style: TextStyle(
color: Colors.black,
fontSize: 7 * _deviceBlockSize,
fontWeight: FontWeight.w700,
letterSpacing: 2,
),
),
),
Spacer(),
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).popAndPushNamed(_route);
},
child: Container(
padding: EdgeInsets.all(5),
child: Icon(
FontAwesomeIcons.filter,
size: 7 * _deviceBlockSize,
),
),
),
],
);
}
}
@@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class ConnectionErrorBox extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(
child: Text('Please connect to the Internet ! !'),
);
}
}
+12
View File
@@ -0,0 +1,12 @@
import 'package:flutter/material.dart';
class SplashScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('Loading...'),
),
);
}
}
@@ -0,0 +1,73 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart' as DateEditor;
class LabelAddDatePicker extends StatefulWidget {
LabelAddDatePicker({
Key key,
@required this.dateCTRL,
@required double deviceBlockSize,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
super(key: key);
final TextEditingController dateCTRL;
final double _deviceBlockSize;
final String _label;
@override
_LabelAddDatePickerState createState() => _LabelAddDatePickerState();
}
class _LabelAddDatePickerState extends State<LabelAddDatePicker> {
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
var res = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2010, 1),
lastDate: DateTime(2101),
);
if (res != null) {
setState(
() {
widget.dateCTRL.text = DateEditor.DateFormat('y-M-d').format(res);
// sDateValue =
// DateEditor.DateFormat('y-M-d').format(
// dateTimeS,
// ); // baraye tavize makane gharar giri baraye api
},
);
}
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Expanded(
child: TextField(
enabled: false,
controller: widget.dateCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.calendarAlt,
size: 7 * widget._deviceBlockSize,
),
labelText: widget._label,
isDense: true,
contentPadding: EdgeInsets.only(bottom: 7, right: 3, left: 3),
// border: InputBorder.none,
),
style: TextStyle(
fontWeight: FontWeight.w700,
),
),
),
Icon(FontAwesomeIcons.angleDown)
],
),
);
}
}
@@ -0,0 +1,90 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/labels.dart';
class LabelAddSaveButton extends StatelessWidget {
const LabelAddSaveButton({
Key key,
@required GlobalKey<FormState> form,
@required this.lotNumberCTRL,
@required this.cycleNumberCTRL,
@required this.sDateCTRL,
@required this.packageValue,
@required this.eDateCTRL,
@required this.striizerIdCTRL,
@required double deviceBlockSize,
}) : _form = form,
_deviceBlockSize = deviceBlockSize,
super(key: key);
final GlobalKey<FormState> _form;
final TextEditingController lotNumberCTRL;
final TextEditingController cycleNumberCTRL;
final TextEditingController sDateCTRL;
final List<String> packageValue;
final TextEditingController eDateCTRL;
final TextEditingController striizerIdCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
if (!_form.currentState.validate()) {
return;
}
Provider.of<LabelsProvider>(context).createLabelResult(
lotNumberCTRL.text,
cycleNumberCTRL.text,
sDateCTRL.text,
// sDateValue,
{'id': packageValue[0], 'name': packageValue[1]},
eDateCTRL.text,
// eDateValue,
striizerIdCTRL.text,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Label added.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((_) {
Navigator.of(context).pushReplacementNamed(Routes.labelResultScreen);
});
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
// margin:
// EdgeInsets.symmetric(horizontal: 35, vertical: 15),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.green],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'SAVE',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,141 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class LabelAddSelectorBox extends StatefulWidget {
const LabelAddSelectorBox({
Key key,
@required double deviceBlockSize,
@required this.packageCTRL,
@required this.packageVals,
@required this.packageValue,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
final TextEditingController packageCTRL;
final List<Map<String, String>> packageVals;
final List<String> packageValue;
@override
_LabelAddSelectorBoxState createState() => _LabelAddSelectorBoxState();
}
class _LabelAddSelectorBoxState extends State<LabelAddSelectorBox> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 7 * widget._deviceBlockSize,
),
SizedBox(
width: 4 * widget._deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
SizedBox(
width: widget._deviceBlockSize,
),
Text(
'Package',
style: TextStyle(
fontSize: 3.5 * widget._deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w700),
),
],
),
Container(
// height: 30,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding:
EdgeInsets.only(left: widget._deviceBlockSize),
// border: InputBorder.none,
),
iconSize: 7 * widget._deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint:
Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(horizontal: 0),
child: Text(
widget.packageCTRL.text,
textDirection: TextDirection.rtl,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
fontSize: 5 * widget._deviceBlockSize
),
),),
// Container(
// // width: 100,
// height: 70,
// padding: const EdgeInsets.symmetric(horizontal: 0),
// child: TextFormField(
// controller: widget.packageCTRL,
// decoration: InputDecoration(
// contentPadding: EdgeInsets.only(bottom: 15),
// isDense: true,
// ),
// style: TextStyle(
// fontWeight: FontWeight.w700,
// color: Colors.black,
// fontSize: 5 * widget._deviceBlockSize,
// ),
// ),
// ),
isDense: true,
items: widget.packageVals.map((val) {
return new DropdownMenuItem<String>(
value: val['name'],
child: Container(
child: Text(
val['name'],
style: TextStyle(
// color: _mainFontColor,
fontSize: 4 * widget._deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
widget.packageValue[1] = val;
widget.packageCTRL.text = val;
widget.packageVals.forEach((package) {
if (package['name'] == val) {
widget.packageValue[0] = package['id'];
}
});
});
},
),
),
]),
),
],
),
);
}
}
@@ -0,0 +1,243 @@
import 'package:cssd/models/label_models.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class LabelDetailsDataBox extends StatelessWidget {
const LabelDetailsDataBox({
Key key,
@required this.datas,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final LabelDetailsObject datas;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(20),
child: ListView(children: <Widget>[
SizedBox(
height: 10,
),
Text(
'LABEL DETAILS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 10,
),
Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Color.fromRGBO(235, 235, 235, 1),
border: Border(
left: BorderSide(
color: Colors.black54,
width: 2,
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
DateFormat.yMMMd().format(
DateTime.parse(
datas.createDate,
),
),
style: TextStyle(
color: Colors.red,
),
),
Divider(),
Text(
'ID: ${datas.id}',
style: TextStyle(
color: Colors.red,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 30,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Sterilizer ID',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.sterileId.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Cycle Number',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.cycleNumber.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Lot Number',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.lotNumber.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Sterile Date',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
DateFormat('y-M-d').format(
DateTime.parse(
datas.sterileDate,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Expire Date',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
DateFormat('y-M-d').format(
DateTime.parse(
datas.expireDate,
),
),
style: TextStyle(
fontWeight: FontWeight.w700, color: Colors.red),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Package',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas.package.toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
],
),
),
]),
);
}
}
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
class InfoHeader extends StatelessWidget {
const InfoHeader({
Key key,
@required double deviceBlockSize,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
super(key: key);
final double _deviceBlockSize;
final String _label;
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(
left: 20,
top: 20,
bottom: 10,
right: 20,
),
child: Text(
_label,
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 7 * _deviceBlockSize,
letterSpacing: _deviceBlockSize,
fontWeight: FontWeight.w700,
),
),
);
}
}
@@ -0,0 +1,86 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:cssd/providers/labels.dart';
class LabelFilterSaveButton extends StatelessWidget {
const LabelFilterSaveButton({
Key key,
@required this.hospitalVals,
@required this.hospitalCTRL,
@required this.labelIdCTRl,
@required this.cycleNumberCTRL,
@required this.striizerIdCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final List<Map<String, String>> hospitalVals;
final TextEditingController hospitalCTRL;
final TextEditingController labelIdCTRl;
final TextEditingController cycleNumberCTRL;
final TextEditingController striizerIdCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
String hospitalID;
hospitalVals.forEach(
(hospital) {
if (hospital['name'] == hospitalCTRL.text) {
hospitalID = hospital['id'];
}
},
);
Provider.of<LabelsProvider>(context).setFilters(
labelIdCTRl.text,
cycleNumberCTRL.text,
striizerIdCTRL.text,
hospitalID,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Filters changed.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((_) {
Navigator.of(context).popAndPushNamed(Routes.labelResultScreen);
});
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 5,
),
// margin:
// EdgeInsets.symmetric(horizontal: 35, vertical: 15),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.green],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'FILTER',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,114 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class LabelFilterSelectorBox extends StatefulWidget {
const LabelFilterSelectorBox({
Key key,
@required double deviceBlockSize,
@required this.hospitalCTRL,
@required this.hospitalVals,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
final TextEditingController hospitalCTRL;
final List<Map<String, String>> hospitalVals;
@override
_LabelFilterSelectorBoxState createState() => _LabelFilterSelectorBoxState();
}
class _LabelFilterSelectorBoxState extends State<LabelFilterSelectorBox> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 7 * widget._deviceBlockSize,
),
SizedBox(
width: 4 * widget._deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
Text(
'Hospital',
style: TextStyle(
fontSize: 3.5 * widget._deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w700,
),
),
],
),
Container(
// height: 30,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 0),
border: InputBorder.none,
),
iconSize: 7 * widget._deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint: Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(horizontal: 0),
child: TextFormField(
controller: widget.hospitalCTRL,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(bottom: 15),
isDense: true,
),
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
),
),
),
isDense: true,
items: widget.hospitalVals.map((val) {
return new DropdownMenuItem<String>(
value: val['name'],
child: Container(
child: Text(
val['name'],
style: TextStyle(
// color: _mainFontColor,
fontSize: 4 * widget._deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
widget.hospitalCTRL.text = val;
});
},
),
),
]),
),
],
),
);
}
}
@@ -0,0 +1,126 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/models/label_models.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class LabelItemBox extends StatelessWidget {
final LabelResultObject item;
const LabelItemBox({
Key key,
@required double deviceBlockSize,
this.item,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => Navigator.of(context).pushNamed(
Routes.labelDetailScreen,
arguments: item.id,
),
child: Card(
elevation: 1,
child: Container(
padding: EdgeInsets.all(10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
padding: const EdgeInsets.all(8.0),
child: Text(
item.id,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
),
SizedBox(
width: 3 * _deviceBlockSize,
),
// Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 50 * _deviceBlockSize,
child: Text(
'Package:',
style: TextStyle(
fontSize: 3 * _deviceBlockSize,
color: Colors.grey,
),
),
),
Container(
width: 50 * _deviceBlockSize,
child: Text(
item.package,
overflow: TextOverflow.ellipsis,
),
),
Container(
width: 50 * _deviceBlockSize,
child: Row(
children: <Widget>[
Text(
'Exp:',
style: TextStyle(
color: Colors.grey,
fontSize: 3 * _deviceBlockSize,
),
),
Text(
item.expireDate,
style: TextStyle(
fontSize: 3 * _deviceBlockSize,
),
),
],
),
)
],
),
Spacer(),
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).pushNamed(
Routes.labelDetailScreen,
arguments: item.id,
);
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Icon(
FontAwesomeIcons.fileAlt,
size: 6 * _deviceBlockSize,
color: Colors.white,
),
),
),
],
)
],
),
],
),
),
),
);
}
}
@@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../providers/labels.dart';
class LabelFilterChip extends StatelessWidget {
const LabelFilterChip({
Key key,
@required double deviceBlockSize,
@required String id,
@required String cycleNumber,
@required String sterilizerId,
@required String hospital,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_id = id,
_cycleNumber = cycleNumber,
_sterilizerId = sterilizerId,
_hispotal = hospital,
_label = label,
super(key: key);
final double _deviceBlockSize;
final String _id;
final String _cycleNumber;
final String _sterilizerId;
final String _hispotal;
final String _label;
@override
Widget build(BuildContext context) {
return Row(children: <Widget>[
SizedBox(
width: _deviceBlockSize,
),
Chip(
backgroundColor: Colors.black,
label: Text(
_label,
style: TextStyle(
color: Colors.white,
),
),
deleteIcon: Icon(
Icons.close,
color: Colors.white,
),
onDeleted: () {
var labelProviderObject = Provider.of<LabelsProvider>(context);
labelProviderObject.setFilters(
_id,
_cycleNumber,
_sterilizerId,
_hispotal,
);
labelProviderObject.setLoading();
labelProviderObject.getLabelResults().then((_) {
labelProviderObject.resetLoading();
});
},
),
]);
}
}
@@ -0,0 +1,61 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class LabelFloatingButtons extends StatelessWidget {
const LabelFloatingButtons({
Key key,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).pushNamed(Routes.labelScanScreen);
},
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.black,
),
child: Icon(
FontAwesomeIcons.barcode,
size: 7.1 * _deviceBlockSize,
color: Colors.white,
),
),
),
SizedBox(
width: 2 * _deviceBlockSize,
),
InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).pushReplacementNamed(Routes.labelAddScreen);
},
child: Container(
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.redAccent,
),
child: Icon(
Icons.add,
size: 10 * _deviceBlockSize,
color: Colors.white,
),
),
),
],
);
}
}
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import '../../../providers/labels.dart';
class LabelSearchBox extends StatelessWidget {
const LabelSearchBox({
Key key,
@required this.searchCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final TextEditingController searchCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return TextField(
onEditingComplete: () {
FocusScope.of(context).unfocus();
},
onChanged: (value) {
Provider.of<LabelsProvider>(context, listen: false).search(value);
},
controller: searchCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.search,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Search by lable ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
);
}
}
@@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class LabelScanInputBox extends StatelessWidget {
const LabelScanInputBox({
Key key,
@required this.idCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final TextEditingController idCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return TextFormField(
validator: (val) {
if (val.isEmpty) {
return 'Id required!!';
}
return null;
},
controller: idCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Or enter a label ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
),
focusedBorder: UnderlineInputBorder(
// borderRadius: BorderRadius.only(Radius.circular(4)),
borderSide: BorderSide(
color: Colors.grey,
),
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
);
}
}
@@ -0,0 +1,53 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
class FilterScanSaveButton extends StatelessWidget {
const FilterScanSaveButton({
Key key,
@required GlobalKey<FormState> form,
@required this.idCTRL,
@required double deviceBlockSize,
}) : _form = form, _deviceBlockSize = deviceBlockSize, super(key: key);
final GlobalKey<FormState> _form;
final TextEditingController idCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
if (! _form.currentState.validate()) {
return;
}
Navigator.of(context).pushNamed(
Routes.labelDetailScreen,
arguments: idCTRL.text,
);
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
margin: EdgeInsets.symmetric(horizontal: 20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.green],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'GO!',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,88 @@
import 'package:barcode_scan/barcode_scan.dart';
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class LabelScanBox extends StatelessWidget {
const LabelScanBox({
Key key,
}) : super(key: key);
Future<String> scan() async {
try {
var barcode = await BarcodeScanner.scan();
if (barcode.type.name == 'Cancelled') {
return 'cancel';
} else if (barcode.type.name == 'Failed') {
return 'error';
} // print(barcode.split('/'));
try {
var id = barcode.rawContent.contains('www.cssd-doc.com')
? barcode.rawContent.split('/')[5]
: barcode.rawContent;
return id;
} catch (_) {
return 'null';
}
} on PlatformException catch (_) {
return 'access';
}
catch (_){
return 'error';
}
// } on FormatException {
// setState(() => this.testCode =
// 'null (User returned using the "back"-button before scanning anything. Result)');
// } catch (e) {
// setState(() => this.testCode = 'Unknown error: $e');
// }
// return null;
}
@override
Widget build(BuildContext context) {
final _media = MediaQuery.of(context);
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: 200,
decoration: BoxDecoration(border: Border.all()),
child: Center(
child: Text(
'Please Scan The Label Barcode',
style: TextStyle(
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
fontWeight: FontWeight.w100,
letterSpacing: 3,
),
textAlign: TextAlign.center,
),
),
),
onTap: () {
scan().then(
(String result) {
if (result == 'cancel') {
print('cancel');
} else if (result == 'error') {
print('error');
}
else if(result == 'access'){
print('access');
}
else {
Navigator.of(context).pushNamed(
Routes.labelDetailScreen,
arguments: result,
);
}
},
);
},
);
}
}
+45
View File
@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
class InfoInputBox extends StatelessWidget {
const InfoInputBox({
Key key,
@required this.controller,
@required double deviceBlockSize,
@required String label,
@required IconData icon,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
_icon = icon,
super(key: key);
final TextEditingController controller;
final double _deviceBlockSize;
final String _label;
final IconData _icon;
@override
Widget build(BuildContext context) {
return TextFormField(
controller: controller,
decoration: InputDecoration(
icon: Icon(
_icon,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: _label,
isDense: true,
contentPadding: EdgeInsets.symmetric(vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
);
}
}
@@ -0,0 +1,379 @@
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:meta/meta.dart';
import 'package:multiselect_formfield/multiselect_formfield.dart';
class FormCreator extends StatefulWidget {
const FormCreator({
@required this.form,
@required this.onChanged,
this.padding,
});
final dynamic form;
final double padding;
final ValueChanged<dynamic> onChanged;
@override
_FormCreatorState createState() => _FormCreatorState(form);
}
class _FormCreatorState extends State<FormCreator> {
final dynamic formItems;
DateTime selectedDate = DateTime.now();
int rangeValue;
String selectValue;
Future<Null> _selectDate() async {
final DateTime picked = await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(2015, 8),
lastDate: DateTime(2101));
if (picked != null && picked != selectedDate)
setState(() {
selectedDate = picked;
});
}
List<Widget> jsonToForm() {
List<Widget> listWidgets = List<Widget>();
for (var count = 0; count < formItems.length; count++) {
Map item = formItems[count];
if (item['type'] == "Date") {
selectedDate = formItems[count]['value'];
listWidgets.add(
OutlineButton(
onPressed: () {
_selectDate().then((_) {
formItems[count]['value'] = selectedDate;
_handleChanged();
});
},
child: Text(
'Date: ${selectedDate.year}/${selectedDate.month}/${selectedDate.day}'),
padding: EdgeInsets.symmetric(vertical: 20),
),
);
}
if (item['type'] == "Label") {
listWidgets.add(
Container(
decoration: BoxDecoration(
border: Border.all(),
borderRadius: BorderRadius.circular(30),
color: Colors.black,
),
padding: EdgeInsets.only(top: 20, bottom: 20),
margin: EdgeInsets.only(bottom: 20),
child: Text(
item['name'],
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
);
}
if (item['type'] == "Text") {
listWidgets.add(
Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
decoration: InputDecoration(
labelText: item['name'] ?? "",
border: UnderlineInputBorder(),
contentPadding: EdgeInsets.all(0),
),
initialValue: item['value'] ?? '',
onChanged: (String value) {
formItems[count]['value'] = value;
_handleChanged();
},
),
),
);
}
if (item['type'] == "Range" ||
item['type'] == "Temperature" ||
item['type'] == "Pressure") {
double startValue, endValue;
if (item['type'] == "Range") {
startValue = double.parse(item['options'][0]['title']);
endValue = double.parse(item['options'][1]['title']);
} else {
startValue = item['type'] == "Temperature" ? 0.0 : -1.0;
endValue = item['type'] == "Temperature" ? 200.0 : 3.0;
}
formItems[count]['value'] = formItems[count]['value'] ?? startValue;
int divisions = (endValue - startValue).round();
listWidgets.add(
Padding(
padding: EdgeInsets.only(top: 35),
child: Slider(
min: startValue,
max: endValue,
value: formItems[count]['value'],
label: '${formItems[count]['value'].round()}',
divisions: divisions,
onChanged: (double value) {
setState(() {
formItems[count]['value'] = value;
});
},
semanticFormatterCallback: (double newValue) {
return '${newValue.round()}';
},
),
),
);
}
if (item['type'] == "Time") {
listWidgets.add(
Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(5),
WhitelistingTextInputFormatter.digitsOnly,
// BlacklistingTextInputFormatter.singleLineFormatter,
TextInputFormatter.withFunction(
(TextEditingValue oldValue, TextEditingValue newValue) {
final int newTextLength = newValue.text.length;
int selectionIndex = newValue.selection.end;
int usedSubstringIndex = 0;
final StringBuffer newText = StringBuffer();
if (newTextLength >= 2) {
newText.write(
newValue.text.substring(0, usedSubstringIndex = 2) +
':');
if (newValue.selection.end >= 2) selectionIndex++;
}
// Dump the rest.
if (newTextLength >= usedSubstringIndex)
newText.write(newValue.text.substring(usedSubstringIndex));
return TextEditingValue(
text: newText.toString(),
selection: TextSelection.collapsed(offset: selectionIndex),
);
})
],
keyboardType: TextInputType.datetime,
decoration: InputDecoration(
labelText: item['name'] ?? "",
border: UnderlineInputBorder(),
contentPadding: EdgeInsets.all(0),
),
initialValue: item['value'] ?? '',
onChanged: (String value) {
formItems[count]['value'] = value;
_handleChanged();
},
),
),
);
}
if (item['type'] == "Select") {
var listItems = item['options'] as List<dynamic>;
listWidgets.add(MultiSelectFormField(
autovalidate: false,
titleText: item['name'],
dataSource: listItems,
textField: 'title',
valueField: 'id',
okButtonLabel: 'OK',
cancelButtonLabel: 'CANCEL',
hintText: 'Please choose one or more',
value: item['value'],
onSaved: (value) {
if (value == null) return;
setState(() {
item['value'] = value;
});
_handleChanged();
},
));
// listWidgets.add(
// DropdownButtonFormField<String>(
// items: listItems.map((dynamic value) {
// String stringValue = value['id'].toString();
// String textValue = value['title'].toString();
// return DropdownMenuItem<String>(
// value: stringValue,
// child: Text(textValue),
// );
// }).toList(),
// isDense: true,
// value: item['value'],
// hint: Text(item['name']),
// onChanged: (String value) {
// this.setState(
// () {
// _setInput(item['name'], value);
// formItems[count]['value'] = value;
// _handleChanged();
// },
// );
// },
// ),
// );
}
if (item['type'] == "Radiobutton") {
listWidgets.add(
Container(
margin: EdgeInsets.only(top: 14.0, bottom: 0),
child: Text(
item['name'],
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0),
),
),
);
var valueOrFirst =
formItems[count]['value'] ?? formItems[count]['options'][0]['id'];
for (var i = 0; i < item['options'].length; i++) {
var isSelected = formItems[count]['options'][i]['id'] == valueOrFirst;
formItems[count]['value'] = valueOrFirst;
listWidgets.add(
RadioListTile<int>(
dense: true,
controlAffinity: ListTileControlAffinity.trailing,
title: Text(formItems[count]['options'][i]['title']),
value: formItems[count]['options'][i]['id'],
selected: isSelected,
groupValue: formItems[count]['value'],
onChanged: (int value) {
this.setState(
() {
_setInput(item['name'], value.toString());
formItems[count]['value'] = value;
_handleChanged();
},
);
},
),
);
}
}
if (item['type'] == "Switch") {
listWidgets.add(SwitchListTile(
activeColor: Colors.green,
inactiveTrackColor: Colors.red.withAlpha(150),
inactiveThumbColor: Colors.red,
title: Text(item['name']),
value: item['value'] ?? false,
onChanged: (bool value) {
this.setState(() {
formItems[count]['value'] = value;
_handleChanged();
});
}));
}
if (item['type'] == "Form") {
listWidgets.add(
Container(
margin: EdgeInsets.symmetric(vertical: 10),
decoration: BoxDecoration(border: Border.all()),
child: Column(
children: <Widget>[
Container(
margin: EdgeInsets.only(top: 10),
child: Text(
item['name'],
style:
TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0),
),
),
FormCreator(
form: item['children'],
padding: 4,
onChanged: (value) {
// _handleChanged();
},
),
],
),
),
);
}
if (item['type'] == "Checkbox") {
formItems[count]['value'] = formItems[count]['value'] ?? [];
listWidgets.add(
Container(
margin: EdgeInsets.only(top: 14.0, bottom: 0),
child: Text(
item['name'],
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0),
),
),
);
for (var i = 0; i < item['options'].length; i++) {
listWidgets.add(
CheckboxListTile(
title: Text(formItems[count]['options'][i]['title']),
value: (formItems[count]['value'] ?? [])
.contains(formItems[count]['options'][i]['id']),
onChanged: (bool value) {
this.setState(
() {
setState(() {
if (value) {
(formItems[count]['value'] as List)
.add(formItems[count]['options'][i]['id']);
} else {
(formItems[count]['value'] as List)
.remove(formItems[count]['options'][i]['id']);
}
});
_handleChanged();
},
);
},
),
);
}
}
// listWidgets.add(
// TestResultAddSaveButton(
// deviceBlockSize: null,
// ),
// );
}
return listWidgets;
}
_FormCreatorState(this.formItems);
void _handleChanged() {
widget.onChanged(formItems);
}
void _setInput(String key, String value) {}
@override
Widget build(BuildContext context) {
return ListView.builder(
padding: EdgeInsets.all(widget.padding ?? 16.0),
itemCount: jsonToForm().length,
itemBuilder: (context, index) {
return jsonToForm()[index];
},
shrinkWrap: true,
controller: ScrollController(keepScrollOffset: false),
);
}
}
@@ -0,0 +1,56 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
class TestResultAddSaveButton extends StatelessWidget {
const TestResultAddSaveButton({
Key key,
// @required GlobalKey<FormState> form,
// @required this.idCTRL,
@required double deviceBlockSize,
}) :
// _form = form,
_deviceBlockSize = deviceBlockSize,
super(key: key);
// final GlobalKey<FormState> _form;
// final TextEditingController idCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
// if (! _form.currentState.validate()) {
// return;
// }
Navigator.of(context).pushNamed(
Routes.labelDetailScreen,
// arguments: idCTRL.text,
);
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
margin: EdgeInsets.symmetric(horizontal: 20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.green],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'GO!',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
);
}
}
@@ -0,0 +1,130 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class TestResultAddSelectorBox extends StatefulWidget {
const TestResultAddSelectorBox({
Key key,
@required double deviceBlockSize,
@required this.dataCTRL,
@required this.dataVals,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
super(key: key);
final double _deviceBlockSize;
final TextEditingController dataCTRL;
final List<String> dataVals;
final String _label;
@override
_TestResultAddSelectorBoxState createState() =>
_TestResultAddSelectorBoxState();
}
class _TestResultAddSelectorBoxState extends State<TestResultAddSelectorBox> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 6 * widget._deviceBlockSize,
),
SizedBox(
width: 4 * widget._deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
Text(
widget._label,
style: TextStyle(
fontSize: 3 * widget._deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w100,
),
),
],
),
Container(
height: 40,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 0),
// border: InputBorder.none,
),
iconSize: 7 * widget._deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint: Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(horizontal: 0),
child: Text(
widget.dataCTRL.text,
// textDirection: TextDirection.rtl,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
fontSize: 4 * widget._deviceBlockSize,
),
),
// TextFormField(
// controller: widget.dataCTRL,
// decoration: InputDecoration(
// contentPadding: EdgeInsets.only(bottom: 15),
// isDense: true,
// ),
// style: TextStyle(
// fontWeight: FontWeight.w700,
// color: Colors.black,
// ),
// // minLines: 1,
// // maxLines: 3,
// ),
),
isDense: true,
items: widget.dataVals.map((val) {
return new DropdownMenuItem<String>(
value: val,
child: Container(
child: Text(
val,
style: TextStyle(
// color: _mainFontColor,
fontSize: 4 * widget._deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
widget.dataCTRL.text = val;
});
},
),
),
]),
),
],
),
);
}
}
@@ -0,0 +1,228 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class DatasBox extends StatelessWidget {
const DatasBox({
Key key,
@required this.datas,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final Map<String, Object> datas;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(20),
child: Container(
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
color: Color.fromRGBO(230, 230, 230, 1),
border: Border(
left: BorderSide(
color: Colors.pink,
width: 2,
),
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
DateFormat.yMMMd().format(
DateTime.parse(
datas['date'],
),
),
style: TextStyle(
color: Colors.red,
),
),
Divider(),
Text(
datas['test_type_name'],
style: TextStyle(
color: Colors.red,
fontWeight: FontWeight.w700,
),
),
SizedBox(
height: 30,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'CSSD ID',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas['id'].toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Autocleave ID',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas['auto_cleave_id'].toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Test Code',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas['test_code'].toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Date',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
DateFormat('d-M-y').format(
DateTime.parse(
datas['date'],
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Status',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas['verified'] == 'NotVerified'
? 'Rejected'
: 'Verified',
style: TextStyle(
fontWeight: FontWeight.w700,
color: datas['verified'] == 'NotVerified'
? Colors.red
: Colors.blueAccent,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
SizedBox(
height: 5,
),
Row(
children: <Widget>[
Container(
width: 35 * _deviceBlockSize,
child: Text(
'Description',
style: TextStyle(
color: Colors.grey,
),
),
),
Container(
width: 45 * _deviceBlockSize,
child: Text(
datas['description'].toString(),
style: TextStyle(
fontWeight: FontWeight.w700,
),
overflow: TextOverflow.clip,
),
),
],
),
Divider(),
],
),
),
);
}
}
@@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart' as DateEditor;
class TestResultFilterDatePicker extends StatefulWidget {
TestResultFilterDatePicker({
Key key,
@required this.dateCTRL,
@required double deviceBlockSize,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
super(key: key);
final TextEditingController dateCTRL;
final double _deviceBlockSize;
final String _label;
@override
_TestResultFilterDatePickerState createState() => _TestResultFilterDatePickerState();
}
class _TestResultFilterDatePickerState extends State<TestResultFilterDatePicker> {
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () async {
var res = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2010, 1),
lastDate: DateTime(2101),
);
if (res != null) {
setState(
() {
widget.dateCTRL.text = DateEditor.DateFormat('y-M-d').format(res);
// sDateValue =
// DateEditor.DateFormat('y-M-d').format(
// dateTimeS,
// ); // baraye tavize makane gharar giri baraye api
},
);
}
},
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Expanded(
child: TextField(
enabled: false,
controller: widget.dateCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.calendarAlt,
size: 7 * widget._deviceBlockSize,
),
labelText: widget._label,
isDense: true,
contentPadding: EdgeInsets.only(bottom: 12, right: 3, left: 3),
// border: InputBorder.none,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * widget._deviceBlockSize,
),
),
),
Icon(FontAwesomeIcons.angleDown)
],
),
);
}
}
@@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class DropDownBox extends StatefulWidget {
DropDownBox({
Key key,
@required this.values,
}) : super(key: key);
final List<String> values;
@override
_DropDownBoxState createState() => _DropDownBoxState();
}
class _DropDownBoxState extends State<DropDownBox> {
String _curValue;
@override
void initState() {
_curValue = widget.values[0];
super.initState();
}
@override
Widget build(BuildContext context) {
// _curValue = widget.values[0];
// final ThemeData _theme = Theme.of(context);
// final Color _mainFontColor = _theme.textSelectionColor;
final _media = MediaQuery.of(context);
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Row(
// width: double.infinity,
children: <Widget>[
Icon(
FontAwesomeIcons.sortNumericDown,
color: Colors.grey,
size: 4 * _deviceBlockSize,
),
SizedBox(
width: _deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: DropdownButton(
focusColor: Colors.red,
icon: Icon(FontAwesomeIcons.angleDown),
isExpanded: true,
hint: Padding(
padding: const EdgeInsets.symmetric(horizontal: 4),
child: Text(
_curValue,
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
// color: _mainFontColor,
fontSize: 3.5 * _deviceBlockSize,
),
),
),
isDense: true,
items: widget.values.map((String value) {
return new DropdownMenuItem<String>(
value: value,
child: Container(
child: Text(
value,
style: TextStyle(
// color: _mainFontColor,
fontSize: 4 * _deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
_curValue = val;
});
},
),
),
]);
}
}
@@ -0,0 +1,130 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class TestResultFilterSelectorBox extends StatefulWidget {
const TestResultFilterSelectorBox({
Key key,
@required double deviceBlockSize,
@required this.dataCTRL,
@required this.dataVals,
@required String label,
}) : _deviceBlockSize = deviceBlockSize,
_label = label,
super(key: key);
final double _deviceBlockSize;
final TextEditingController dataCTRL;
final List<String> dataVals;
final String _label;
@override
_TestResultFilterSelectorBoxState createState() =>
_TestResultFilterSelectorBoxState();
}
class _TestResultFilterSelectorBoxState
extends State<TestResultFilterSelectorBox> {
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 5),
// height: 65,
child: Row(
// width: double.infinity,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
FontAwesomeIcons.alignLeft,
color: Colors.grey,
size: 7 * widget._deviceBlockSize,
),
SizedBox(
width: 4 * widget._deviceBlockSize,
),
Expanded(
// width: MediaQuery.of(context).size.width - 70,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: <Widget>[
Text(
widget._label,
style: TextStyle(
fontSize: 3.5 * widget._deviceBlockSize,
color: Colors.grey,
fontWeight: FontWeight.w100,
),
),
],
),
Container(
// height: 30,
child: DropdownButtonFormField(
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 0),
// border: InputBorder.none,
),
iconSize: 7 * widget._deviceBlockSize,
icon: Icon(
FontAwesomeIcons.angleDown,
color: Colors.black,
),
isExpanded: true,
hint: Container(
// width: 100,
height: 70,
padding: const EdgeInsets.symmetric(horizontal: 0),
child: Text(
widget.dataCTRL.text,
// textDirection: TextDirection.rtl,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontWeight: FontWeight.w700,
color: Colors.black,
fontSize: 5 * widget._deviceBlockSize),
),
// TextFormField(
// controller: widget.dataCTRL,
// decoration: InputDecoration(
// contentPadding: EdgeInsets.only(bottom: 15),
// isDense: true,
// ),
// style: TextStyle(
// fontWeight: FontWeight.w700,
// color: Colors.black,
// ),
// // minLines: 1,
// // maxLines: 3,
// ),
),
isDense: true,
items: widget.dataVals.map((val) {
return new DropdownMenuItem<String>(
value: val,
child: Container(
child: Text(
val,
style: TextStyle(
// color: _mainFontColor,
fontSize: 4 * widget._deviceBlockSize,
),
),
),
);
}).toList(),
onChanged: (val) {
setState(() {
widget.dataCTRL.text = val;
});
},
),
),
]),
),
],
),
);
}
}
@@ -0,0 +1,34 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
class TestResultAddButton extends StatelessWidget {
const TestResultAddButton({
Key key,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
customBorder: CircleBorder(),
onTap: () {
Navigator.of(context).pushNamed(Routes.testResultAddScreen);
},
child: Container(
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.redAccent,
),
child: Icon(
Icons.add,
size: 10 * _deviceBlockSize,
color: Colors.white,
),
),
);
}
}
@@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../providers/test_results.dart';
class TestResultChip extends StatelessWidget {
const TestResultChip({
Key key,
@required double deviceBlockSize,
@required String label,
@required String id,
@required String labelID,
@required String testType,
@required String hospital,
@required String username,
@required String fDate,
@required String uDate,
}) : _deviceBlockSize = deviceBlockSize,
_id = id,
_labelID = labelID,
_testType = testType,
_hispotal = hospital,
_label = label,
_username = username,
_fDate = fDate,
_uDate = uDate,
super(key: key);
final double _deviceBlockSize;
final String _id;
final String _labelID;
final String _testType;
final String _hispotal;
final String _label;
final String _username;
final String _fDate;
final String _uDate;
@override
Widget build(BuildContext context) {
return Row(children: <Widget>[
SizedBox(
width: _deviceBlockSize,
),
Chip(
backgroundColor: Colors.black,
label: Text(
_label,
style: TextStyle(
color: Colors.white,
),
),
deleteIcon: Icon(
Icons.close,
color: Colors.white,
),
onDeleted: () {
var labelProviderObject = Provider.of<TestResultsProvider>(context);
labelProviderObject.setFilters(
_id,
_labelID,
_username,
_testType,
_hispotal,
_fDate,
_uDate,
);
labelProviderObject.setLoading();
labelProviderObject.getTestResults().then((_) {
labelProviderObject.resetLoading();
});
},
),
]);
}
}
@@ -0,0 +1,33 @@
import 'package:cssd/config/routes.dart';
import 'package:flutter/material.dart';
class TestResultFloatingButton extends StatelessWidget {
const TestResultFloatingButton({
Key key,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
Navigator.of(context).popAndPushNamed(Routes.testResultAddScreen);
},
child: Container(
padding: EdgeInsets.all(5),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Color.fromRGBO(0, 190, 190, 1),
),
child: Icon(
Icons.add,
size: 10 * _deviceBlockSize,
color: Colors.white,
),
),
);
}
}
@@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import '../../../providers/test_results.dart';
class TestResultSearchBox extends StatelessWidget {
const TestResultSearchBox({
Key key,
@required this.searchCTRL,
@required double deviceBlockSize,
}) : _deviceBlockSize = deviceBlockSize,
super(key: key);
final TextEditingController searchCTRL;
final double _deviceBlockSize;
@override
Widget build(BuildContext context) {
return TextField(
onEditingComplete: () {
FocusScope.of(context).unfocus();
},
onChanged: (value) {
Provider.of<TestResultsProvider>(context, listen: false).search(value);
},
controller: searchCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.search,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Search by test name',
isDense: true,
contentPadding: EdgeInsets.symmetric(vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
);
}
}