This commit is contained in:
erfan hayat'bakhsh
2020-08-01 14:16:20 +04:30
parent 30f10dca2e
commit e4d29c4e3c
71 changed files with 5018 additions and 2319 deletions
+193 -184
View File
@@ -5,7 +5,7 @@ import 'package:cssd/providers/cycles.dart';
import 'package:cssd/widgets/CycleScreens/Add/add_label_box.dart';
import 'package:cssd/widgets/CycleScreens/Add/date_picker.dart';
import 'package:cssd/widgets/CycleScreens/Add/save_button.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@@ -76,202 +76,211 @@ class _CycleAddScreenState extends State<CycleAddScreen> {
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Cycles'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.cycleResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Cycles'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.cycleResultScreen),
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.cycleResultScreen),
),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'ADD A CYCLE',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 20,
),
TextFormField(
validator: (val) {
if (val.isEmpty) {
return 'Strilizer ID required!';
}
return null;
},
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Strilizer ID',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
validator: (val) {
if (val.isEmpty) {
return 'Cycle number required!';
}
return null;
},
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Cycle Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_descriptionFocosNode);
},
),
SizedBox(
height: 20,
),
Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Text(
'LABELS INCLUDED',
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'ADD A CYCLE',
style: TextStyle(
color: Colors.deepOrange,
letterSpacing: 2,
fontWeight: FontWeight.w700,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 20,
),
TextFormField(
validator: (val) {
if (val.isEmpty) {
return 'Strilizer ID required!';
}
return null;
},
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Strilizer ID',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
),
Consumer<CyclesProvider>(
builder: (ctx, cycleProvider, _) =>
ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (ctx, index) => CycleAddLabelBox(
deviceBlockSize: _deviceBlockSize,
labelValues: cycleProvider.labelValues[index],
labelVals: cycleProvider.labelVals,
initialLabelValue:
cycleProvider.initialLabelValue,
index: index,
SizedBox(
height: 30,
),
TextFormField(
validator: (val) {
if (val.isEmpty) {
return 'Cycle number required!';
}
return null;
},
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Cycle Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
itemCount: cycleProvider.labelValues.length,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_descriptionFocosNode);
},
),
),
CycleAddDatePicker(
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize),
SizedBox(
height: 30,
),
TextFormField(
controller: descriptionCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.alignLeft,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Description',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
SizedBox(
height: 20,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
Container(
margin: EdgeInsets.symmetric(vertical: 10),
child: Text(
'LABELS INCLUDED',
style: TextStyle(
color: Colors.deepOrange,
letterSpacing: 2,
fontSize: 5 * _deviceBlockSize,
),
),
),
Consumer<CyclesProvider>(
builder: (ctx, cycleProvider, _) =>
ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (ctx, index) => CycleAddLabelBox(
deviceBlockSize: _deviceBlockSize,
labelValues: cycleProvider.labelValues[index],
labelVals: cycleProvider.labelVals,
initialLabelValue:
cycleProvider.initialLabelValue,
index: index,
),
itemCount: cycleProvider.labelValues.length,
),
),
keyboardType: TextInputType.multiline,
focusNode: _descriptionFocosNode,
minLines: 1,
maxLines: 5,
),
SizedBox(
height: 70,
),
CycleAddSaveButton(
form: _form,
labelValues: Provider.of<CyclesProvider>(context,
listen: false)
.labelValues,
cycleNumberCTRL: cycleNumberCTRL,
dateValue: dateCTRL.text,
descriptionCTRL: descriptionCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
// DropDownBox(values: ['Washer ID']),
],
CycleAddDatePicker(
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize),
SizedBox(
height: 30,
),
TextFormField(
controller: descriptionCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.alignLeft,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Description',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.multiline,
focusNode: _descriptionFocosNode,
minLines: 1,
maxLines: 5,
),
SizedBox(
height: 70,
),
CycleAddSaveButton(
form: _form,
labelValues: Provider.of<CyclesProvider>(context,
listen: false)
.labelValues,
cycleNumberCTRL: cycleNumberCTRL,
dateValue: dateCTRL.text,
descriptionCTRL: descriptionCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
// DropDownBox(values: ['Washer ID']),
],
),
),
),
)
: ConnectionErrorBox();
}),
)
: ConnectionErrorBox();
}),
),
);
}
}
+1 -1
View File
@@ -2,7 +2,7 @@ import 'package:cssd/models/cycles_models.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/cycles.dart';
import 'package:cssd/widgets/CycleScreens/Details/datas_box.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
+179 -163
View File
@@ -1,16 +1,16 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/models/cycles_models.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/cycles.dart';
import 'package:cssd/widgets/CycleScreens/Filter/date_picker.dart';
import 'package:cssd/widgets/CycleScreens/Filter/save_button.dart';
import 'package:cssd/widgets/CycleScreens/Filter/selector_box.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:flutter/cupertino.dart';
import '../config/routes.dart';
import '../models/cycles_models.dart';
import '../providers/connectivity.dart';
import '../providers/cycles.dart';
import '../widgets/CycleScreens/Filter/date_picker.dart';
import '../widgets/CycleScreens/Filter/save_button.dart';
import '../widgets/CycleScreens/Filter/selector_box.dart';
import '../widgets/Global/internet_error.dart';
class CycleFilterScreen extends StatefulWidget {
// static const route = '/CycleFilterScreen';
@@ -40,7 +40,8 @@ class _CycleFilterScreenState extends State<CycleFilterScreen> {
filters = Provider.of<CyclesProvider>(context, listen: false).filters;
cycleIdCTRL.text = filters.id;
cycleNumberCTRL.text = filters.cycleNumber;
dateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
// dateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
dateCTRL.text = '';
striizerIdCTRL.text = filters.sterilizerId;
// dateValue = DateFormat('y-M-d').format(DateTime.now());
super.initState();
@@ -56,7 +57,12 @@ class _CycleFilterScreenState extends State<CycleFilterScreen> {
(result) {
setState(
() {
hospitalVals = result;
hospitalVals = [
{'id': '', 'name': ''}
];
for (var hospital in result) {
hospitalVals.add(hospital);
}
filters.hospital == ''
? hospitalCTRL.text = hospitalVals[0]['name']
: hospitalVals.forEach(
@@ -82,160 +88,170 @@ class _CycleFilterScreenState extends State<CycleFilterScreen> {
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Cycles'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.cycleResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Cycles'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.cycleResultScreen),
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.cycleResultScreen),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
SizedBox(
height: 20,
),
TextFormField(
controller: cycleIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cycle ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cycle Number',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_strilizerIdFocusNode);
},
),
SizedBox(
height: 30,
),
TextField(
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Strilizer ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _strilizerIdFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.done,
),
SizedBox(
height: 20,
),
CycleFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
hospitalCTRL: hospitalCTRL,
hospitalVals: hospitalVals,
label: 'Hospital',
),
SizedBox(
height: 20,
),
CycleFilterDatePicker(
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 70,
),
CycleFilterSaveButton(
hospitalVals: hospitalVals,
hospitalCTRL: hospitalCTRL,
cycleIdCTRL: cycleIdCTRL,
cycleNumberCTRL: cycleNumberCTRL,
striizerIdCTRL: striizerIdCTRL,
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
],
),
)
: ConnectionErrorBox();
}),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
SizedBox(
height: 20,
),
TextFormField(
controller: cycleIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cycle ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cycle Number',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_strilizerIdFocusNode);
},
),
SizedBox(
height: 30,
),
TextField(
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Strilizer ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _strilizerIdFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.done,
),
SizedBox(
height: 20,
),
CycleFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
hospitalCTRL: hospitalCTRL,
hospitalVals: hospitalVals,
),
SizedBox(
height: 20,
),
CycleFilterDatePicker(
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 70,
),
CycleFilterSaveButton(
hospitalVals: hospitalVals,
hospitalCTRL: hospitalCTRL,
cycleIdCTRL: cycleIdCTRL,
cycleNumberCTRL: cycleNumberCTRL,
striizerIdCTRL: striizerIdCTRL,
dateCTRL: dateCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
],
),
)
: ConnectionErrorBox();
}),
);
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ import 'package:cssd/widgets/CycleScreens/Result/banner.dart';
import 'package:cssd/widgets/CycleScreens/Result/data_box.dart';
import 'package:cssd/widgets/CycleScreens/Result/filter_objects.dart';
import 'package:cssd/widgets/CycleScreens/Result/search_box.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import '../providers/cycles.dart';
+15 -9
View File
@@ -1,12 +1,12 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class CycleScanScreen extends StatefulWidget {
// static const route = '/cycleScanScreen';
@@ -86,10 +86,13 @@ class _CycleScanScreenState extends State<CycleScanScreen> {
} else if (result == 'access') {
print('access');
} else {
Navigator.of(context).pushNamed(
Routes.cycleDetailScreen,
arguments: result,
launch(
'https://cssd-doc.com/Show/Cycle/$result',
);
// Navigator.of(context).pushNamed(
// Routes.cycleDetailScreen,
// arguments: result,
// );
}
},
);
@@ -149,17 +152,20 @@ class _CycleScanScreenState extends State<CycleScanScreen> {
if (!_form.currentState.validate()) {
return;
}
Navigator.of(context).pushNamed(
Routes.cycleDetailScreen,
arguments: idCTRL.text,
launch(
'https://cssd-doc.com/Show/Cycle/${idCTRL.text}',
);
// Navigator.of(context).pushNamed(
// Routes.cycleDetailScreen,
// arguments: idCTRL.text,
// );
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
margin: EdgeInsets.symmetric(horizontal: 20),
margin: EdgeInsets.only(bottom: 50,left: 20,right: 20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.red, Colors.orange],
+198
View File
@@ -0,0 +1,198 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../config/routes.dart';
import '../providers/auth.dart';
import '../providers/connectivity.dart';
import '../widgets/Global/internet_error.dart';
class ForgetPassScreen extends StatefulWidget {
// static const route = '/HomeScreen';
@override
State<StatefulWidget> createState() {
return _ForgetPassScreenState();
}
}
class _ForgetPassScreenState extends State<ForgetPassScreen> {
final _form = GlobalKey<FormState>();
bool _isLoading = false;
final cellNumberController = TextEditingController();
@override
void initState() {
cellNumberController.text = '';
super.initState();
}
@override
void dispose() {
super.dispose();
}
void _showDialog(String message) {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Error'),
content: Text(message),
actions: <Widget>[
FlatButton(
child: Text('Ok'),
onPressed: () {
Navigator.of(ctx).pop();
},
),
],
),
);
}
void _requestCode() async {
if (!_form.currentState.validate()) {
return;
}
_form.currentState.save();
setState(() {
_isLoading = true;
});
// try {
await Provider.of<Auth>(context)
.requestCode(
cellNumberController.text,
)
.then(
(result) {
if (result == 'NotUser') {
_showDialog('User Not Found!!!');
setState(
() {
_isLoading = false;
},
);
} else{
// _showDialog('User or password incorrect!');
Navigator.of(context).popAndPushNamed(Routes.sendCodeScreen);
// setState(
// () {
// _isLoading = false;
// },
// );
}
},
);
}
@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 Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('CSSD'),
),
body: Selector<ConnectivityProvider, String>(
builder: (ctx, value, _) => value != 'offline'
? _isLoading
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 20),
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(vertical: 20),
child: Text(
'FORGET PASSWORD',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
fontWeight: FontWeight.w700,
),
),
),
TextFormField(
validator: (value) {
if (value.isEmpty) {
return 'Cell number is required.';
}
RegExp regExp =
RegExp(r'^09[0,1,2,3,9]{1}[0-9]{8}$');
if (!regExp.hasMatch(value)) {
return 'Enter a valid cell number';
}
return null;
},
controller: cellNumberController,
decoration: InputDecoration(
icon: Icon(
Icons.call,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cell Number',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.phone,
textInputAction: TextInputAction.next,
onSaved: (value) {
cellNumberController.text = value;
},
),
SizedBox(height: 40),
Row(
children: <Widget>[
InkWell(
onTap: () => _requestCode(),
child: Container(
width: 40 * _deviceBlockSize,
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: Text(
'Request Code',
style: TextStyle(color: Colors.white),
),
),
),
Spacer(),
],
),
SizedBox(height: 10),
],
),
)
: ConnectionErrorBox(),
selector: (_, connectivity) => connectivity.conStatus,
),
);
}
}
+28 -20
View File
@@ -1,16 +1,17 @@
import 'package:cssd/pages/cycle_result_screen.dart';
import 'package:cssd/pages/label_result_screen.dart';
// import 'package:cssd/pages/my_test_result.dart';
import 'package:cssd/pages/test_result_screen.dart';
import 'package:cssd/providers/auth.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/drawer.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:double_back_to_close_app/double_back_to_close_app.dart';
import 'package:flutter/material.dart';
import 'package:flutter_phoenix/flutter_phoenix.dart';
import 'package:provider/provider.dart';
import './my_info_screen.dart';
import '../providers/auth.dart';
import '../providers/connectivity.dart';
import '../widgets/Global/drawer.dart';
import '../widgets/Global/internet_error.dart';
import 'cycle_result_screen.dart';
import 'label_result_screen.dart';
import 'test_result_screen.dart';
import 'test_verify_screen.dart';
class HomePage extends StatelessWidget {
// 09338736511
@@ -18,7 +19,8 @@ class HomePage extends StatelessWidget {
// static const route = '/HomeScreen';
@override
Widget build(BuildContext context) {
final userData = Provider.of<Auth>(context).user;
final userData = Provider.of<Auth>(context,listen: false).user;
// print(userData['roles']);
return Scaffold(
resizeToAvoidBottomPadding: false,
drawer: Selector<ConnectivityProvider, String>(
@@ -84,8 +86,8 @@ class HomePage extends StatelessWidget {
child: Container(
margin: EdgeInsets.only(
top: 0, bottom: 10, left: 20, right: 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
margin: EdgeInsets.only(top: 20, bottom: 10),
@@ -134,16 +136,22 @@ class HomePage extends StatelessWidget {
secondLine: 'List, Details & Add a one',
onTap: CycleResultScreen(),
),
userData['roles'].contains('Admin')
// SelectionItem(
// startColor: Color(0xFFA7CCE1),
// endColor: Color(0xFFECF7ED),
// firstLine: 'image',
// secondLine: 'image',
// onTap: CaptureImage(),
// ),
userData['roles'].contains('User')
? Container()
// SelectionItem(
// startColor: Color(0xFFA7CCE1),
// endColor: Color(0xFFECF7ED),
// firstLine: 'TEST TO VERIFY',
// secondLine: 'List, Details & Add a one',
// onTap: TestVerifyScreen(),
// )
: Container(),
: SelectionItem(
startColor: Color(0xFFA7CCE1),
endColor: Color(0xFFECF7ED),
firstLine: 'TEST TO VERIFY',
secondLine: 'List, Details & Add a one',
onTap: TestVerifyScreen(),
),
],
),
),
+191 -180
View File
@@ -1,15 +1,16 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/labels.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/LabelScreens/Add/date_picker.dart';
import 'package:cssd/widgets/LabelScreens/Add/save_button.dart';
import 'package:cssd/widgets/LabelScreens/Add/selector_box.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart' as DateEditor;
import 'package:provider/provider.dart';
import '../config/routes.dart';
import '../providers/connectivity.dart';
import '../providers/labels.dart';
import '../widgets/Global/internet_error.dart';
import '../widgets/LabelScreens/Add/date_picker.dart';
import '../widgets/LabelScreens/Add/save_button.dart';
import '../widgets/LabelScreens/Add/selector_box.dart';
class LabelAddScreen extends StatefulWidget {
// static const route = '/LabelAddScreen';
@@ -75,194 +76,204 @@ class _LabelAddScreenState extends State<LabelAddScreen> {
final _media = MediaQuery.of(context);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Labels'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.labelResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Labels'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.labelResultScreen),
),
onPressed: () => Navigator.of(context).pushReplacementNamed(Routes.labelResultScreen),
),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: Padding(
padding: EdgeInsets.all(20),
child: ListView(
children: <Widget>[
Text(
'ADD A LABEL',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 20,
),
TextFormField(
onChanged: (val) {
setState(() {
lotNumberCTRL.text =
val + ' - ' + cycleNumberCTRL.text;
});
},
validator: (val) {
if (val.isEmpty) {
return 'Strilizer ID required!';
}
return null;
},
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize),
isDense: true,
labelText: 'Strilizer ID',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: Padding(
padding: EdgeInsets.all(20),
child: ListView(
children: <Widget>[
Text(
'ADD A LABEL',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 20,
),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 20,
),
TextFormField(
onChanged: (val) {
setState(
() {
TextFormField(
onChanged: (val) {
setState(() {
lotNumberCTRL.text =
striizerIdCTRL.text + ' - ' + val;
},
);
},
validator: (val) {
if (val.isEmpty) {
return 'Cycle number required!';
}
return null;
},
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
val + ' - ' + cycleNumberCTRL.text;
});
},
validator: (val) {
if (val.isEmpty) {
return 'Strilizer ID required!';
}
return null;
},
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize),
isDense: true,
labelText: 'Strilizer ID',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
isDense: true,
labelText: 'Cycle Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 20,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.done,
),
SizedBox(
height: 20,
),
TextFormField(
readOnly: true,
controller: lotNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
TextFormField(
onChanged: (val) {
setState(
() {
lotNumberCTRL.text =
striizerIdCTRL.text + ' - ' + val;
},
);
},
validator: (val) {
if (val.isEmpty) {
return 'Cycle number required!';
}
return null;
},
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Cycle Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Lot Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.done,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 20,
),
keyboardType: TextInputType.visiblePassword,
),
SizedBox(
height: 20,
),
LabelAddSelectorBox(
deviceBlockSize: _deviceBlockSize,
packageCTRL: packageCTRL,
packageVals: packageVals,
packageValue: packageValue,
),
SizedBox(
height: 10,
),
LabelAddDatePicker(
dateCTRL: sDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Sterile Date',
),
SizedBox(
height: 20,
),
LabelAddDatePicker(
dateCTRL: eDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Sterile Date',
),
SizedBox(
height: 70,
),
LabelAddSaveButton(
form: _form,
lotNumberCTRL: lotNumberCTRL,
cycleNumberCTRL: cycleNumberCTRL,
sDateCTRL: sDateCTRL,
packageValue: packageValue,
eDateCTRL: eDateCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
],
TextFormField(
readOnly: true,
controller: lotNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Lot Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
),
SizedBox(
height: 20,
),
LabelAddSelectorBox(
deviceBlockSize: _deviceBlockSize,
packageCTRL: packageCTRL,
packageVals: packageVals,
packageValue: packageValue,
),
SizedBox(
height: 10,
),
LabelAddDatePicker(
dateCTRL: sDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Sterile Date',
),
SizedBox(
height: 20,
),
LabelAddDatePicker(
dateCTRL: eDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Expire Date',
),
SizedBox(
height: 70,
),
LabelAddSaveButton(
form: _form,
lotNumberCTRL: lotNumberCTRL,
cycleNumberCTRL: cycleNumberCTRL,
sDateCTRL: sDateCTRL,
packageValue: packageValue,
eDateCTRL: eDateCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
],
),
),
),
)
: ConnectionErrorBox();
}),
)
: ConnectionErrorBox();
}),
),
);
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
import 'package:cssd/models/label_models.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/labels.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/LabelScreens/Detail/datas_box.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
+154 -139
View File
@@ -2,7 +2,7 @@ import 'package:cssd/config/routes.dart';
import 'package:cssd/models/label_models.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/labels.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/LabelScreens/Filter/save_button.dart';
import 'package:cssd/widgets/LabelScreens/Filter/selector_box.dart';
import 'package:flutter/material.dart';
@@ -50,7 +50,13 @@ class _LabelFilterScreenState extends State<LabelFilterScreen> {
(result) {
setState(
() {
hospitalVals = result;
hospitalVals = [
{'id': '', 'name': ''}
];
for (var hospital in result) {
hospitalVals.add(hospital);
}
// hospitalVals = result;
filters.hospital == ''
? hospitalCTRL.text = hospitalVals[0]['name']
: hospitalVals.forEach(
@@ -74,154 +80,163 @@ class _LabelFilterScreenState extends State<LabelFilterScreen> {
final _media = MediaQuery.of(context);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Labels'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.labelResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Labels'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.labelResultScreen),
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.labelResultScreen),
),
),
body: Consumer<ConnectivityProvider>(
builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
SizedBox(
height: 20,
),
TextFormField(
controller: labelIdCTRl,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
body: Consumer<ConnectivityProvider>(
builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
SizedBox(
height: 20,
),
TextFormField(
controller: labelIdCTRl,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Label ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelText: 'Label ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Cycle Number',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelText: 'Cycle Number',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_strilizerIdFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_strilizerIdFocusNode);
},
),
SizedBox(
height: 30,
),
TextFormField(
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Strilizer ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelText: 'Strilizer ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
textInputAction: TextInputAction.done,
keyboardType: TextInputType.visiblePassword,
focusNode: _strilizerIdFocusNode,
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 30,
),
textInputAction: TextInputAction.done,
keyboardType: TextInputType.visiblePassword,
focusNode: _strilizerIdFocusNode,
),
SizedBox(
height: 30,
),
LabelFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
hospitalCTRL: hospitalCTRL,
hospitalVals: hospitalVals,
),
SizedBox(
height: 70,
),
LabelFilterSaveButton(
hospitalVals: hospitalVals,
hospitalCTRL: hospitalCTRL,
labelIdCTRl: labelIdCTRl,
cycleNumberCTRL: cycleNumberCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 50,
),
// DropDownBox(values: ['Washer ID']),
],
),
)
: ConnectionErrorBox();
},
LabelFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
hospitalCTRL: hospitalCTRL,
hospitalVals: hospitalVals,
),
SizedBox(
height: 70,
),
LabelFilterSaveButton(
hospitalVals: hospitalVals,
hospitalCTRL: hospitalCTRL,
labelIdCTRl: labelIdCTRl,
cycleNumberCTRL: cycleNumberCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 50,
),
// DropDownBox(values: ['Washer ID']),
],
),
)
: ConnectionErrorBox();
},
),
),
);
}
+1 -1
View File
@@ -1,7 +1,7 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/page_header.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/LabelScreens/Result/data_box.dart';
import 'package:cssd/widgets/LabelScreens/Result/filter_chip_box.dart';
import 'package:cssd/widgets/LabelScreens/Result/floating_buttons.dart';
+1 -1
View File
@@ -1,5 +1,5 @@
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/LabelScreens/Scan/input_box.dart';
import 'package:cssd/widgets/LabelScreens/Scan/save_button.dart';
import 'package:cssd/widgets/LabelScreens/Scan/scan_box.dart';
+303
View File
@@ -0,0 +1,303 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart' as DateEditor;
import 'package:provider/provider.dart';
import '../config/routes.dart';
import '../models/label_models.dart';
import '../providers/connectivity.dart';
import '../providers/labels.dart';
import '../widgets/Global/internet_error.dart';
import '../widgets/LabelScreens/Add/date_picker.dart';
import '../widgets/LabelScreens/Add/selector_box.dart';
import '../widgets/LabelScreens/Add/update_button.dart';
class LabelUpdateScreen extends StatefulWidget {
// static const route = '/LabelUpdateScreen';
@override
_LabelUpdateScreenState createState() => _LabelUpdateScreenState();
}
class _LabelUpdateScreenState extends State<LabelUpdateScreen> {
final _cycleNumberFocusNode = FocusNode();
TextEditingController lotNumberCTRL = new TextEditingController();
TextEditingController cycleNumberCTRL = new TextEditingController();
TextEditingController striizerIdCTRL = new TextEditingController();
TextEditingController sDateCTRL = new TextEditingController();
TextEditingController eDateCTRL = new TextEditingController();
TextEditingController packageCTRL = new TextEditingController();
DateTime dateTimeS;
// String sDateValue;
// String eDateValue;
final _form = GlobalKey<FormState>();
List<Map<String, String>> packageVals = [];
List<String> packageValue = [];
bool isEmpty = false;
bool isInit = true;
LabelDetailsObject datas;
// CycleFilterObject filters;
List<TextEditingController> labelsCTRL = [TextEditingController()];
int curLabelVal = 1;
@override
void initState() {
sDateCTRL.text = DateEditor.DateFormat('y-M-d').format(DateTime.now());
// sDateValue = DateEditor.DateFormat('y-M-d').format(DateTime.now());
eDateCTRL.text = DateEditor.DateFormat('y-M-d').format(DateTime.now());
// eDateValue = DateEditor.DateFormat('y-M-d').format(DateTime.now());
super.initState();
}
@override
void didChangeDependencies() async {
if (isInit) {
var _id = ModalRoute.of(context).settings.arguments;
await Provider.of<LabelsProvider>(context, listen: false)
.showLabelResult(_id.toString())
.then(
(result) {
setState(
() {
// if (result.id == 'null') {
// isEmpty = true;
// }
datas = result;
lotNumberCTRL.text = datas.lotNumber;
cycleNumberCTRL.text = datas.cycleNumber;
striizerIdCTRL.text = datas.sterileId;
sDateCTRL.text = datas.sterileDate;
eDateCTRL.text = datas.expireDate;
packageValue.add(datas.packageId);
packageValue.add(datas.package);
packageCTRL.text = datas.package;
},
);
},
);
Provider.of<LabelsProvider>(context, listen: false)
.getPackageFilters()
.then(
(result) {
setState(
() {
packageVals = result;
isInit = false;
},
);
},
);
}
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
final _media = MediaQuery.of(context);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.labelResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Labels'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context)
.pushReplacementNamed(Routes.labelResultScreen),
),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: Padding(
padding: EdgeInsets.all(20),
child: ListView(
children: <Widget>[
Text(
'Update A LABEL',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
),
),
SizedBox(
height: 20,
),
TextFormField(
onChanged: (val) {
setState(() {
lotNumberCTRL.text =
val + ' - ' + cycleNumberCTRL.text;
});
},
validator: (val) {
if (val.isEmpty) {
return 'Strilizer ID required!';
}
return null;
},
controller: striizerIdCTRL,
decoration: InputDecoration(
icon: Icon(FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize),
isDense: true,
labelText: 'Strilizer ID',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
onFieldSubmitted: (_) {
FocusScope.of(context)
.requestFocus(_cycleNumberFocusNode);
},
),
SizedBox(
height: 20,
),
TextFormField(
onChanged: (val) {
setState(
() {
lotNumberCTRL.text =
striizerIdCTRL.text + ' - ' + val;
},
);
},
validator: (val) {
if (val.isEmpty) {
return 'Cycle number required!';
}
return null;
},
controller: cycleNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Cycle Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
focusNode: _cycleNumberFocusNode,
keyboardType: TextInputType.number,
textInputAction: TextInputAction.done,
),
SizedBox(
height: 20,
),
TextFormField(
readOnly: true,
controller: lotNumberCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 7 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
isDense: true,
labelText: 'Lot Number',
contentPadding: EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.visiblePassword,
),
SizedBox(
height: 20,
),
LabelAddSelectorBox(
deviceBlockSize: _deviceBlockSize,
packageCTRL: packageCTRL,
packageVals: packageVals,
packageValue: packageValue,
),
SizedBox(
height: 10,
),
LabelAddDatePicker(
dateCTRL: sDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Sterile Date',
),
SizedBox(
height: 20,
),
LabelAddDatePicker(
dateCTRL: eDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Expire Date',
),
SizedBox(
height: 70,
),
LabelUpdateButton(
form: _form,
id: datas.id,
lotNumberCTRL: lotNumberCTRL,
cycleNumberCTRL: cycleNumberCTRL,
sDateCTRL: sDateCTRL,
packageValue: packageValue,
eDateCTRL: eDateCTRL,
striizerIdCTRL: striizerIdCTRL,
deviceBlockSize: _deviceBlockSize,
),
SizedBox(
height: 100,
),
],
),
),
)
: ConnectionErrorBox();
}),
),
);
}
}
+4 -2
View File
@@ -1,6 +1,7 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/auth.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
@@ -281,7 +282,8 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
),
onPressed: () {},
onPressed: () => Navigator.of(context)
.pushNamed(Routes.forgetPassScreen),
),
],
),
+25 -5
View File
@@ -1,6 +1,6 @@
// import 'package:cssd/widgets/LabelScreens/LabelDetails/header.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/LabelScreens/Detail/header.dart';
import 'package:cssd/widgets/MyInfo/input_box.dart';
import 'package:flutter/material.dart';
@@ -73,6 +73,7 @@ class _MyInfoScreenState extends State<MyInfoScreen> {
deviceBlockSize: _deviceBlockSize,
label: 'Full Name',
icon: FontAwesomeIcons.sortNumericDown,
inputType: TextInputType.text,
),
SizedBox(
height: 20,
@@ -110,6 +111,7 @@ class _MyInfoScreenState extends State<MyInfoScreen> {
deviceBlockSize: _deviceBlockSize,
label: 'Email Address',
icon: FontAwesomeIcons.envelope,
inputType: TextInputType.emailAddress,
),
SizedBox(
height: 40,
@@ -138,10 +140,28 @@ class _MyInfoScreenState extends State<MyInfoScreen> {
onTap: () async {
await Provider.of<Auth>(context, listen: false)
.setUserData(
user['id'],
usernameCTRL.text,
emailCTRL.text,
);
user['id'],
usernameCTRL.text,
emailCTRL.text,
)
.then(
(value) async => await showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text(
'Info changed successfully.',
),
actions: <Widget>[
FlatButton(
child: Text('Ok'),
onPressed: () {
Navigator.of(ctx).pop();
},
),
],
),
),
);
Navigator.of(context).pop();
},
),
+240
View File
@@ -0,0 +1,240 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import '../providers/auth.dart';
import '../providers/connectivity.dart';
import '../widgets/Global/internet_error.dart';
class RePassScreen extends StatefulWidget {
// static const route = '/HomeScreen';
@override
State<StatefulWidget> createState() {
return _RePassScreenState();
}
}
class _RePassScreenState extends State<RePassScreen> {
final _form = GlobalKey<FormState>();
bool _isLoading = false;
// final cellNumberController = TextEditingController();
final passwordController = new TextEditingController();
final rePasswordController = new TextEditingController();
String token = 'Bearer ';
// String token = 'Bearer ';
bool _hidePass = true;
bool _hideRePass = true;
bool isInit = true;
@override
void didChangeDependencies() {
if (isInit) {
token += ModalRoute.of(context).settings.arguments;
isInit = false;
}
super.didChangeDependencies();
}
Future<void> _showDialog(String message) async{
await showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text(message),
actions: <Widget>[
FlatButton(
child: Text('Ok'),
onPressed: () {
Navigator.of(ctx).pop();
},
),
],
),
);
}
void _sendRePass() async {
if (!_form.currentState.validate()) {
return;
}
_form.currentState.save();
setState(() {
_isLoading = true;
});
await Provider.of<Auth>(context)
.sendRePass(passwordController.text, token)
.then((value) async{
if (value == 'done') {
await _showDialog('Password changed successfully.Now login to your account.');
Navigator.of(context).pop();
}
});
}
@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 Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('CSSD'),
),
body: Selector<ConnectivityProvider, String>(
builder: (ctx, value, _) => value != 'offline'
? _isLoading
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 20),
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(vertical: 20),
child: Text(
'CHANGE PASSWORD',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 6 * _deviceBlockSize,
letterSpacing: 3,
fontWeight: FontWeight.w700,
),
),
),
TextFormField(
validator: (value) {
if (value.isEmpty) {
return 'Password is required.';
}
if (value.length < 8) {
return 'Password at least is 8 characters.';
}
return null;
},
obscureText: _hidePass,
controller: passwordController,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.starOfLife,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Password',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
suffixIcon: InkWell(
child: Icon(FontAwesomeIcons.eye),
onTap: () {
setState(() {
_hidePass = !_hidePass;
});
},
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
textInputAction: TextInputAction.done,
onFieldSubmitted: (_) {
_sendRePass();
},
keyboardType: TextInputType.visiblePassword,
),
SizedBox(
height: 30,
),
TextFormField(
validator: (value) {
if (value.length < 8) {
return 'Password at least is 8 characters.';
}
if (value != passwordController.text) {
return 'Password doesnt match!';
}
return null;
},
obscureText: _hideRePass,
controller: rePasswordController,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.starOfLife,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Confirm Password',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
suffixIcon: InkWell(
child: Icon(FontAwesomeIcons.eye),
onTap: () {
setState(() {
_hideRePass = !_hideRePass;
});
},
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
textInputAction: TextInputAction.done,
onFieldSubmitted: (_) {
_sendRePass();
},
keyboardType: TextInputType.visiblePassword,
),
SizedBox(height: 40),
Row(
children: <Widget>[
InkWell(
onTap: () => _sendRePass(),
child: Container(
width: 40 * _deviceBlockSize,
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: Text(
'Change',
style: TextStyle(
color: Colors.white,
),
textAlign: TextAlign.center,
),
),
),
Spacer(),
],
),
SizedBox(height: 10),
],
),
)
: ConnectionErrorBox(),
selector: (_, connectivity) => connectivity.conStatus,
));
}
}
+196 -184
View File
@@ -1,6 +1,6 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/TestResultScreens/Add/selector_box.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -51,203 +51,215 @@ class _TestResultAddScreenState extends State<TestResultAddScreen> {
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Test Results'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.testResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Test Results'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
// padding: EdgeInsets.all(0),
onPressed: () =>
Navigator.of(context).popAndPushNamed(Routes.testResultScreen),
),
// padding: EdgeInsets.all(0),
onPressed: () =>
Navigator.of(context).popAndPushNamed(Routes.testResultScreen),
),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: ListView(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 20),
children: <Widget>[
Container(
padding: EdgeInsets.only(
top: 10,
),
child: Text(
'ADD A TEST RESULT',
style: TextStyle(
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
fontWeight: FontWeight.w700,
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: ListView(
padding:
EdgeInsets.symmetric(horizontal: 20, vertical: 20),
children: <Widget>[
Container(
padding: EdgeInsets.only(
top: 10,
),
),
),
GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 5, bottom: 30),
padding: EdgeInsets.all(10),
height: 200,
decoration: BoxDecoration(border: Border.all()),
child: Center(
child: Text(
'PLEASE SCAN THE TEST BARCODE',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.grey,
fontSize: 5 * _deviceBlockSize,
fontWeight: FontWeight.w100,
letterSpacing: 3,
),
child: Text(
'ADD A TEST RESULT',
style: TextStyle(
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
fontWeight: FontWeight.w700,
),
),
),
onTap: () {
scan().then(
(String result) {
if (result == 'cancel') {
print('cancel');
} else if (result == 'error') {
print('error');
} else if (result == 'access') {
print('access');
} else {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
uniqueCode: result,
);
},
),
);
}
},
);
},
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 70 * _deviceBlockSize,
child: TestResultAddSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: testTypeCTRL,
dataVals: testTypeVals,
label: 'Choose a Test Type'),
GestureDetector(
child: Container(
margin: EdgeInsets.only(top: 5, bottom: 30),
padding: EdgeInsets.all(10),
height: 200,
decoration: BoxDecoration(border: Border.all()),
child: Center(
child: Text(
'PLEASE SCAN THE TEST BARCODE',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.grey,
fontSize: 5 * _deviceBlockSize,
fontWeight: FontWeight.w100,
letterSpacing: 3,
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text(
'OR',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 7 * _deviceBlockSize,
),
),
SizedBox(
width: 8 * _deviceBlockSize,
),
Container(
width: 50 * _deviceBlockSize,
child: TextFormField(
onChanged: (val) {
if (val != '') {
setState(() {
testTypeCTRL.text = '';
});
} else {
setState(() {
testTypeCTRL.text = testTypeVals[0];
});
}
),
),
onTap: () {
scan().then(
(String result) {
if (result == 'cancel') {
print('cancel');
} else if (result == 'error') {
print('error');
} else if (result == 'access') {
print('access');
} else {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
uniqueCode: result,
);
},
controller: testIdCTRL,
decoration: InputDecoration(
isDense: true,
icon: Icon(
FontAwesomeIcons.sortNumericDown,
),
labelText: 'Enter a Test Code',
labelStyle: TextStyle(
fontSize: 3 * _deviceBlockSize),
contentPadding:
EdgeInsets.only(bottom: 5, top: 5),
),
keyboardType: TextInputType.number,
),
),
],
)
],
),
SizedBox(
width: 5 * _deviceBlockSize,
),
Expanded(
child: Container(
height: 100,
child: FlatButton(
padding: EdgeInsets.all(0),
color: Color(0xFFEB4A64),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
);
}
},
);
},
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
width: 70 * _deviceBlockSize,
child: TestResultAddSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: testTypeCTRL,
dataVals: testTypeVals,
label: 'Choose a Test Type'),
),
child: Text(
'GO',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 6 * _deviceBlockSize,
fontWeight: FontWeight.w700),
),
onPressed: () {
if (testIdCTRL.text != '') {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
uniqueCode: testIdCTRL.text);
},
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Text(
'OR',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 7 * _deviceBlockSize,
),
);
} else if (testTypeCTRL.text != '') {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
name: testTypeCTRL.text,
);
),
SizedBox(
width: 8 * _deviceBlockSize,
),
Container(
width: 50 * _deviceBlockSize,
child: TextFormField(
onChanged: (val) {
if (val != '') {
setState(() {
testTypeCTRL.text = '';
});
} else {
setState(() {
testTypeCTRL.text =
testTypeVals[0];
});
}
},
controller: testIdCTRL,
decoration: InputDecoration(
isDense: true,
icon: Icon(
FontAwesomeIcons.sortNumericDown,
),
labelText: 'Enter a Test Code',
labelStyle: TextStyle(
fontSize: 3 * _deviceBlockSize),
contentPadding: EdgeInsets.only(
bottom: 5, top: 5),
),
keyboardType: TextInputType.number,
),
);
}
// print(testCode);
},
),
),
],
)
],
),
)
],
),
],
)
: ConnectionErrorBox();
}),
SizedBox(
width: 5 * _deviceBlockSize,
),
Expanded(
child: Container(
height: 100,
margin: EdgeInsets.only(bottom: 50),
child: FlatButton(
padding: EdgeInsets.all(0),
color: Color(0xFFEB4A64),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
child: Text(
'GO',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
fontSize: 6 * _deviceBlockSize,
fontWeight: FontWeight.w700),
),
onPressed: () {
if (testIdCTRL.text != '') {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
uniqueCode: testIdCTRL.text);
},
),
);
} else if (testTypeCTRL.text != '') {
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) {
return FormPage(
name: testTypeCTRL.text,
);
},
),
);
}
// print(testCode);
},
),
),
)
],
),
],
)
: ConnectionErrorBox();
}),
),
);
}
+1 -1
View File
@@ -1,6 +1,6 @@
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/test_results.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/TestResultScreens/Details/datas_box.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
+224 -212
View File
@@ -1,16 +1,15 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/models/test_result_models.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/providers/test_results.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/TestResultScreens/Filter/date_picker.dart';
import 'package:cssd/widgets/TestResultScreens/Filter/selector_box.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:flutter/cupertino.dart';
import '../config/routes.dart';
import '../models/test_result_models.dart';
import '../providers/connectivity.dart';
import '../providers/test_results.dart';
import '../widgets/Global/internet_error.dart';
import '../widgets/TestResultScreens/Filter/date_picker.dart';
import '../widgets/TestResultScreens/Filter/selector_box.dart';
class TestFilterScreen extends StatefulWidget {
// static const route = '/TestFilterScreen';
@@ -34,8 +33,9 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
DateTime dateTimeUntil;
final List<String> labelIDVals = [
'',
'Washer ID',
'Autocleave ID',
'Autoclave ID',
'Sterilizer ID',
'Seal Machine ID',
'Patiant ID',
@@ -44,8 +44,8 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
'OR ID',
'Insrtument ID',
'Basket ID',
'Impalent ID',
'None',
'Implant ID',
// 'None',
];
// String curLabelIDVal;
@@ -53,7 +53,7 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
Map<String, String> testTypes;
final List<String> hospitalVals = [];
Map<String, String> hospitals;
Map<String, String> hospitals = {};
// String curhospitalVal;
bool isInit = true;
@@ -71,8 +71,10 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
@override
void didChangeDependencies() {
if (isInit) {
fDateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
uDateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
// fDateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
// uDateCTRL.text = DateFormat('y-M-d').format(DateTime.now());
fDateCTRL.text = '';
uDateCTRL.text = '';
var testResultProviderObject =
Provider.of<TestResultsProvider>(context, listen: false);
TestResultFilterObject filters = testResultProviderObject.filters;
@@ -85,10 +87,11 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
testResultProviderObject.getFilterItems().then((result) {
hospitals = result[0];
testTypes = result[1];
hospitalVals.add('');
for (var hospital in result[0].keys) {
hospitalVals.add(hospital);
}
testTypeVals.add('');
for (var testType in result[1].keys) {
testTypeVals.add(testType);
}
@@ -118,219 +121,228 @@ class _TestFilterScreenState extends State<TestFilterScreen> {
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
final double _deviceBlockSize = _devicewidth / 100;
return Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Tests'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context).popAndPushNamed(
Routes.testResultScreen,
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.testResultScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
titleSpacing: -10,
title: Text('Tests'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context).popAndPushNamed(
Routes.testResultScreen,
),
),
),
),
body: Consumer<ConnectivityProvider>(
builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
),
SizedBox(
height: 20,
),
TextFormField(
controller: idCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
body: Consumer<ConnectivityProvider>(
builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? isInit
? Center(
child: CircularProgressIndicator(),
)
: Padding(
padding: EdgeInsets.all(20),
child: ListView(
// crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'FILTER RESULTS',
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
SizedBox(
height: 20,
),
TextFormField(
controller: idCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelText: 'ID',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
keyboardType: TextInputType.text,
textInputAction: TextInputAction.next,
// onFieldSubmitted: (_) {
// FocusScope.of(context)
// .requestFocus(_cycleNumberFocusNode);
// },
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: labelIdCTRL,
dataVals: labelIDVals,
label: 'Label ID',
),
SizedBox(
height: 25,
),
keyboardType: TextInputType.number,
textInputAction: TextInputAction.next,
// onFieldSubmitted: (_) {
// FocusScope.of(context)
// .requestFocus(_cycleNumberFocusNode);
// },
),
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: labelIdCTRL,
dataVals: labelIDVals,
label: 'Label ID',
),
SizedBox(
height: 25,
),
TextFormField(
controller: usernameCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
TextFormField(
controller: usernameCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.sortNumericDown,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Username',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
),
labelText: 'Username',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2, horizontal: 3),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
// onFieldSubmitted: (_) {
// FocusScope.of(context)
// .requestFocus(_cycleNumberFocusNode);
// },
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: testTypeCTRL,
dataVals: testTypeVals,
label: 'Test Type',
),
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: hospitalCTRL,
dataVals: hospitalVals,
label: 'Hospital',
),
SizedBox(
height: 25,
),
keyboardType: TextInputType.visiblePassword,
textInputAction: TextInputAction.next,
// onFieldSubmitted: (_) {
// FocusScope.of(context)
// .requestFocus(_cycleNumberFocusNode);
// },
),
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: testTypeCTRL,
dataVals: testTypeVals,
label: 'Test Type',
),
SizedBox(
height: 25,
),
TestResultFilterSelectorBox(
deviceBlockSize: _deviceBlockSize,
dataCTRL: hospitalCTRL,
dataVals: hospitalVals,
label: 'Hospital',
),
SizedBox(
height: 25,
),
TestResultFilterDatePicker(
dateCTRL: fDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Date From',
),
SizedBox(
height: 25,
),
TestResultFilterDatePicker(
dateCTRL: uDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Date Until',
),
SizedBox(
height: 70,
),
InkWell(
onTap: () {
Provider.of<TestResultsProvider>(context)
.setFilters(
idCTRL.text,
labelIdCTRL.text != 'None'
? labelIdCTRL.text
: '',
usernameCTRL.text,
testTypeCTRL.text != 'None'
? testTypes[testTypeCTRL.text]
: '',
hospitalCTRL.text != 'None'
? hospitals[hospitalCTRL.text]
: '',
fDateCTRL.text,
uDateCTRL.text,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Filters changed.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
// Navigator.of(context).pop();
},
child: Text('Ok'),
)
],
TestResultFilterDatePicker(
dateCTRL: fDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Date From',
),
SizedBox(
height: 25,
),
TestResultFilterDatePicker(
dateCTRL: uDateCTRL,
deviceBlockSize: _deviceBlockSize,
label: 'Date Until',
),
SizedBox(
height: 70,
),
InkWell(
onTap: () {
Provider.of<TestResultsProvider>(context)
.setFilters(
idCTRL.text,
labelIdCTRL.text != ''
? labelIdCTRL.text
: '',
usernameCTRL.text,
testTypeCTRL.text != ''
? testTypes[testTypeCTRL.text]
: '',
hospitalCTRL.text != ''
? hospitals[hospitalCTRL.text]
: '',
fDateCTRL.text,
uDateCTRL.text,
);
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Filters changed.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
// Navigator.of(context).pop();
},
child: Text('Ok'),
)
],
),
).then(
(_) => Navigator.of(context).popAndPushNamed(
Routes.testResultScreen,
),
);
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
).then(
(_) => Navigator.of(context).popAndPushNamed(
Routes.testResultScreen,
// margin:
// EdgeInsets.symmetric(horizontal: 35, vertical: 15),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue, Colors.green],
),
borderRadius: BorderRadius.circular(7),
),
);
},
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(
'FILTER',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
child: Align(
alignment: Alignment.center,
child: Text(
'FILTER',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
),
),
SizedBox(
height: 70,
),
// DropDownBox(values: ['Washer ID']),
],
),
)
: ConnectionErrorBox();
},
SizedBox(
height: 70,
),
// DropDownBox(values: ['Washer ID']),
],
),
)
: ConnectionErrorBox();
},
),
),
);
}
+104 -91
View File
@@ -4,6 +4,7 @@ import 'package:cssd/providers/test_results.dart';
import 'package:cssd/widgets/TestResultScreens/Add/form_creator.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:random_string/random_string.dart';
class FormPage extends StatefulWidget {
final String name;
@@ -26,39 +27,41 @@ class _FormPageState extends State<FormPage> {
List<Map<String, dynamic>> formInputs;
void _saveForm() {
final batchId = randomString(10);
formatData(formInputs);
if (this.widget.testResultId != null && this.widget.testResultId !=''){
var prvObject = Provider.of<TestResultsProvider>(context, listen: false);
if (this.widget.testResultId != null && this.widget.testResultId != '') {
values['_method'] = 'put';
TestResultsProvider.updateTestResult(this.widget.testResultId, values).then((_){
TestResultsProvider.updateTestResult(this.widget.testResultId, values)
.then((_) {
Navigator.of(context).pop();
});
} else {
setState(() {
_isLoading = true;
});
TestResultsProvider.createTestResult(values).then((_) {
prvObject.createTestResult(values, batchId).then((result) {
setState(() {
_isLoading = false;
});
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Test added.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((_) {
Navigator.of(context).popAndPushNamed(Routes.testResultScreen);
});
if (result == 'done') {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
content: Text('Test added.'),
actions: <Widget>[
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('Ok'),
)
],
),
).then((value) =>
Navigator.of(context).popAndPushNamed(Routes.testResultScreen));
}
});
}
}
@@ -70,11 +73,10 @@ class _FormPageState extends State<FormPage> {
});
Provider.of<Inputs>(context)
.getInputs(
testResultId: this.widget.testResultId ?? "",
name: this.widget.name ?? "",
uniqueCode: this.widget.uniqueCode ?? "",
testTypeId: this.widget.testTypeId ?? ""
)
testResultId: this.widget.testResultId ?? "",
name: this.widget.name ?? "",
uniqueCode: this.widget.uniqueCode ?? "",
testTypeId: this.widget.testTypeId ?? "")
.then((_) {
setState(() {
_isLoading = false;
@@ -87,81 +89,93 @@ class _FormPageState extends State<FormPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Add Test Result'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
return WillPopScope(
onWillPop: () async {
Navigator.pushReplacementNamed(
context,
Routes.testResultAddScreen,
);
return true;
},
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Add Test Result'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: () {
_saveForm();
},
)
],
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () {
_saveForm();
Navigator.of(context).popAndPushNamed(Routes.testResultScreen);
},
)
],
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () {
Navigator.of(context).popAndPushNamed(Routes.testResultScreen);
},
),
),
body: Column(
children: <Widget>[
Expanded(
child: _isLoading
? Center(child: CircularProgressIndicator())
: Form(
key: _form,
child: Consumer<Inputs>(
builder: (context, inputs, _) {
formInputs = inputs.inputItems;
// print(formInputs);
return formInputs.length != 0 ? FormCreator(
form: inputs.inputItems,
onChanged: (value) {
formInputs = value;
},
) : Center(child: Text('An error happen!!!'),);
},
body: Column(
children: <Widget>[
Expanded(
child: _isLoading
? Center(child: CircularProgressIndicator())
: Form(
key: _form,
child: Consumer<Inputs>(
builder: (context, inputs, _) {
formInputs = inputs.inputItems;
return formInputs.length != 0
? FormCreator(
form: inputs.inputItems,
onChanged: (value) {
formInputs = value;
},
)
: Center(
child: Text('An error happen!!!'),
);
},
),
),
),
),
// https://www.cssd-doc.com/api/GetInfo
// InkWell(
// onTap: () {
// _saveForm();
// },
// child: Container(
// padding: EdgeInsets.symmetric(horizontal: 60, vertical: 15),
// margin: EdgeInsets.symmetric(vertical: 20, horizontal: 50),
// decoration: BoxDecoration(
// gradient: LinearGradient(colors: [Colors.blue, Colors.green]),
// borderRadius: BorderRadius.circular(10),
// ),
// child: Text(
// 'Save',
// style: TextStyle(color: Colors.white, fontSize: 17),
// textAlign: TextAlign.center,
// ),
// ),
// ),
],
));
),
// https://www.cssd-doc.com/api/GetInfo
// InkWell(
// onTap: () {
// _saveForm();
// },
// child: Container(
// padding: EdgeInsets.symmetric(horizontal: 60, vertical: 15),
// margin: EdgeInsets.symmetric(vertical: 20, horizontal: 50),
// decoration: BoxDecoration(
// gradient: LinearGradient(colors: [Colors.blue, Colors.green]),
// borderRadius: BorderRadius.circular(10),
// ),
// child: Text(
// 'Save',
// style: TextStyle(color: Colors.white, fontSize: 17),
// textAlign: TextAlign.center,
// ),
// ),
// ),
],
)),
);
}
void formatData(inputs) {
for (var input in inputs) {
if(input['type'] != 'Form') {
if(input['key'] == 'result') {
if (input['type'] != 'Form') {
if (input['key'] == 'result') {
values[input["key"]] = input["value"] ? "Accept" : "Reject";
// print('${input["key"]} : ${input["value"] ? "Accept" : "Reject"}');
} else if(input['key'] == 'date') {
} else if (input['key'] == 'date') {
var date = input["value"];
values[input["key"]] = "${date.year}-${date.month}-${date.day}";
} else {
values[input["key"]] = input["value"];
@@ -172,7 +186,6 @@ class _FormPageState extends State<FormPage> {
formatData(input['children']);
}
}
print(values);
print(values);
}
}
+54 -54
View File
@@ -3,7 +3,7 @@ import 'package:cssd/models/test_result_models.dart';
import 'package:cssd/providers/connectivity.dart';
// import 'package:cssd/providers/test_result.dart';
import 'package:cssd/providers/test_results.dart';
import 'package:cssd/widgets/Global/splash_screen%20copy.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:cssd/widgets/TestResultScreens/Main/filter_chip_box.dart';
import 'package:cssd/widgets/TestResultScreens/Main/floating_button.dart';
import 'package:cssd/widgets/TestResultScreens/Main/search_box.dart';
@@ -342,10 +342,10 @@ class TestItemBox extends StatelessWidget {
SizedBox(
height: 15,
),
item.result == 'Verified'
item.result == 'Accepted'
? Text(
'Verified',
style: TextStyle(color: Colors.blueAccent),
'Accepted',
style: TextStyle(color: Colors.green),
)
: Text(
'Rejected',
@@ -366,56 +366,56 @@ class TestItemBox extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
item.result != 'Verified'
? InkWell(
onTap: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Delete'),
content: Text(
'Are you sure for delete this test?'),
actions: <Widget>[
FlatButton(
onPressed: () {
Provider.of<TestResultsProvider>(
context)
.removeTestResult(
item.id.toString())
.then((_) {
Navigator.of(ctx).pop();
});
},
child: Text('Yes'),
),
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('No'),
),
],
),
);
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
),
child: Icon(
Icons.delete,
size: 6 * _deviceBlockSize,
color: Colors.white,
),
),
)
: Container(),
SizedBox(
width: _deviceBlockSize,
),
// item.result != 'Accepted'
// ? InkWell(
// onTap: () {
// showDialog(
// context: context,
// builder: (ctx) => AlertDialog(
// title: Text('Delete'),
// content: Text(
// 'Are you sure for delete this test?'),
// actions: <Widget>[
// FlatButton(
// onPressed: () {
// Provider.of<TestResultsProvider>(
// context)
// .removeTestResult(
// item.id.toString())
// .then((_) {
// Navigator.of(ctx).pop();
// });
// },
// child: Text('Yes'),
// ),
// FlatButton(
// onPressed: () {
// Navigator.of(ctx).pop();
// },
// child: Text('No'),
// ),
// ],
// ),
// );
// },
// child: Container(
// padding: EdgeInsets.all(7),
// width: 10 * _deviceBlockSize,
// decoration: BoxDecoration(
// shape: BoxShape.circle,
// color: Colors.red,
// ),
// child: Icon(
// Icons.delete,
// size: 6 * _deviceBlockSize,
// color: Colors.white,
// ),
// ),
// )
// : Container(),
// SizedBox(
// width: _deviceBlockSize,
// ),
InkWell(
onTap: () {
Navigator.of(context).pushNamed(
+213
View File
@@ -0,0 +1,213 @@
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class TestScanScreen extends StatefulWidget {
// static const route = '/TestScanScreen';
@override
State<StatefulWidget> createState() {
return _TestScanScreenState();
}
}
class _TestScanScreenState extends State<TestScanScreen> {
String testCode = "";
TextEditingController idCTRL = new TextEditingController();
final _form = GlobalKey<FormState>();
@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 Scaffold(
appBar: AppBar(
centerTitle: true,
titleSpacing: -10,
title: Text('CSSD'),
leading: IconButton(
icon: Icon(
Icons.keyboard_arrow_left,
size: 35,
),
onPressed: () => Navigator.of(context).pop(),
),
),
body: Consumer<ConnectivityProvider>(builder: (ct, connection, _) {
return connection.conStatus != 'offline'
? ListView(
padding: EdgeInsets.symmetric(horizontal: 20),
children: <Widget>[
Container(
padding: EdgeInsets.only(top: 30),
child: Text(
'LOOKING FOR A Test Result?',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 5.5 * _deviceBlockSize,
fontWeight: FontWeight.w700,
letterSpacing: 3,
),
),
),
GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(vertical: 10),
height: 200,
decoration: BoxDecoration(border: Border.all()),
child: Center(
child: Text(
'Please Scan The Test Result 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 {
launch(
'https://cssd-doc.com/Show/TestResult/$result',
);
// Navigator.of(context).pushNamed(
// Routes.cycleDetailScreen,
// arguments: result,
// );
}
},
);
},
),
Form(
key: _form,
child: 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,
),
isDense: true,
labelText: 'Or enter a Test Result ID',
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,
),
),
SizedBox(
height: 40,
),
Divider(
color: Colors.black,
thickness: 3,
),
SizedBox(
height: 30,
),
InkWell(
onTap: () {
if (!_form.currentState.validate()) {
return;
}
launch(
'https://cssd-doc.com/Show/TestResult/${idCTRL.text}',
);
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: 5 * _deviceBlockSize,
vertical: 10,
),
margin: EdgeInsets.only(bottom: 50, left: 20, right: 20),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.red, Colors.orange],
),
borderRadius: BorderRadius.circular(7),
),
child: Align(
alignment: Alignment.center,
child: Text(
'GO!',
style: TextStyle(
color: Colors.white,
fontSize: 5 * _deviceBlockSize,
),
),
),
),
),
],
)
: ConnectionErrorBox();
}),
);
}
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';
}
}
}
+287 -238
View File
@@ -1,18 +1,17 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/models/test_result_models.dart';
// import 'package:cssd/providers/test_result.dart';
import 'package:cssd/providers/test_results.dart';
import 'package:cssd/widgets/TestResultScreens/Main/filter_chip_box.dart';
import 'package:cssd/widgets/TestResultScreens/Main/search_box.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import '../config/routes.dart';
import '../models/test_result_models.dart';
import '../providers/auth.dart';
class TestVerifyScreen extends StatefulWidget {
// static const route = '/TestVerifyScreen';
final bool isAdmin;
// final bool isAdmin;
TestVerifyScreen({this.isAdmin});
// TestVerifyScreen({this.isAdmin});
@override
_TestVerifyScreenState createState() => _TestVerifyScreenState();
@@ -41,6 +40,7 @@ class _TestVerifyScreenState extends State<TestVerifyScreen> {
var testResults =
Provider.of<TestResultsProvider>(context, listen: false);
testResults.setLoading();
testResults.resetFilters();
testResults.resetPageNumber();
testResults.getTestResults().then((_) {
testResults.resetLoading();
@@ -64,6 +64,8 @@ class _TestVerifyScreenState extends State<TestVerifyScreen> {
@override
Widget build(BuildContext context) {
final userData = Provider.of<Auth>(context, listen: false).user;
final _media = MediaQuery.of(context);
// final double _pixelRatio = (_media.size.height / _media.size.width * 7 / 5);
final double _devicewidth = _media.size.width;
@@ -101,153 +103,153 @@ class _TestVerifyScreenState extends State<TestVerifyScreen> {
),
),
),
Spacer(),
InkWell(
onTap: () {
Navigator.of(context)
.popAndPushNamed(Routes.testFilterScreen);
},
child: Container(
padding: EdgeInsets.all(7),
child: Icon(
FontAwesomeIcons.filter,
size: 7 * _deviceBlockSize,
),
),
),
// Spacer(),
// InkWell(
// onTap: () {
// Navigator.of(context)
// .popAndPushNamed(Routes.testFilterScreen);
// },
// child: Container(
// padding: EdgeInsets.all(7),
// child: Icon(
// FontAwesomeIcons.filter,
// size: 7 * _deviceBlockSize,
// ),
// ),
// ),
],
),
SizedBox(
height: 20,
),
Consumer<TestResultsProvider>(
builder: (context, testResult, _) {
return Container(
height: 50,
child: ListView(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
children: <Widget>[
InkWell(
onTap: () {
Navigator.of(context)
.popAndPushNamed(Routes.testFilterScreen);
},
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.testFilterScreen);
},
),
),
testResult.filters.id != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'ID',
id: '',
labelID: testResult.filters.labelID,
testType: testResult.filters.testType,
hospital: testResult.filters.hospital,
username: testResult.filters.userName,
fDate: testResult.filters.fDate,
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.labelID != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'Label ID',
id: testResult.filters.id,
labelID: '',
testType: testResult.filters.testType,
hospital: testResult.filters.hospital,
username: testResult.filters.userName,
fDate: testResult.filters.fDate,
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.testType != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'Test Type',
id: testResult.filters.id,
labelID: testResult.filters.labelID,
testType: '',
hospital: testResult.filters.hospital,
username: testResult.filters.userName,
fDate: testResult.filters.fDate,
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.hospital != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'Hospital',
id: testResult.filters.id,
labelID: testResult.filters.labelID,
testType: testResult.filters.testType,
hospital: '',
username: testResult.filters.userName,
fDate: testResult.filters.fDate,
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.userName != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'Username',
id: testResult.filters.id,
labelID: testResult.filters.labelID,
testType: testResult.filters.testType,
hospital: testResult.filters.hospital,
username: '',
fDate: testResult.filters.fDate,
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.fDate != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'From Date',
id: testResult.filters.id,
labelID: testResult.filters.labelID,
testType: testResult.filters.testType,
hospital: testResult.filters.hospital,
username: testResult.filters.userName,
fDate: '',
uDate: testResult.filters.uDate,
)
: Container(),
testResult.filters.uDate != ''
? TestResultChip(
deviceBlockSize: _deviceBlockSize,
label: 'Until Date',
id: testResult.filters.id,
labelID: testResult.filters.labelID,
testType: testResult.filters.testType,
hospital: testResult.filters.hospital,
username: testResult.filters.userName,
fDate: testResult.filters.fDate,
uDate: '',
)
: Container(),
],
),
);
},
),
// Consumer<TestResultsProvider>(
// builder: (context, testResult, _) {
// return Container(
// height: 50,
// child: ListView(
// scrollDirection: Axis.horizontal,
// shrinkWrap: true,
// children: <Widget>[
// InkWell(
// onTap: () {
// Navigator.of(context)
// .popAndPushNamed(Routes.testFilterScreen);
// },
// 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.testFilterScreen);
// },
// ),
// ),
// testResult.filters.id != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'ID',
// id: '',
// labelID: testResult.filters.labelID,
// testType: testResult.filters.testType,
// hospital: testResult.filters.hospital,
// username: testResult.filters.userName,
// fDate: testResult.filters.fDate,
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.labelID != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'Label ID',
// id: testResult.filters.id,
// labelID: '',
// testType: testResult.filters.testType,
// hospital: testResult.filters.hospital,
// username: testResult.filters.userName,
// fDate: testResult.filters.fDate,
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.testType != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'Test Type',
// id: testResult.filters.id,
// labelID: testResult.filters.labelID,
// testType: '',
// hospital: testResult.filters.hospital,
// username: testResult.filters.userName,
// fDate: testResult.filters.fDate,
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.hospital != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'Hospital',
// id: testResult.filters.id,
// labelID: testResult.filters.labelID,
// testType: testResult.filters.testType,
// hospital: '',
// username: testResult.filters.userName,
// fDate: testResult.filters.fDate,
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.userName != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'Username',
// id: testResult.filters.id,
// labelID: testResult.filters.labelID,
// testType: testResult.filters.testType,
// hospital: testResult.filters.hospital,
// username: '',
// fDate: testResult.filters.fDate,
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.fDate != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'From Date',
// id: testResult.filters.id,
// labelID: testResult.filters.labelID,
// testType: testResult.filters.testType,
// hospital: testResult.filters.hospital,
// username: testResult.filters.userName,
// fDate: '',
// uDate: testResult.filters.uDate,
// )
// : Container(),
// testResult.filters.uDate != ''
// ? TestResultChip(
// deviceBlockSize: _deviceBlockSize,
// label: 'Until Date',
// id: testResult.filters.id,
// labelID: testResult.filters.labelID,
// testType: testResult.filters.testType,
// hospital: testResult.filters.hospital,
// username: testResult.filters.userName,
// fDate: testResult.filters.fDate,
// uDate: '',
// )
// : Container(),
// ],
// ),
// );
// },
// ),
TestResultSearchBox(
searchCTRL: searchCTRL,
deviceBlockSize: _deviceBlockSize,
@@ -264,11 +266,18 @@ class _TestVerifyScreenState extends State<TestVerifyScreen> {
)
: ListView.builder(
controller: sc,
itemBuilder: (context, index) => TestItemBox(
deviceBlockSize: _deviceBlockSize,
item: testResults.items[index],
id: testResults.items[index].id,
),
itemBuilder: (context, index) =>
(testResults.items[index].verified == 'None' &&
userData['roles']
.contains('Supervisor')) ||
userData['roles'].contains('Admin')
? TestItemBox(
deviceBlockSize: _deviceBlockSize,
item: testResults.items[index],
id: testResults.items[index].id,
userData: userData,
)
: Container(),
// Column(
// children: <Widget>[
// Text(testResults.items[index].name),
@@ -303,11 +312,12 @@ class TestItemBox extends StatelessWidget {
Key key,
@required String id,
@required double deviceBlockSize,
this.item,
@required this.item,
@required this.userData,
}) : _deviceBlockSize = deviceBlockSize,
// _id = id,
super(key: key);
final Map<String, dynamic> userData;
final double _deviceBlockSize;
// final String _id;
@@ -348,17 +358,24 @@ class TestItemBox extends StatelessWidget {
SizedBox(
height: 15,
),
item.result == 'Verified'
item.verified == 'None'
? Text(
'Verified',
style: TextStyle(color: Colors.blueAccent),
)
: Text(
'Awaiting Verification',
style: TextStyle(
color: Colors.orange,
),
),
style: TextStyle(color: Colors.orange),
)
: item.verified == 'Verified'
? Text(
'Verified',
style: TextStyle(
color: Colors.blueAccent,
),
)
: Text(
'Rejected',
style: TextStyle(
color: Colors.red,
),
),
],
),
Spacer(),
@@ -372,85 +389,117 @@ class TestItemBox extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
item.result != 'Verified'
? InkWell(
onTap: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Verify'),
content: Text(
'Are you sure for verify this test?'),
actions: <Widget>[
FlatButton(
onPressed: () {
// TestResultsProvider.updateTestResult(
// _id,
// {})
// .then((_) {
// Navigator.of(context).pop();
// });
// Provider.of<TestResultsProvider>(
// context)
// .removeTestResult(
// item.id.toString())
// .then((_) {
// Navigator.of(ctx).pop();
// });
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
InkWell(
onTap: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Verify'),
content: Text(
'Are you sure for verify this test?'),
actions: <Widget>[
FlatButton(
onPressed: () async {
Provider.of<TestResultsProvider>(
context)
.changeVerification(
item.id, 'Verified')
.then((result) {
if (result) {
print('true');
}
Navigator.of(ctx).pop();
},
child: Text('Yes'),
),
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('No'),
),
],
),
);
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Color.fromRGBO(0, 190, 190, 1),
),
child: Icon(
Icons.check,
size: 6 * _deviceBlockSize,
color: Colors.white,
Navigator.of(context).popAndPushNamed(
Routes.testVerifyScreen);
});
},
child: Text('Yes'),
),
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('No'),
),
],
),
);
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Color.fromRGBO(0, 190, 190, 1),
),
)
: Container(),
child: Icon(
Icons.check,
size: 6 * _deviceBlockSize,
color: Colors.white,
),
),
),
SizedBox(
width: 3,
),
InkWell(
onTap: () {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Reject'),
content: Text(
'Are you sure for reject this test?'),
actions: <Widget>[
FlatButton(
onPressed: () async {
await Provider.of<TestResultsProvider>(
context)
.changeVerification(
item.id, 'NotVerified')
.then((result) {
if (result) {
print('true');
}
Navigator.of(ctx).pop();
Navigator.of(context).popAndPushNamed(
Routes.testVerifyScreen);
});
},
child: Text('Yes'),
),
FlatButton(
onPressed: () {
Navigator.of(ctx).pop();
},
child: Text('No'),
),
],
),
);
},
child: Container(
padding: EdgeInsets.all(7),
width: 10 * _deviceBlockSize,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.red,
),
child: Icon(
Icons.close,
size: 6 * _deviceBlockSize,
color: Colors.white,
),
),
),
],
),
SizedBox(
width: _deviceBlockSize,
),
InkWell(
onTap: () {
Navigator.of(context).pushNamed(
Routes.testDetailsScreen,
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,
),
),
),
],
)
],
+194
View File
@@ -0,0 +1,194 @@
import 'package:cssd/config/routes.dart';
import 'package:cssd/providers/auth.dart';
import 'package:cssd/providers/connectivity.dart';
import 'package:cssd/widgets/Global/internet_error.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
class VerifyPassScreen extends StatefulWidget {
// static const route = '/HomeScreen';
@override
State<StatefulWidget> createState() {
return _VerifyPassScreenState();
}
}
class _VerifyPassScreenState extends State<VerifyPassScreen> {
final _form = GlobalKey<FormState>();
bool _isLoading = false;
final codeCTRL = TextEditingController();
@override
void initState() {
codeCTRL.text = '';
super.initState();
}
@override
void dispose() {
super.dispose();
}
void _showDialog(String message) {
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('Error'),
content: Text(message),
actions: <Widget>[
FlatButton(
child: Text('Ok'),
onPressed: () {
Navigator.of(ctx).pop();
},
),
],
),
);
}
void _sendCode() async {
if (!_form.currentState.validate()) {
return;
}
_form.currentState.save();
setState(() {
_isLoading = true;
});
// try {
await Provider.of<Auth>(context)
.sendCode(
codeCTRL.text,
)
.then(
(result) {
if (result == 'wrong') {
_showDialog('Code is wrong!!!');
setState(
() {
_isLoading = false;
},
);
} else {
Navigator.of(context)
.popAndPushNamed(Routes.rePassScreen, arguments: result);
}
},
);
}
@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 Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('CSSD'),
),
body: Selector<ConnectivityProvider, String>(
builder: (ctx, value, _) => value != 'offline'
? _isLoading
? Center(
child: CircularProgressIndicator(),
)
: Form(
key: _form,
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 20),
children: <Widget>[
Container(
padding: EdgeInsets.symmetric(vertical: 20),
child: Text(
'Send Verification Code',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
fontWeight: FontWeight.w700,
),
),
),
TextFormField(
validator: (value) {
if (value.isEmpty) {
return 'Code is required.';
}
if (value.length != 6) {
return 'Code most be 6 characters';
}
return null;
},
controller: codeCTRL,
decoration: InputDecoration(
icon: Icon(
FontAwesomeIcons.starOfLife,
size: 6 * _deviceBlockSize,
),
labelStyle: TextStyle(
fontWeight: FontWeight.w100,
fontSize: 4 * _deviceBlockSize,
),
labelText: 'Code',
isDense: true,
contentPadding: EdgeInsets.symmetric(
vertical: 2,
horizontal: 3,
),
),
style: TextStyle(
fontWeight: FontWeight.w700,
fontSize: 5 * _deviceBlockSize,
letterSpacing: 3,
),
keyboardType: TextInputType.number,
onSaved: (value) {
codeCTRL.text = value;
},
maxLength: 6,
),
SizedBox(height: 40),
Row(
children: <Widget>[
InkWell(
onTap: () => _sendCode(),
child: Container(
width: 40 * _deviceBlockSize,
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: Text(
'Send Code',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
),
),
Spacer(),
],
),
SizedBox(height: 10),
],
),
)
: ConnectionErrorBox(),
selector: (_, connectivity) => connectivity.conStatus,
),
);
}
}