diff --git a/.vscode/settings.json b/.vscode/settings.json index 4969fedb..a1b95030 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { "commentBox.styles": { "defaultStyle": { - "commentStartToken": "/* \n *@author: Elham Rababah \n *@Date:13/4/1993 \n *@param: \n *@return:\n *@desc: ", + "commentStartToken": "/* \n *@author: Elham Rababah \n *@Date:13/4/2020 \n *@param: \n *@return:\n *@desc: ", "commentEndToken": "\n */", "leftEdgeToken": " * ", "rightEdgeToken": "", diff --git a/lib/routes.dart b/lib/routes.dart index 82771ae6..9aacf6cb 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -9,7 +9,7 @@ import './screens/dashboard_screen.dart'; import './screens/medicine/medicine_search_screen.dart'; import './screens/my_schedule_screen.dart'; import './screens/patients/patient_search_screen.dart'; -import './screens/patients/patients_list_screen.dart'; +import './screens/patients/patients_screen.dart'; import './screens/settings/settings_screen.dart'; const String INIT_ROUTE = LOGIN; @@ -32,7 +32,7 @@ var routes = { INIT_ROUTE: (_) => Loginsreen(), MY_SCHEDULE: (_) => MyScheduleScreen(), PATIENT_SEARCH: (_) => PatientSearchScreen(), - PATIENTS: (_) => PatientsListScreen(), + PATIENTS: (_) => PatientsScreen(), QR_READER: (_) => QrReaderScreen(), BLOOD_BANK: (_) => BloodBankScreen(), DOCTOR_REPLY: (_) => DoctorReplyScreen(), diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 5196bbe0..7ef74d57 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -22,13 +22,7 @@ class _DashboardScreenState extends State { return AppScaffold( appBarTitle:'Home', body: Container( - decoration: new BoxDecoration( - gradient: LinearGradient( - colors: [Colors.red[100], Colors.white], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - ), + child: Column( children: [ Expanded( diff --git a/lib/screens/my_schedule_screen.dart b/lib/screens/my_schedule_screen.dart index c7775c10..0c4593ad 100644 --- a/lib/screens/my_schedule_screen.dart +++ b/lib/screens/my_schedule_screen.dart @@ -1,9 +1,65 @@ import 'package:flutter/material.dart'; + +import '../config/size_config.dart'; +import '../widgets/shared/app_scaffold_widget.dart'; +import '../widgets/shared/card_with_bg_widget.dart'; + class MyScheduleScreen extends StatelessWidget { + List litems = [ + "1", + "2", + ]; + @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text("My Schedule"),), + return AppScaffold( + // pageOnly: false, + appBarTitle: 'My Schdule', + body: Container( + padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0), + child: ListView(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 20, + ), + Text('My Schedule', style: textStyle(2.5, FontWeight.w700)), + scheduleListByDate('Today, 7 April '), + scheduleListByDate('Wednesday, 8 April '), + ], + ), + ], + ), + ]), + )); + } + + Column scheduleListByDate(date) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 10, + ), + Text(date, style: textStyle(2.5)), + Container( + child: Column( + children: litems.map((item) { + return CardWithBgWidget(line1Text: 'ER new development ideas meeting',line2Text:'09:00 AM - 10:50 AM',line3Text: 'Cloud Solution',icon: Icons.add_location, heightPercentage: 0.20, widthPercentage: 0.80,); + }).toList(), + ), + ), + ], ); } -} \ No newline at end of file + + TextStyle textStyle(size, [FontWeight weight]) { + return TextStyle( + fontSize: size * SizeConfig.textMultiplier, fontWeight: weight); + } +} + diff --git a/lib/screens/patients/patients_screen.dart b/lib/screens/patients/patients_screen.dart new file mode 100644 index 00000000..68422e81 --- /dev/null +++ b/lib/screens/patients/patients_screen.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +import '../../widgets/shared/app_scaffold_widget.dart'; +import '../../widgets/shared/card_with_bg_widget.dart'; + +class PatientsScreen extends StatelessWidget { + List litems = [ + "1", + "1", + "1", + ]; + @override + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: 'Patients', + body: Container( + child: Column( + children: litems.map((item) { + return CardWithBgWidget( + line1Text: 'Fahad AlSlehm - 324599', + line2Text: '12/04/2020 - 02:00 PM', + // line3Text: '', + + heightPercentage: 0.15, + widthPercentage: 0.80); + }).toList(), + ), + ), + ); + } +} + +class CustomShapeClipper extends CustomClipper { + @override + Path getClip(Size size) { + final Path path = Path(); + path.lineTo(0.0, size.height); + + var firstEndPoint = Offset(size.width * .5, size.height / 2); + var firstControlpoint = Offset(size.width * 0.25, size.height * 0.95 + 30); + path.quadraticBezierTo(firstControlpoint.dx, firstControlpoint.dy, + firstEndPoint.dx, firstEndPoint.dy); + + var secondEndPoint = Offset(size.width, size.height * 0.10); + var secondControlPoint = Offset(size.width * .75, size.height * .10 - 20); + path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy, + secondEndPoint.dx, secondEndPoint.dy); + + path.lineTo(size.width, 0.0); + path.close(); + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) => true; +} diff --git a/lib/widgets/shared/app_scaffold_widget.dart b/lib/widgets/shared/app_scaffold_widget.dart index 373c94c6..0993749f 100644 --- a/lib/widgets/shared/app_scaffold_widget.dart +++ b/lib/widgets/shared/app_scaffold_widget.dart @@ -1,70 +1,104 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/screens/patients/patients_screen.dart'; +import 'package:hexcolor/hexcolor.dart'; + import '../../presentation/doctor_app_icons.dart'; import '../../widgets/shared/app_drawer_widget.dart'; import 'package:flutter/material.dart'; class AppScaffold extends StatelessWidget { - AppScaffold( - {this.pageOnly, - this.appBarTitle, - this.showAppBar, - this.showBottomBar, - this.showAppDrawer, - this.body}); bool pageOnly = false; // bool showAll = bool showAppBar = true; bool showAppDrawer = true; bool showBottomBar = true; - String appBarTitle; + bool showbg = true; + bool showCurve = true; + String appBarTitle = ''; Widget body; + AppScaffold( + {this.pageOnly, + this.appBarTitle, + this.showAppBar, + this.showBottomBar, + this.showAppDrawer, + this.body, + this.showbg, + this.showCurve}); + @override Widget build(BuildContext context) { return Scaffold( - appBar: (pageOnly == true || showAppBar == false)?null:AppBar( - - elevation: 0, - backgroundColor: Colors.red[100], - textTheme: TextTheme( - title: TextStyle(color: Colors.black, fontWeight: FontWeight.bold)), - title: Text(appBarTitle), - leading: Builder(builder: (BuildContext context) { - return new GestureDetector( - onTap: () { - Scaffold.of(context).openDrawer(); - }, - child: IconButton( - icon: Icon(Icons.menu), - color: Colors.black, - onPressed: () => Scaffold.of(context).openDrawer(), - ), - ); - }), - centerTitle: true, - actions: [ - IconButton(icon: Icon(Icons.person), onPressed: null) - ], - ), - drawer: (pageOnly == true || showAppDrawer == false)?null:Theme( - data: Theme.of(context).copyWith( - canvasColor: Colors.transparent, - ), - child: SafeArea(child: AppDrawer()), - ), - // , - bottomNavigationBar: (pageOnly == true || showBottomBar == false)?null: BottomNavigationBar(items: [ - BottomNavigationBarItem( - icon: Icon(DoctorApp.home_icon), - title: Text('Home'), - backgroundColor: Colors.red, - activeIcon: Icon(Icons.home)), - BottomNavigationBarItem( - icon: new Icon(Icons.mail), - title: new Text('Messages'), - ), - BottomNavigationBarItem(icon: Icon(Icons.apps), title: Text('Menu')) - ]), - body: body, - ); + backgroundColor: + (pageOnly == true || showbg == false) ? null : Hexcolor('#FCF7F7'), + appBar: (pageOnly == true || showAppBar == false) + ? null + : AppBar( + elevation: 0, + backgroundColor: Hexcolor('#FFDDD9'), + textTheme: TextTheme( + title: TextStyle( + color: Colors.black, fontWeight: FontWeight.bold)), + title: Text(appBarTitle), + leading: Builder(builder: (BuildContext context) { + return new GestureDetector( + onTap: () { + Scaffold.of(context).openDrawer(); + }, + child: IconButton( + icon: Icon(Icons.menu), + color: Colors.black, + onPressed: () => Scaffold.of(context).openDrawer(), + ), + ); + }), + centerTitle: true, + actions: [ + IconButton(icon: Icon(Icons.person), onPressed: null) + ], + ), + drawer: (pageOnly == true || showAppDrawer == false) + ? null + : Theme( + data: Theme.of(context).copyWith( + canvasColor: Colors.transparent, + ), + child: SafeArea(child: AppDrawer()), + ), + // , + bottomNavigationBar: (pageOnly == true || showBottomBar == false) + ? null + : BottomNavigationBar(items: [ + BottomNavigationBarItem( + icon: Icon(DoctorApp.home_icon), + title: Text('Home'), + backgroundColor: Colors.red, + activeIcon: Icon(Icons.home)), + BottomNavigationBarItem( + icon: new Icon(Icons.mail), + title: new Text('Messages'), + ), + BottomNavigationBarItem( + icon: Icon(Icons.apps), title: Text('Menu')) + ]), + body: (pageOnly == true || showCurve == false) + ? body + : Stack( + children: [ + ClipPath( + clipper: CustomShapeClipper(), + child: Container( + height: SizeConfig.realScreenHeight * 0.40, + decoration: + BoxDecoration(color: Hexcolor('#FFDDD9')))), + Positioned( + // key: , + // top: SizeConfig.realScreenHeight * 0.10, + child: body) + ], + )); } } + + diff --git a/lib/widgets/shared/card_with_bg_widget.dart b/lib/widgets/shared/card_with_bg_widget.dart new file mode 100644 index 00000000..9b4bf4ff --- /dev/null +++ b/lib/widgets/shared/card_with_bg_widget.dart @@ -0,0 +1,82 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class CardWithBgWidget extends StatelessWidget { + String line1Text; + String line2Text; + String line3Text; + IconData icon; + double heightPercentage; + double widthPercentage; + CardWithBgWidget( + {this.line1Text = '', + this.line2Text = '', + this.line3Text = '', + this.icon, + this.heightPercentage, + this.widthPercentage}); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + RoundedContainer( + Container( + height: SizeConfig.screenHeight * heightPercentage, + width: SizeConfig.screenWidth * widthPercentage, + ), + raduis: 10, + backgroundColor: Hexcolor('#58434F'), + showBorder: true, + borderColor: Hexcolor('#707070'), + borderWidth: 0.5, + ), + Positioned( + left: 10, + child: RoundedContainer( + Container( + padding: const EdgeInsets.all(15.0), + height: SizeConfig.screenHeight * heightPercentage, + width: SizeConfig.screenWidth * widthPercentage, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(line1Text, style: textStyle(2.5)), + SizedBox( + height: 8, + ), + Text(line2Text, style: textStyle(2.5)), + SizedBox( + height: 8, + ), + Row( + children: [ + Icon(icon), + Text(line3Text, style: textStyle(2.5)) + ], + ) + ], + ), + ), + elevation: 0, + // raduis: 0, + showBorder: true, + borderColor: Hexcolor('#707070'), + customCornerRaduis: true, + bottomLeft: 0, + topLeft: 0, + bottomRight: 10, + topRight: 10, + borderWidth: 0.5), + ), + ], + ); + } + + TextStyle textStyle(size, [FontWeight weight]) { + return TextStyle( + fontSize: size * SizeConfig.textMultiplier, fontWeight: weight); + } +} diff --git a/lib/widgets/shared/custom_shape_clipper.dart b/lib/widgets/shared/custom_shape_clipper.dart new file mode 100644 index 00000000..81f5ee20 --- /dev/null +++ b/lib/widgets/shared/custom_shape_clipper.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class CustomShapeClipper extends CustomClipper { + @override + Path getClip(Size size) { + final Path path = Path(); + path.lineTo(0.0, size.height); + + var firstEndPoint = Offset(size.width * .5, size.height / 2); + var firstControlpoint = Offset(size.width * 0.25, size.height * 0.95 + 30); + path.quadraticBezierTo(firstControlpoint.dx, firstControlpoint.dy, + firstEndPoint.dx, firstEndPoint.dy); + + var secondEndPoint = Offset(size.width, size.height * 0.10); + var secondControlPoint = Offset(size.width * .75, size.height * .10 - 20); + path.quadraticBezierTo(secondControlPoint.dx, secondControlPoint.dy, + secondEndPoint.dx, secondEndPoint.dy); + + path.lineTo(size.width, 0.0); + path.close(); + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) => true; +} diff --git a/lib/widgets/shared/rounded_container_widget.dart b/lib/widgets/shared/rounded_container_widget.dart index 1ce9fc53..8b071cf9 100644 --- a/lib/widgets/shared/rounded_container_widget.dart +++ b/lib/widgets/shared/rounded_container_widget.dart @@ -17,6 +17,7 @@ class RoundedContainer extends StatefulWidget { final double topRight; final double bottomLeft; final Widget widget; + final double borderWidth; RoundedContainer( this.widget, @@ -31,6 +32,7 @@ class RoundedContainer extends StatefulWidget { this.topRight = 0, this.bottomRight = 0, this.bottomLeft = 0, + this.borderWidth =1 }); @override @@ -41,11 +43,13 @@ class _RoundedContainerState extends State { @override Widget build(BuildContext context) { return Container( + height: null, + width: null, margin: EdgeInsets.all(widget.margin), decoration: widget.showBorder == true ? BoxDecoration( color: Theme.of(context).primaryColor, - border: Border.all(color: Colors.red, width: 1), + border: Border.all(color: widget.borderColor, width: widget.borderWidth), borderRadius: widget.customCornerRaduis ? BorderRadius.only( topLeft: Radius.circular(widget.topLeft),