From fc749de77ea9af00cef75bb6475c128d083c252f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 21 Jul 2020 12:16:32 +0300 Subject: [PATCH 1/3] create doctor card and medical page --- assets/images/Icon-awesome-calendar.png | Bin 0 -> 408 bytes assets/images/medical/doctor_icon.png | Bin 0 -> 1073 bytes .../medical/insurance_approvals_icon.png | Bin 0 -> 1040 bytes assets/images/medical/insurance_card_icon.png | Bin 0 -> 700 bytes assets/images/medical/lab_result_icon.png | Bin 0 -> 1208 bytes .../images/medical/medical_history_icon.png | Bin 0 -> 1189 bytes assets/images/medical/prescription_icon.png | Bin 0 -> 990 bytes assets/images/medical/radiology_icon.png | Bin 0 -> 1491 bytes ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + lib/main.dart | 3 +- lib/pages/landing/landing_page.dart | 4 +- lib/pages/medical/medical_page.dart | 132 ++++++++++++++++++ lib/pages/medical/my_admissions_page.dart | 61 ++++++++ lib/widgets/avatar/large_avatar.dart | 8 +- .../data_display/medical/doctor_card.dart | 99 +++++++++++++ .../medical/medical_profile_item.dart | 53 +++++++ lib/widgets/others/StarRating.dart | 39 ++++++ .../others/app_expandable_notifier.dart | 8 +- lib/widgets/others/card_with_bg_widget.dart | 71 ++++++++++ .../others/rounded_container_widget.dart | 86 ++++++++++++ .../others/sliver_app_bar_delegate.dart | 34 +++++ pubspec.yaml | 1 + 23 files changed, 591 insertions(+), 10 deletions(-) create mode 100644 assets/images/Icon-awesome-calendar.png create mode 100644 assets/images/medical/doctor_icon.png create mode 100644 assets/images/medical/insurance_approvals_icon.png create mode 100644 assets/images/medical/insurance_card_icon.png create mode 100644 assets/images/medical/lab_result_icon.png create mode 100644 assets/images/medical/medical_history_icon.png create mode 100644 assets/images/medical/prescription_icon.png create mode 100644 assets/images/medical/radiology_icon.png create mode 100644 lib/pages/medical/medical_page.dart create mode 100644 lib/pages/medical/my_admissions_page.dart create mode 100644 lib/widgets/data_display/medical/doctor_card.dart create mode 100644 lib/widgets/data_display/medical/medical_profile_item.dart create mode 100644 lib/widgets/others/StarRating.dart create mode 100644 lib/widgets/others/card_with_bg_widget.dart create mode 100644 lib/widgets/others/rounded_container_widget.dart create mode 100644 lib/widgets/others/sliver_app_bar_delegate.dart diff --git a/assets/images/Icon-awesome-calendar.png b/assets/images/Icon-awesome-calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..f058ca7751708be04ea0caccb087948640534906 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!3HFy_x^nYq!^2X+?^QKos)S9>KQty+Uvz zPx#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91B%lKT z1ONa40RR91C;$Ke0L(Tl#{d8Wr%6OXR9Fecn2mAUMi542PYOT>xemfqpi2dzD+pYH z*@4i3*@4i3mBZjg8kYj%{Py2Jbdxrx?qtVUHbXAnz!xMa) zz<;SeU?=O{#L7UO2l)b97+{Jv6y3sKaG26CwPsIYJGFRJ=K~x^xr@SzZeNjhiE{sH zO7r^(MGpE314QuK@PMNK3EWgWUaQI3_Xy6piXv0GG|3H{gV(-9 z_Syf(lIC$wAmN93NLGK2tS|eQKGf@;F%8Ui{kk&EvEBp4!s1@0f%YRfc!}(@-#OKi z0plKrY{0=w2HMv^fUD}jw0h>mHTC_>p2_7km0tZE?I~{NG|a8-X=o-k`I-l)Ce|-1 zThZk=QU9RZb?eqYsJm#{!#sc+$!8cpz42XIw`LFaU0n|KPl*-+bkIZI)Q!csPc~q; zVBggbD6O^h6JnRl!4+-NQ%sJQj zxA0x9Shd&<9Z*9B4Rnyz;z$H*A0WUz7_VUqJIHEqq=Fh+7{L7^oRv@Jpe&o+>|5dq zYi^ZdeX-9Pt!qku{p`K`XfQHXL&93;oG20vCz+SS9ms{m4!Z|sUf*FoY?C#9NIvFO zuFE;~B-i7G4T)})d?GFj1F<)uYS2HxJ=`WcU_Dd=s)9XOEBfY2?FgDOq2Iz*r;r0; z5$l=@;LriqU@o&se!!|-qQZ)C3#A$Y^C#+v>XXdNCaW{Km~t)l2p&fD;H{R!U5k(v zalFA&YXavy>wU6rd`Nz2#<{P>Vv8T(5mXP(X(7w{DhJpA=1TPhp-i0fBgy>a<$6a@ z7l|H!o8ksLBtM%CjyG}#pOe4Fj`ezzzp+v!`f=48aVYXz{J&GY!nVoJ#`PX*P#y4MFrKz#e8w$`tsRO|Wa3eK<|2^|b zTFB~g{sj;2dJjv~(-d=Khg0WZfwk9L(k@k`@tB((X5tdKaP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91CZGcV z1ONa40RR91B>(^b0N|Qb%AhDk(0R9FeUmhE*DITVI5hyQphKvaOY0*eZ8DqyG} zrUH}-)>M#51v^v_rGl6WqErx5fq7n#INGshMmApFbDmt?FU=ikl9Ol8e(DnQ0Q*14 zzdUOJgIbf>!U|N_!ae+-GHmYP2@DjalhRPR0*=iC*;?@>82DYaY~V_pJSS+N>m@_a zm+L@pcne=ZFQk*TaH_&kqXw%{OHl(KUa8eO%Cwbya&u?}Q4 zoNNFCuV6}dV+FN?X}BG9akJ0Z4Lm{%H=r8PL;`k5OA@o8q~cS98EW+QX&}pb1s)b) zp#={OB(*GDatd}|i2Wy|!M;IWn7_$9R_~&H8ExN$e&Ba~4VE5W+G`tw1{>fje1bP{ z3A#dQ0cm*oI_0Gnr)ugdwQu@?qDRMN41J#^Zpv!`Xcc1|SSkRT~dRK5()eNQwZoxnUA3zH55n4D^9gXu+ zbM0X2-N7azzeakfPIXNCv1C8z3D|z{1izz451yj!?_G0ZE^gfKt?~6uzJ@STY{==m z)opCyhn}a!fYntMAvqhSL?) z@P#@HeWl(uCN@~b-h%eewZPd<4VE|5tUHR{6$*7_A`Kxc{|)rDBH;VMA4LC?LEOc#GDG;rE#TQw8&AOHULO(_{C)a`A zu2$+r z>k>LGJ*-9@MdFvv{f+(Fn1uzM*wk<>H3k}(l&8W@R!tYoDbdN@g4VeV&OIpK&rN<~ zYPf_NT@{LU#4K#!AzJ;5qdnK4UjW$y)m-I_t{M(Dj{yzWzy-X8r)cGCU<1|iRNCt5 z;|fhy?pTWhjr|>aPxbPkcng>gvm9c1#qx-yg;PiR1>0SQ_q?^gcshAs^=qlCTowdl~YH$80-n7#NbsZO%7i?Tr zS-d=Ju9Qgmu89-nTW2}`VH= zQ~7^p9~QYSCC9Tb?eD8(tCxZ0^A|p6T$LIq5qv*m#pSON;*yqMC-cafmU@+UT;#sf zVlTDG@o=keXz{VTQmf*0<{qE5OP&4Dt29MR+sgXAmOgupcICwvhn{$S&FskKS?wnq zb0i8_tv0Yo%uwijs`uthZs3#?{F9TeDHSGYroBw%s@lWMao+HZ->UUOpj71P>gTe~ HDWM4fAch|v literal 0 HcmV?d00001 diff --git a/assets/images/medical/lab_result_icon.png b/assets/images/medical/lab_result_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9425278f5831ecac7f49e134b2177cb6eb83e3c GIT binary patch literal 1208 zcmV;p1V{UcP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91DWC%Y z1ONa40RR91DgXcg0HjFVwEzGFE=fc|R9FekmEl#}NEAj%PX0%!AW8)|6);o~wgQw2 z;#7dB08s(n3gWE*Q32ixEGodMfW4R1_$Y%cEDR*yIoI>%&6_tL(%9_ny^M}&yM#Nq zgbDmnDsi)dDFmqC7M^VM4V#~;jE!fICk-_79cG>UoOmCaPR_7~Q-dLmF?oa9KM%nfrmh5%jtWU}Zc#>C#QKF0Lu)`kuJ>TZ$o+cfdW{E&5@z8F7;Vn4^z zzJ~Amk|T5JHQ08$cXTW5Vlv*jdaINAi@bl2Y8R7UZeP)hYwVqTaYKCv#3z}t_$?{$ zb)F}=-!hF)a?0uc03UX!hy!d=!NL+QItAwXex`7__qSkTmC$F5n7g zFoy=l$a4p!NgID@t5Rc^Y*J*#hIGXzj(M+s4Bk;~u zG4Z=bUv~pF1jt|?qUsp*jMg55uXoX|=ZxmY=x>Ufp$*+{w{-!g23x46Mxzyc28~YO z5XR_VikqPgsmVFTqP&Ac@`+EO1kEkLy({S3s~OiuD>XTxgLiQool;bRhtJy$Q^rmE ztuNcUCk<|{!LeyapGJVFbRP51Ip#Dg(uRJ!Q#B;YH2F&NhI3}=S$!tcny1bK8!zA* zmT(Ej&{fVP*4z?X^9?dsYZsFRU1H;3nv$=;13!R2G2Tb-?m1}M`T~~l3I2iaa0S*{ zGl5@JGOHnugb)71+>r||v~pfT0|i7K5v;&5RZe07nsfgYQe`COpwWBn@+5EQ@C81C z2P+S_fD$|?RYM|xPxUKQkZMJufDcf@-YzC5?DsVt!UB}J3@RrZv?4!+`G$4V*32Nl zP9|+sLJd)Y;3`fAMh#8})?KRMz~G%9&!~o8?>F?z$mh_&KKMrtDQEGh!CPx#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91AfN*P z1ONa40RR91D*ylh0QjD9*Z=?o8%ab#R9FeUl;LsPI1q)SoBMxC1?E){rUFqFn5n>2 z1(qu?RY80e7_Pud1%@jyT|wvy#8jaB9u0Wbh)78n<=)Ikyj=o|B}nPRhvQYSJd=AnLXwFK3kv=S~DWHQAq`yJ=$Rl3s-((wjOD4tC&1vnWahmRYYbZ^zTPm?hoYCsF_Kn-+IfP-}y8Q!TR(%e*9+oVYw4>h1Um6@nQ zrHNCk`#wz`5|1@dQy@LoD{`YxbjYT5&e+fJnu#A_Vu))iO#CL4bFekUpJ*O(H;g+q zb^=W@E4-B_u&==S+)hmW&De6 z_b%M`Gt^0BP{G*G&~bmegAKVH1~qg7Ei3fSmr%e0c0D=iUXE+qyZ4uFApbUNtby!p z*6V+PCvHv7T2CO3mTf@YN*6He-RUo9X-V5a!%cm$RXXW}v0ke;_4Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91B%lKT z1ONa40RR91Bme*a013vy#sB~VR7pfZR9FeMmF;yJF%U&@j{nE0fbAgL0ZIj-12z?y zRA9M+&;d#XAr&B3U{V3=3cRU++=nGc+3Y9acg|%rqnXhlcJ0YzGBL1+!v%S!R}Q0f zMTLfW0uPr^Mw10p@CkM>O1c?4s-ipDu&tgNX!K3Jqv)+v&{#LWg~31HTMncfGB9eW zu>)ls@D22>#TpjSrjv#`(9O1WOyVon%GDtrHn0Q59w7ti29&dhZ9x0V>wTt%-jJi& zEqnzXXkZRG=uP?nI$V1d82AZSf#28%(Ec1crO9nahG9=R%Opol*NLx#DsV}xY1wzy zv8FF+LsnVqZt+!@s=!f9!?mgJtjUm{%+TG16LRbfroq=*Xb2CIa!%IufXeqtjvmfb zJ~&^nF08w5D5SKTAvg3yc|0UOr1zm^^c{W{VpXswnIQvtI)8>ZRNFxX8+w~OoTUTR zwxdJFo^sYnPR@E+^ZWWJeMrurq#`u?fz2RFw{{25u#3SCd$ECZ#vDpeQw{JK*78@N z;ri4&(2%z*97m`@(QTS6WG^-(N~d;&V{U_Punm$VjlM6msRYjw|IseofqK2L6dazQvPE8{jA@R zroIc@CaEfJY>?zQ*6J7Snst*LLFH}X8yI+%HtehS_c|4?APajdtZ0*CLp23R1;}4R zssbnWPOSzzN^4fY*90ES#f~V%O53Ag(jE!Isz? zkQ6ssAP4?Z5A~F0J7|(4sJ~GLq!KDEYAW$(*R|lOuKtN;EyV@#1!yP@GJ_`R)_!S2 z*JiaiLylVgOUP?I3ViiyijNZZ;9;yv3iQqO?L17uK?OQw4%#mu zYQ^FfHlTf315c2{(J8T-b}SV&8AvyQwRREC2ui M07*qoM6N<$f<$z$DgXcg literal 0 HcmV?d00001 diff --git a/assets/images/medical/radiology_icon.png b/assets/images/medical/radiology_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e760d650364c8792746b380ad7f7597fb328b9c GIT binary patch literal 1491 zcmV;^1uXiBP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91C7=TU z1ONa40RR91D*ylh01PmlQ~&@4Nl8ROR9FeMmH&0rRuF{^hyPJ3h^Qb+1%9c3r2>lz zPzM$juvB2V0yY(_r~st`$rX61!1?a(j59n-UU8D#b3V2e`uf2ELE-d z>hBHZvFE-n7=6zV=Id+x0%uh*;fwWY3K)Xty)9k>%^bje#SW6i=qvA`2)%)Pm9%&l zCQI^sb9s^u7$NpsYN>+gAE-6&Qg7?Ux!5z%W(xt77UJs}UmLi7B^jZEkMJ2>-$~xV3z$F`a%m4;)HQgrCTgQL4A$iGcE*NSflIae zLO)(tL6TqxH4JbM@}(YHSS4+~u}N*9jT)=-P+^SVmr}gRhpg6K6LcW;(7`Hc<7AVH zsTA%2)z8`ECCIhK=*^7z#jAWW)Mdz(4xrzOzLp&vAQ|$tv7`%1chDHR*aW@B zinxK#ARSKO^jvc(U!b^yEBO7i{J7bB^VP4-S9lFQXiWthNbm*O|i$?E)&692|}n$H>Wt{`8x#hXCd zfY#+R>iwXON`o#fIDp>9-WZ9RnV^OSRJ&J^cfs3}i*M$&L@9yRC|NUj#HN1iM@D*MdgvYP1P=Pk5F#l|@b#qbKh~nd?F)s#f=xaRc zjTCVxXxWA_fRgqsfMP@H}yDp!(t+8bG=3X6DK|Xlkf|1gli}vO8fXm zQCt2bR5&H*uofgO&_)j+U+9ym?jeD60C^2)O$+Yn&1u~TaYo)1lm_9cw4oM>7F;?+ zJzZw7ydp;F0If^G)Vd99LA@O$a1A8#wQuES9utO!G@Pr%P;Zkp3hKS}{D2SHjLIH% zN`kajYYy_3ep5ZYJ2(yzqqITPCB-$2@CH5_Ux{0ge+4CIt=>ky#{p03^mwJmf_C`T zOmD!ug)gCZN3I`v2fBcy!{vX44qV?!HeOitb9R~kq-<~=p1A)Q+9*K@u0(PGtrJ_2 z3P^_XTnR(-$KG>qYRFe+^;}=xTbrwirR4`=Z~0s(&D7kpU*B1I55Q+hkLr1DPwDxmHg2=AnmQihxgXY9zbD>U?lT@WTYzgMX}vfX zdj@vdkT&qm^QgmWNU(>zAM1v`OMa}~pN+aupLOEKOSvw$)N|kWt!y?Ck6QW{-TMQ{ zr56_e%IdkYm@_kPvbxOt#s6mVxwx>&o7DPO`m@E@zN2{jQ;!Yut<{yq-s0KNGNISK z$tKU$Hh{p$B=Z)iS9Cicvaj0zarGchw{lRN#ugvD!_G-plOe zvZbYid&m_pHqul*rv}q6A1|ueGW1lhQpc1w)TfzK!t?_*^9kOMll*b!TpK>jz2C2>hV tobzI7>L-0|T0jRAxN4FTb}+yy{SCB?2F(eR$hH6g002ovPDHLkV1iQ0&P@OS literal 0 HcmV?d00001 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee8..e8efba11 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee8..399e9340 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/lib/main.dart b/lib/main.dart index 2eb5dd26..186ec52f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -53,6 +53,7 @@ class MyApp extends StatelessWidget { hintColor: Colors.grey[400], disabledColor: Colors.grey[300], errorColor: Color.fromRGBO(235, 80, 60, 1.0), + scaffoldBackgroundColor: Colors.grey[100], textSelectionColor: Color.fromRGBO(80, 100, 253, 0.5), textSelectionHandleColor: Color.fromRGBO(80, 100, 253, 1.0), canvasColor: Colors.white, @@ -63,7 +64,7 @@ class MyApp extends StatelessWidget { cursorColor: Color.fromRGBO(78, 62, 253, 1.0), iconTheme: IconThemeData(), appBarTheme: AppBarTheme( - color: Colors.grey, + color: Colors.grey[700], brightness: Brightness.light, elevation: 0.0, actionsIconTheme: IconThemeData( diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index ec9e1524..b92804a5 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,4 +1,6 @@ import 'package:diplomaticquarterapp/pages/landing/replay_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/medical_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; @@ -55,7 +57,7 @@ class _LandingPageState extends State { body: PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, - children: [HomePage(), ReplayPage(), Container(), Container()], + children: [HomePage(), ReplayPage(), MedicalPage(), MyAdmissionsPage()], ), bottomNavigationBar: BottomNavBar(changeIndex: _changeCurrentTab), ); diff --git a/lib/pages/medical/medical_page.dart b/lib/pages/medical/medical_page.dart new file mode 100644 index 00000000..049ba0bc --- /dev/null +++ b/lib/pages/medical/medical_page.dart @@ -0,0 +1,132 @@ +import 'dart:math'; + +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/others/sliver_app_bar_delegate.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class MedicalPage extends StatefulWidget { + @override + _MedicalPageState createState() => _MedicalPageState(); + +} + +class _MedicalPageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + body: CustomScrollView( + physics: BouncingScrollPhysics(), + key: PageStorageKey("medical"), + slivers: [ + SliverPersistentHeader( + delegate: SliverAppBarDelegate( + maxHeight: 200.0, + minHeight: 200.0, + child: Container( + width: double.infinity, + height: 200, + color: Colors.grey, + ), + ), + ), + SliverPersistentHeader( + delegate: SliverAppBarDelegate( + maxHeight: double.maxFinite, + minHeight: double.maxFinite, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 12.0), + child: Column( + children: [ + + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'My Doctor', + imagePath: 'doctor_icon.png', + subTitle: 'List', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Lab', + imagePath: 'lab_result_icon.png', + subTitle: 'Result', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Radiology', + imagePath: 'radiology_icon.png', + subTitle: 'Service', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Medicines', + imagePath: 'prescription_icon.png', + subTitle: 'Prescriptions', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Insurance', + imagePath: 'insurance_card_icon.png', + subTitle: 'Card', + ), + ), + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Insurance', + imagePath: 'insurance_approvals_icon.png', + subTitle: 'Approvals', + ), + ) + ], + ), + Row( + children: [ + Expanded( + flex: 1, + child: MedicalProfileItem( + title: 'Medical', + imagePath: 'medical_history_icon.png', + subTitle: 'Reports', + ), + ), + Expanded( + flex: 1, + child: Container(), + ) + + ], + ), + ], + ), + ), + ), + ), + ], + + ), + ); + } +} + + diff --git a/lib/pages/medical/my_admissions_page.dart b/lib/pages/medical/my_admissions_page.dart new file mode 100644 index 00000000..ff25884e --- /dev/null +++ b/lib/pages/medical/my_admissions_page.dart @@ -0,0 +1,61 @@ +import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; + +class MyAdmissionsPage extends StatefulWidget { + @override + _MyAdmissionsPageState createState() => _MyAdmissionsPageState(); +} + +class _MyAdmissionsPageState extends State { + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + AppExpandableNotifier( + title: 'Arryan Hospital', + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + DoctorCard( + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 3.8, + subName: 'Jammal', + ), + DoctorCard( + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 3.8, + subName: 'Jammal', + ), + ], + ), + ), + + AppExpandableNotifier( + title: 'Arryan Hospital', + bodyWidget: DoctorCard( + onTap: () { + //TODO when we need it + }, + name: 'Dr Mohammad Aljammal', + date: 'Feb 14, 2020', + profileUrl: + 'https://scontent.famm4-1.fna.fbcdn.net/v/t31.0-8/30425660_1862582094040824_7851633779570222226_o.jpg?_nc_cat=101&_nc_sid=09cbfe&_nc_eui2=AeF3TI6D2_tFS5QoQsqyaCKd2zBfzh74hOzbMF_OHviE7PQdLHRwmBoIOiKyWmK9MskOshPjkU73a5EdQMA3dqnV&_nc_ohc=1feou2fDCuIAX_Ra9qB&_nc_ht=scontent.famm4-1.fna&oh=709d34d1c284de1d0aa08ed37b0ac09a&oe=5F3C5ACB', + rat: 4.8, + subName: 'Jammal', + ), + ), + + ], + ), + ); + } +} diff --git a/lib/widgets/avatar/large_avatar.dart b/lib/widgets/avatar/large_avatar.dart index cd6ee539..ed904d03 100644 --- a/lib/widgets/avatar/large_avatar.dart +++ b/lib/widgets/avatar/large_avatar.dart @@ -16,9 +16,9 @@ class LargeAvatar extends StatelessWidget { @required this.name, this.url, this.disableProfileView: false, - this.radius = 60.0, - this.width = 90, - this.height = 90, + this.radius = 70.0, + this.width = 70, + this.height = 60, this.onTap}) : super(key: key); @@ -71,7 +71,7 @@ class LargeAvatar extends StatelessWidget { offset: Offset(0.0, 5.0), blurRadius: 16.0) ], - borderRadius: BorderRadius.all(Radius.circular(50.0)), + borderRadius: BorderRadius.all(Radius.circular(radius)), ), width: width, height: height, diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart new file mode 100644 index 00000000..e9a94895 --- /dev/null +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -0,0 +1,99 @@ +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/rounded_container_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; + +class DoctorCard extends StatelessWidget { + final String name; + final String subName; + final double rat; + final String date; + final String profileUrl; + final Function onTap; + + DoctorCard( + {this.name, + this.subName, + this.rat, + this.date, + this.profileUrl, + this.onTap}); + + @override + Widget build(BuildContext context) { + return RoundedContainer( + child: InkWell( + onTap: onTap, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Expanded( + flex: 1, + child: LargeAvatar( + name: name, + url: profileUrl, + ), + ), + Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + name, + bold: true, + ), + Texts( + subName, + variant: 'bodyText', + ), + StarRating(totalAverage: rat, forceStars: true), + ], + ), + ), + ), + ], + ), + ), + + Divider( + height: 8, + color: Colors.grey[400], + ), + Padding( + padding: const EdgeInsets.all(5.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: 10, + ), + Image.asset( + 'assets/images/Icon-awesome-calendar.png', + width: 30, + height: 30, + ), + Expanded( + child: Texts( + date, + variant: 'bodyText', + ), + ) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/data_display/medical/medical_profile_item.dart b/lib/widgets/data_display/medical/medical_profile_item.dart new file mode 100644 index 00000000..6357d830 --- /dev/null +++ b/lib/widgets/data_display/medical/medical_profile_item.dart @@ -0,0 +1,53 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/widgets/others/rounded_container_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class MedicalProfileItem extends StatelessWidget { + MedicalProfileItem({ + @required this.imagePath, + @required this.title, + @required this.subTitle, + }); + + final String imagePath; + final String title; + final String subTitle; + + @override + Widget build(BuildContext context) { + return RoundedContainer( + child: Container( + padding: EdgeInsets.all(5), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 1.7 * SizeConfig.textMultiplier, + color: Hexcolor('#B8382C'), + fontWeight: FontWeight.bold), + ), + RichText( + text: TextSpan( + style: TextStyle(color: Colors.black), + children: [ + TextSpan(text: subTitle), + ], + ), + ), + Align( + alignment: Alignment.bottomRight, + child: Image.asset( + "assets/images/medical/$imagePath", + height: SizeConfig.heightMultiplier * 7, + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/others/StarRating.dart b/lib/widgets/others/StarRating.dart new file mode 100644 index 00000000..f33ced32 --- /dev/null +++ b/lib/widgets/others/StarRating.dart @@ -0,0 +1,39 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:eva_icons_flutter/eva_icons_flutter.dart'; +import 'package:flutter/material.dart'; + +class StarRating extends StatelessWidget { + + final double totalAverage; + final double size; + final int totalCount; + final bool forceStars; + + StarRating({Key key, this.totalAverage: 0.0, this.size: 16.0, this.totalCount, this.forceStars = false}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + if (!forceStars && (totalAverage==null || totalAverage==0)) + Texts("New", style: "caption"), + if (forceStars || (totalAverage!=null && totalAverage>0)) + ...List.generate(5, (index) => + Padding( + padding: EdgeInsets.only(right: 1.0), + child: Icon( + (index+1) <= (totalAverage ?? 0) ? EvaIcons.star : EvaIcons.starOutline, + size: size, + color: (index+1) <= (totalAverage ?? 0) ? Color.fromRGBO(255, 186, 0, 1.0) : Theme.of(context).hintColor + ), + ) + ), + if (totalCount!=null) + SizedBox(width: 9.0), + if (totalCount!=null) + Texts("("+totalCount.toString()+")", style: "overline", color: Colors.grey[400],) + ] + ); + } +} \ No newline at end of file diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index fca61f1f..0e2a3c4b 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -19,7 +19,7 @@ class AppExpandableNotifier extends StatelessWidget { Widget build(BuildContext context) { return ExpandableNotifier( child: Padding( - padding: const EdgeInsets.all(10), + padding: const EdgeInsets.only(left: 10,right: 10,top: 4), child: Card( clipBehavior: Clip.antiAlias, child: Column( @@ -39,14 +39,14 @@ class AppExpandableNotifier extends StatelessWidget { padding: EdgeInsets.all(10), child: Text( title, - style: TextStyle(fontWeight: FontWeight.bold), + style: TextStyle(fontWeight: FontWeight.bold,fontSize: 22,), ), ), - collapsed: collapsed, + collapsed: collapsed ?? Container(), expanded: bodyWidget, builder: (_, collapsed, expanded) { return Padding( - padding: EdgeInsets.only(left: 10, right: 10, bottom: 10), + padding: EdgeInsets.only(left: 5, right: 5, bottom: 5), child: Expandable( collapsed: collapsed, expanded: expanded, diff --git a/lib/widgets/others/card_with_bg_widget.dart b/lib/widgets/others/card_with_bg_widget.dart new file mode 100644 index 00000000..1b96008a --- /dev/null +++ b/lib/widgets/others/card_with_bg_widget.dart @@ -0,0 +1,71 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +/* + *@author: Mohammad Aljammal + *@Date:27/4/2020 + *@param: Widget + *@return: + *@desc: Card With Bg Widget + */ + +class CardWithBgWidget extends StatelessWidget { + final Widget child; + + CardWithBgWidget({@required this.child}); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectProvider = Provider.of(context); + return Container( + margin: EdgeInsets.symmetric(vertical: 10.0), + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(color: Colors.grey, width: 1.0), + ), + child: Material( + borderRadius: BorderRadius.all(Radius.circular(10.0)), + child: Stack( + children: [ + if (projectProvider.isArabic) + Positioned( + child: Container( + width: 10, + color: Hexcolor('#58434F'), + ), + bottom: 0, + top: 0, + right: 0, + ) + else + Positioned( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(9.0), + bottomLeft: Radius.circular(9.0), + ),color: Colors.blueAccent, + + ), + width: 15, + + ), + bottom: 0, + top: 0, + left: 0, + ), + Container( + padding: EdgeInsets.all(15.0), + margin: EdgeInsets.only(left: 10), + child: child) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/others/rounded_container_widget.dart b/lib/widgets/others/rounded_container_widget.dart new file mode 100644 index 00000000..58d9a034 --- /dev/null +++ b/lib/widgets/others/rounded_container_widget.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +/// DESCRIPTION : Custom widget for rounded container and custom decoration + +class RoundedContainer extends StatefulWidget { + final double width; + final double height; + final double raduis; + final Color backgroundColor; + final double margin; + final double elevation; + final bool showBorder; + final Color borderColor; + final bool customCornerRaduis; + final double topLeft; + final double bottomRight; + final double topRight; + final double bottomLeft; + final Widget child; + final double borderWidth; + + RoundedContainer( + {@required this.child, + this.width, + this.height, + this.raduis = 10, + this.backgroundColor = Colors.white, + this.margin = 10, + this.elevation = 1, + this.showBorder = false, + this.borderColor = Colors.grey, + this.customCornerRaduis = false, + this.topLeft = 0, + this.topRight = 0, + this.bottomRight = 0, + this.bottomLeft = 0, + this.borderWidth = 1}); + + @override + _RoundedContainerState createState() => _RoundedContainerState(); +} + +class _RoundedContainerState extends State { + @override + Widget build(BuildContext context) { + return Container( + width: widget.width, + height: widget.height, + margin: EdgeInsets.all(widget.margin), + decoration: widget.showBorder == true + ? BoxDecoration( + color: Theme.of(context).primaryColor, + border: Border.all( + color: widget.borderColor, width: widget.borderWidth), + borderRadius: widget.customCornerRaduis + ? BorderRadius.only( + topLeft: Radius.circular(widget.topLeft), + topRight: Radius.circular(widget.topRight), + bottomRight: Radius.circular(widget.bottomRight), + bottomLeft: Radius.circular(widget.bottomLeft)) + : BorderRadius.circular(widget.raduis), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 10, + blurRadius: 5, + offset: Offset(0, 5), // changes position of shadow + ), + ]) + : null, + child: Card( + margin: EdgeInsets.all(0), + shape: RoundedRectangleBorder( + borderRadius: widget.customCornerRaduis + ? BorderRadius.only( + topLeft: Radius.circular(widget.topLeft), + topRight: Radius.circular(widget.topRight), + bottomRight: Radius.circular(widget.bottomRight), + bottomLeft: Radius.circular(widget.bottomLeft)) + : BorderRadius.circular(widget.raduis), + ), + color: widget.backgroundColor, + child: widget.child, + )); + } +} diff --git a/lib/widgets/others/sliver_app_bar_delegate.dart b/lib/widgets/others/sliver_app_bar_delegate.dart new file mode 100644 index 00000000..49c9b4fd --- /dev/null +++ b/lib/widgets/others/sliver_app_bar_delegate.dart @@ -0,0 +1,34 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +class SliverAppBarDelegate extends SliverPersistentHeaderDelegate { + SliverAppBarDelegate({ + @required this.minHeight, + @required this.maxHeight, + @required this.child, + }); + + final double minHeight; + final double maxHeight; + final Widget child; + + @override + double get minExtent => minHeight; + + @override + double get maxExtent => max(maxHeight, minHeight); + + @override + Widget build( + BuildContext context, + double shrinkOffset, + bool overlapsContent) + { + return new SizedBox.expand(child: child); + } + @override + bool shouldRebuild(SliverAppBarDelegate oldDelegate) { + return false; + } +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 4bb76eaa..426404b8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -84,6 +84,7 @@ flutter: # assets: assets: - assets/images/ + - assets/images/medical/ fonts: - family: WorkSans From 8de50bfe74d52bce001334df8d26b904b6c7cd72 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 4 Aug 2020 14:22:22 +0300 Subject: [PATCH 2/3] medical - my doctor and prescription services and pages --- lib/config/config.dart | 15 +- lib/core/enum/filter_type.dart | 1 + lib/core/model/doctor/doctor_profile.dart | 176 ++++++++++ lib/core/model/doctor/doctor_rating.dart | 32 ++ .../doctor/patient_doctor_appointment.dart | 325 ++++++++++++++++++ .../reques_patient_doctor_appointmentt.dart | 76 ++++ .../model/doctor/request_doctor_profile.dart | 72 ++++ .../model/doctor/request_doctor_rating.dart | 52 +++ .../model/prescriptions/Prescriptions.dart | 155 +++++++++ .../prescriptions/prescription_report.dart | 127 +++++++ .../prescriptions/prescriptions_order.dart | 134 ++++++++ .../request_prescription_report.dart | 88 +++++ .../prescriptions/request_prescriptions.dart | 64 ++++ .../request_prescriptions_orders.dart | 52 +++ .../request_send_prescription_email.dart | 112 ++++++ lib/core/service/client/base_app_client.dart | 1 + .../service/medical/my_doctor_service.dart | 102 ++++++ .../medical/prescriptions_service.dart | 149 ++++++++ .../medical/my_doctor_view_model.dart | 97 ++++++ .../medical/prescriptions_view_model.dart | 126 +++++++ lib/locator.dart | 8 + .../MyAppointments/AppointmentDetails.dart | 2 +- lib/pages/landing/landing_page.dart | 5 +- .../medical/doctor/doctor_home_page.dart | 110 ++++++ .../doctor/doctor_information_page.dart | 199 +++++++++++ .../medical/doctor/doctor_profile_page.dart | 181 ++++++++++ ...al_page.dart => medical_profile_page.dart} | 56 +-- .../prescription_details_page.dart | 175 ++++++++++ .../prescription_items_page.dart | 112 ++++++ .../prescriptions/prescriptions_history.dart | 13 + .../prescriptions_home_page.dart | 122 +++++++ .../prescriptions/prescriptions_page.dart | 102 ++++++ lib/widgets/buttons/button.dart | 4 +- .../data_display/medical/doctor_card.dart | 168 +++++---- lib/widgets/others/app_scaffold_widget.dart | 4 +- lib/widgets/others/card_with_bg_widget.dart | 6 +- 36 files changed, 3134 insertions(+), 89 deletions(-) create mode 100644 lib/core/enum/filter_type.dart create mode 100644 lib/core/model/doctor/doctor_profile.dart create mode 100644 lib/core/model/doctor/doctor_rating.dart create mode 100644 lib/core/model/doctor/patient_doctor_appointment.dart create mode 100644 lib/core/model/doctor/reques_patient_doctor_appointmentt.dart create mode 100644 lib/core/model/doctor/request_doctor_profile.dart create mode 100644 lib/core/model/doctor/request_doctor_rating.dart create mode 100644 lib/core/model/prescriptions/Prescriptions.dart create mode 100644 lib/core/model/prescriptions/prescription_report.dart create mode 100644 lib/core/model/prescriptions/prescriptions_order.dart create mode 100644 lib/core/model/prescriptions/request_prescription_report.dart create mode 100644 lib/core/model/prescriptions/request_prescriptions.dart create mode 100644 lib/core/model/prescriptions/request_prescriptions_orders.dart create mode 100644 lib/core/model/prescriptions/request_send_prescription_email.dart create mode 100644 lib/core/service/medical/my_doctor_service.dart create mode 100644 lib/core/service/medical/prescriptions_service.dart create mode 100644 lib/core/viewModels/medical/my_doctor_view_model.dart create mode 100644 lib/core/viewModels/medical/prescriptions_view_model.dart create mode 100644 lib/pages/medical/doctor/doctor_home_page.dart create mode 100644 lib/pages/medical/doctor/doctor_information_page.dart create mode 100644 lib/pages/medical/doctor/doctor_profile_page.dart rename lib/pages/medical/{medical_page.dart => medical_profile_page.dart} (68%) create mode 100644 lib/pages/medical/prescriptions/prescription_details_page.dart create mode 100644 lib/pages/medical/prescriptions/prescription_items_page.dart create mode 100644 lib/pages/medical/prescriptions/prescriptions_history.dart create mode 100644 lib/pages/medical/prescriptions/prescriptions_home_page.dart create mode 100644 lib/pages/medical/prescriptions/prescriptions_page.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 60e9bbd3..a4e7a415 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -9,8 +9,21 @@ const MAX_SMALL_SCREEN = 660; const BASE_URL = 'https://hmgwebservices.com/Services'; const GET_PROJECT = '/Lists.svc/REST/GetProject'; + +///Doctor +const GET_MY_DOCTOR = '/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; +const GET_DOCTOR_PROFILE = '/Doctors.svc/REST/GetDocProfiles'; +const GET_DOCTOR_RATING = '/Doctors.svc/REST/dr_GetAvgDoctorRating'; + + +///Prescriptions +const PRESCRIPTIONS = '/Patients.svc/REST/GetPrescriptionApptList'; +const GET_PRESCRIPTIONS_ALL_ORDERS = '/Patients.svc/REST/PatientER_GetPatientAllPresOrders'; +const GET_PRESCRIPTION_REPORT = '/Patients.svc/REST/INP_GetPrescriptionReport'; +const SEND_PRESCRIPTION_EMAIL = '/Notifications.svc/REST/SendPrescriptionEmail'; + //const BASE_URL = 'https://hmgwebservices.com/'; // Production Environment -//const BASE_URL = 'https://uat.hmgwebservices.com/'; // UAT Environment +//const BASE_URL = 'https://uat.hmgwebservices.com/Services'; // UAT Environment //URL to get clinic list diff --git a/lib/core/enum/filter_type.dart b/lib/core/enum/filter_type.dart new file mode 100644 index 00000000..9da35c43 --- /dev/null +++ b/lib/core/enum/filter_type.dart @@ -0,0 +1 @@ +enum FilterType { Clinic, Hospital } diff --git a/lib/core/model/doctor/doctor_profile.dart b/lib/core/model/doctor/doctor_profile.dart new file mode 100644 index 00000000..9e222e5a --- /dev/null +++ b/lib/core/model/doctor/doctor_profile.dart @@ -0,0 +1,176 @@ +class DoctorProfile { + int doctorID; + String doctorName; + Null doctorNameN; + int clinicID; + String clinicDescription; + Null clinicDescriptionN; + Null licenseExpiry; + int employmentType; + Null setupID; + int projectID; + String projectName; + String nationalityID; + String nationalityName; + Null nationalityNameN; + int gender; + String genderDescription; + Null genderDescriptionN; + Null doctorTitle; + Null projectNameN; + bool isAllowWaitList; + String titleDescription; + Null titleDescriptionN; + Null isRegistered; + Null isDoctorDummy; + bool isActive; + Null isDoctorAppointmentDisplayed; + bool doctorClinicActive; + Null isbookingAllowed; + String doctorCases; + Null doctorPicture; + String doctorProfileInfo; + List specialty; + int actualDoctorRate; + String doctorImageURL; + int doctorRate; + String doctorTitleForProfile; + bool isAppointmentAllowed; + String nationalityFlagURL; + int noOfPatientsRate; + String qR; + int serviceID; + + DoctorProfile( + {this.doctorID, + this.doctorName, + this.doctorNameN, + this.clinicID, + this.clinicDescription, + this.clinicDescriptionN, + this.licenseExpiry, + this.employmentType, + this.setupID, + this.projectID, + this.projectName, + this.nationalityID, + this.nationalityName, + this.nationalityNameN, + this.gender, + this.genderDescription, + this.genderDescriptionN, + this.doctorTitle, + this.projectNameN, + this.isAllowWaitList, + this.titleDescription, + this.titleDescriptionN, + this.isRegistered, + this.isDoctorDummy, + this.isActive, + this.isDoctorAppointmentDisplayed, + this.doctorClinicActive, + this.isbookingAllowed, + this.doctorCases, + this.doctorPicture, + this.doctorProfileInfo, + this.specialty, + this.actualDoctorRate, + this.doctorImageURL, + this.doctorRate, + this.doctorTitleForProfile, + this.isAppointmentAllowed, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.qR, + this.serviceID}); + + DoctorProfile.fromJson(Map json) { + doctorID = json['DoctorID']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + clinicID = json['ClinicID']; + clinicDescription = json['ClinicDescription']; + clinicDescriptionN = json['ClinicDescriptionN']; + licenseExpiry = json['LicenseExpiry']; + employmentType = json['EmploymentType']; + setupID = json['SetupID']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + nationalityID = json['NationalityID']; + nationalityName = json['NationalityName']; + nationalityNameN = json['NationalityNameN']; + gender = json['Gender']; + genderDescription = json['Gender_Description']; + genderDescriptionN = json['Gender_DescriptionN']; + doctorTitle = json['DoctorTitle']; + projectNameN = json['ProjectNameN']; + isAllowWaitList = json['IsAllowWaitList']; + titleDescription = json['Title_Description']; + titleDescriptionN = json['Title_DescriptionN']; + isRegistered = json['IsRegistered']; + isDoctorDummy = json['IsDoctorDummy']; + isActive = json['IsActive']; + isDoctorAppointmentDisplayed = json['IsDoctorAppointmentDisplayed']; + doctorClinicActive = json['DoctorClinicActive']; + isbookingAllowed = json['IsbookingAllowed']; + doctorCases = json['DoctorCases']; + doctorPicture = json['DoctorPicture']; + doctorProfileInfo = json['DoctorProfileInfo']; + specialty = json['Specialty'].cast(); + actualDoctorRate = json['ActualDoctorRate']; + doctorImageURL = json['DoctorImageURL']; + doctorRate = json['DoctorRate']; + doctorTitleForProfile = json['DoctorTitleForProfile']; + isAppointmentAllowed = json['IsAppointmentAllowed']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + qR = json['QR']; + serviceID = json['ServiceID']; + } + + Map toJson() { + final Map data = new Map(); + data['DoctorID'] = this.doctorID; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['ClinicID'] = this.clinicID; + data['ClinicDescription'] = this.clinicDescription; + data['ClinicDescriptionN'] = this.clinicDescriptionN; + data['LicenseExpiry'] = this.licenseExpiry; + data['EmploymentType'] = this.employmentType; + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['NationalityID'] = this.nationalityID; + data['NationalityName'] = this.nationalityName; + data['NationalityNameN'] = this.nationalityNameN; + data['Gender'] = this.gender; + data['Gender_Description'] = this.genderDescription; + data['Gender_DescriptionN'] = this.genderDescriptionN; + data['DoctorTitle'] = this.doctorTitle; + data['ProjectNameN'] = this.projectNameN; + data['IsAllowWaitList'] = this.isAllowWaitList; + data['Title_Description'] = this.titleDescription; + data['Title_DescriptionN'] = this.titleDescriptionN; + data['IsRegistered'] = this.isRegistered; + data['IsDoctorDummy'] = this.isDoctorDummy; + data['IsActive'] = this.isActive; + data['IsDoctorAppointmentDisplayed'] = this.isDoctorAppointmentDisplayed; + data['DoctorClinicActive'] = this.doctorClinicActive; + data['IsbookingAllowed'] = this.isbookingAllowed; + data['DoctorCases'] = this.doctorCases; + data['DoctorPicture'] = this.doctorPicture; + data['DoctorProfileInfo'] = this.doctorProfileInfo; + data['Specialty'] = this.specialty; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorRate'] = this.doctorRate; + data['DoctorTitleForProfile'] = this.doctorTitleForProfile; + data['IsAppointmentAllowed'] = this.isAppointmentAllowed; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['QR'] = this.qR; + data['ServiceID'] = this.serviceID; + return data; + } +} diff --git a/lib/core/model/doctor/doctor_rating.dart b/lib/core/model/doctor/doctor_rating.dart new file mode 100644 index 00000000..f02e052b --- /dev/null +++ b/lib/core/model/doctor/doctor_rating.dart @@ -0,0 +1,32 @@ +class DoctorRating { + Null projectID; + Null clinicID; + int doctorID; + int patientNumber; + int doctorRate; + + DoctorRating( + {this.projectID, + this.clinicID, + this.doctorID, + this.patientNumber, + this.doctorRate}); + + DoctorRating.fromJson(Map json) { + projectID = json['ProjectID']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + patientNumber = json['PatientNumber']; + doctorRate = json['DoctorRate']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + data['PatientNumber'] = this.patientNumber; + data['DoctorRate'] = this.doctorRate; + return data; + } +} diff --git a/lib/core/model/doctor/patient_doctor_appointment.dart b/lib/core/model/doctor/patient_doctor_appointment.dart new file mode 100644 index 00000000..265561cd --- /dev/null +++ b/lib/core/model/doctor/patient_doctor_appointment.dart @@ -0,0 +1,325 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class PatientDoctorAppointment { + String setupID; + int projectID; + int appointmentNo; + DateTime appointmentDate; + String appointmentDateN; + bool appointmentType; + DateTime bookDate; + bool patientType; + int patientID; + int clinicID; + int doctorID; + DateTime endDate; + String startTime; + String endTime; + bool status; + bool visitType; + String visitFor; + String patientStatusType; + String actualVisitStartTime; + String actualVisitEndTime; + bool isReminderActivated; + String reminderDisplayInterval; + String reminderDisplayIntervalUnit; + String mainAppointmentNo; + String notes; + int companyID; + String dHCCPatApptRef; + String bookedBy; + DateTime bookedOn; + String confirmedBy; + DateTime confirmedOn; + String arrivalChangedBy; + DateTime arrivedOn; + String rescheduledBy; + String rescheduledOn; + String mRStatus; + String mRSentBy; + String mRSentOn; + String mRReceiptBy; + String mRReceiptOn; + String isDocumentScanned; + String documentScanDateTime; + String documentScannedUser; + String editedBy; + String editedOn; + String isRecordedByNurse; + String isCheckedByDoctor; + String isVisitClosed; + String isRecurring; + String isPersonallyConfirmed; + String confirmationBy; + String relationId; + int appointmentDays; + int isActive; + int actualDoctorRate; + String clinicName; + String doctorCases; + String doctorImageURL; + String doctorInfo; + String doctorName; + int doctorRate; + String doctorTitle; + int gender; + String genderDescription; + bool isActiveDoctorProfile; + bool isAppointmentAllowed; + bool isDoctorAllowVedioCall; + String nationalityFlagURL; + String nationalityID; + String nationalityName; + int noOfPatientsRate; + String projectName; + String qR; + List speciality; + + PatientDoctorAppointment( + {this.setupID, + this.projectID, + this.appointmentNo, + this.appointmentDate, + this.appointmentDateN, + this.appointmentType, + this.bookDate, + this.patientType, + this.patientID, + this.clinicID, + this.doctorID, + this.endDate, + this.startTime, + this.endTime, + this.status, + this.visitType, + this.visitFor, + this.patientStatusType, + this.actualVisitStartTime, + this.actualVisitEndTime, + this.isReminderActivated, + this.reminderDisplayInterval, + this.reminderDisplayIntervalUnit, + this.mainAppointmentNo, + this.notes, + this.companyID, + this.dHCCPatApptRef, + this.bookedBy, + this.bookedOn, + this.confirmedBy, + this.confirmedOn, + this.arrivalChangedBy, + this.arrivedOn, + this.rescheduledBy, + this.rescheduledOn, + this.mRStatus, + this.mRSentBy, + this.mRSentOn, + this.mRReceiptBy, + this.mRReceiptOn, + this.isDocumentScanned, + this.documentScanDateTime, + this.documentScannedUser, + this.editedBy, + this.editedOn, + this.isRecordedByNurse, + this.isCheckedByDoctor, + this.isVisitClosed, + this.isRecurring, + this.isPersonallyConfirmed, + this.confirmationBy, + this.relationId, + this.appointmentDays, + this.isActive, + this.actualDoctorRate, + this.clinicName, + this.doctorCases, + this.doctorImageURL, + this.doctorInfo, + this.doctorName, + this.doctorRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.isActiveDoctorProfile, + this.isAppointmentAllowed, + this.isDoctorAllowVedioCall, + this.nationalityFlagURL, + this.nationalityID, + this.nationalityName, + this.noOfPatientsRate, + this.projectName, + this.qR, + this.speciality}); + + PatientDoctorAppointment.fromJson(Map json) { + try { + setupID = json['SetupID']; + projectID = json['ProjectID']; + appointmentNo = json['AppointmentNo']; + appointmentDate = DateUtil.convertStringToDate(json['AppointmentDate']); + appointmentDateN = json['AppointmentDateN']; + appointmentType = json['AppointmentType']; + bookDate = DateUtil.convertStringToDate(json['BookDate']); + patientType = json['PatientType']; + patientID = json['PatientID']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + endDate = DateUtil.convertStringToDate(json['EndDate']); + startTime = json['StartTime']; + endTime = json['EndTime']; + status = json['Status']; + visitType = json['VisitType']; + visitFor = json['VisitFor']; + patientStatusType = json['PatientStatusType']; + actualVisitStartTime = json['ActualVisitStartTime']; + actualVisitEndTime = json['ActualVisitEndTime']; + isReminderActivated = json['IsReminderActivated']; + reminderDisplayInterval = json['ReminderDisplayInterval']; + reminderDisplayIntervalUnit = json['ReminderDisplayIntervalUnit']; + mainAppointmentNo = json['MainAppointmentNo']; + notes = json['Notes']; + companyID = json['CompanyID']; + dHCCPatApptRef = json['DHCCPatApptRef']; + bookedBy = json['BookedBy']; + // bookedOn = DateUtil.convertStringToDate(json['BookedOn']); + confirmedBy = json['ConfirmedBy']; + // confirmedOn = DateUtil.convertStringToDate(json['ConfirmedOn']); + arrivalChangedBy = json['ArrivalChangedBy']; + // arrivedOn = DateUtil.convertStringToDate(json['ArrivedOn']); + rescheduledBy = json['RescheduledBy']; + rescheduledOn = json['RescheduledOn']; + mRStatus = json['MRStatus']; + mRSentBy = json['MRSentBy']; + mRSentOn = json['MRSentOn']; + mRReceiptBy = json['MRReceiptBy']; + mRReceiptOn = json['MRReceiptOn']; + isDocumentScanned = json['IsDocumentScanned']; + documentScanDateTime = json['DocumentScanDateTime']; + documentScannedUser = json['DocumentScannedUser']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + isRecordedByNurse = json['IsRecordedByNurse']; + isCheckedByDoctor = json['IsCheckedByDoctor']; + isVisitClosed = json['IsVisitClosed']; + isRecurring = json['IsRecurring']; + isPersonallyConfirmed = json['IsPersonallyConfirmed']; + confirmationBy = json['ConfirmationBy']; + relationId = json['RelationId']; + appointmentDays = json['AppointmentDays']; + isActive = json['IsActive']; + actualDoctorRate = json['ActualDoctorRate']; + clinicName = json['ClinicName']; + doctorCases = json['DoctorCases']; + doctorImageURL = json['DoctorImageURL']; + doctorInfo = json['DoctorInfo']; + doctorName = json['DoctorName']; + doctorRate = json['DoctorRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isAppointmentAllowed = json['IsAppointmentAllowed']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + nationalityFlagURL = json['NationalityFlagURL']; + nationalityID = json['NationalityID']; + nationalityName = json['NationalityName']; + noOfPatientsRate = json['NoOfPatientsRate']; + projectName = json['ProjectName']; + qR = json['QR']; + // speciality = json['Speciality'].cast(); + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentDateN'] = this.appointmentDateN; + data['AppointmentType'] = this.appointmentType; + data['BookDate'] = this.bookDate; + data['PatientType'] = this.patientType; + data['PatientID'] = this.patientID; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + data['EndDate'] = this.endDate; + data['StartTime'] = this.startTime; + data['EndTime'] = this.endTime; + data['Status'] = this.status; + data['VisitType'] = this.visitType; + data['VisitFor'] = this.visitFor; + data['PatientStatusType'] = this.patientStatusType; + data['ActualVisitStartTime'] = this.actualVisitStartTime; + data['ActualVisitEndTime'] = this.actualVisitEndTime; + data['IsReminderActivated'] = this.isReminderActivated; + data['ReminderDisplayInterval'] = this.reminderDisplayInterval; + data['ReminderDisplayIntervalUnit'] = this.reminderDisplayIntervalUnit; + data['MainAppointmentNo'] = this.mainAppointmentNo; + data['Notes'] = this.notes; + data['CompanyID'] = this.companyID; + data['DHCCPatApptRef'] = this.dHCCPatApptRef; + data['BookedBy'] = this.bookedBy; + data['BookedOn'] = this.bookedOn; + data['ConfirmedBy'] = this.confirmedBy; + data['ConfirmedOn'] = this.confirmedOn; + data['ArrivalChangedBy'] = this.arrivalChangedBy; + data['ArrivedOn'] = this.arrivedOn; + data['RescheduledBy'] = this.rescheduledBy; + data['RescheduledOn'] = this.rescheduledOn; + data['MRStatus'] = this.mRStatus; + data['MRSentBy'] = this.mRSentBy; + data['MRSentOn'] = this.mRSentOn; + data['MRReceiptBy'] = this.mRReceiptBy; + data['MRReceiptOn'] = this.mRReceiptOn; + data['IsDocumentScanned'] = this.isDocumentScanned; + data['DocumentScanDateTime'] = this.documentScanDateTime; + data['DocumentScannedUser'] = this.documentScannedUser; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['IsRecordedByNurse'] = this.isRecordedByNurse; + data['IsCheckedByDoctor'] = this.isCheckedByDoctor; + data['IsVisitClosed'] = this.isVisitClosed; + data['IsRecurring'] = this.isRecurring; + data['IsPersonallyConfirmed'] = this.isPersonallyConfirmed; + data['ConfirmationBy'] = this.confirmationBy; + data['RelationId'] = this.relationId; + data['AppointmentDays'] = this.appointmentDays; + data['IsActive'] = this.isActive; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicName'] = this.clinicName; + data['DoctorCases'] = this.doctorCases; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorInfo'] = this.doctorInfo; + data['DoctorName'] = this.doctorName; + data['DoctorRate'] = this.doctorRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsAppointmentAllowed'] = this.isAppointmentAllowed; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NationalityID'] = this.nationalityID; + data['NationalityName'] = this.nationalityName; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['Speciality'] = this.speciality; + return data; + } +} + +class PatientDoctorAppointmentList{ + + String filterName =""; + List patientDoctorAppointmentList = List(); + + PatientDoctorAppointmentList({this.filterName,PatientDoctorAppointment patientDoctorAppointment}){ + patientDoctorAppointmentList.add(patientDoctorAppointment); + } + +} diff --git a/lib/core/model/doctor/reques_patient_doctor_appointmentt.dart b/lib/core/model/doctor/reques_patient_doctor_appointmentt.dart new file mode 100644 index 00000000..8ed90132 --- /dev/null +++ b/lib/core/model/doctor/reques_patient_doctor_appointmentt.dart @@ -0,0 +1,76 @@ +class RequestPatientDoctorAppointment { + int top; + double versionID; + int beforeDays; + int exludType; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + + RequestPatientDoctorAppointment( + {this.top, + this.versionID, + this.beforeDays, + this.exludType, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType}); + + RequestPatientDoctorAppointment.fromJson(Map json) { + top = json['Top']; + versionID = json['VersionID']; + beforeDays = json['beforeDays']; + exludType = json['exludType']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + } + + Map toJson() { + final Map data = new Map(); + data['Top'] = this.top; + data['VersionID'] = this.versionID; + data['beforeDays'] = this.beforeDays; + data['exludType'] = this.exludType; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + return data; + } +} diff --git a/lib/core/model/doctor/request_doctor_profile.dart b/lib/core/model/doctor/request_doctor_profile.dart new file mode 100644 index 00000000..80766b3f --- /dev/null +++ b/lib/core/model/doctor/request_doctor_profile.dart @@ -0,0 +1,72 @@ +class RequestDoctorProfile { + int doctorID; + bool license; + bool isRegistered; + int projectID; + int clinicID; + int patientID; + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + + RequestDoctorProfile( + {this.doctorID, + this.license, + this.isRegistered, + this.projectID, + this.clinicID, + this.patientID, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID}); + + RequestDoctorProfile.fromJson(Map json) { + doctorID = json['doctorID']; + license = json['License']; + isRegistered = json['IsRegistered']; + projectID = json['ProjectID']; + clinicID = json['ClinicID']; + patientID = json['PatientID']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + } + + Map toJson() { + final Map data = new Map(); + data['doctorID'] = this.doctorID; + data['License'] = this.license; + data['IsRegistered'] = this.isRegistered; + data['ProjectID'] = this.projectID; + data['ClinicID'] = this.clinicID; + data['PatientID'] = this.patientID; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + return data; + } +} diff --git a/lib/core/model/doctor/request_doctor_rating.dart b/lib/core/model/doctor/request_doctor_rating.dart new file mode 100644 index 00000000..fcc9386b --- /dev/null +++ b/lib/core/model/doctor/request_doctor_rating.dart @@ -0,0 +1,52 @@ +class RequestDoctorRating { + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int doctorID; + + RequestDoctorRating( + {this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.doctorID}); + + RequestDoctorRating.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + doctorID = json['DoctorID']; + } + + Map toJson() { + final Map data = new Map(); + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['DoctorID'] = this.doctorID; + return data; + } +} diff --git a/lib/core/model/prescriptions/Prescriptions.dart b/lib/core/model/prescriptions/Prescriptions.dart new file mode 100644 index 00000000..1362f1c2 --- /dev/null +++ b/lib/core/model/prescriptions/Prescriptions.dart @@ -0,0 +1,155 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class Prescriptions { + String setupID; + int projectID; + int patientID; + int appointmentNo; + String appointmentDate; + String doctorName; + String clinicDescription; + String name; + int episodeID; + int actualDoctorRate; + int admission; + int clinicID; + String companyName; + String despensedStatus; + DateTime dischargeDate; + int dischargeNo; + int doctorID; + String doctorImageURL; + int doctorRate; + String doctorTitle; + int gender; + String genderDescription; + bool isActiveDoctorProfile; + bool isDoctorAllowVedioCall; + bool isExecludeDoctor; + bool isInOutPatient; + String isInOutPatientDescription; + String isInOutPatientDescriptionN; + bool isInsurancePatient; + String nationalityFlagURL; + int noOfPatientsRate; + String qR; + List speciality; + + Prescriptions( + {this.setupID, + this.projectID, + this.patientID, + this.appointmentNo, + this.appointmentDate, + this.doctorName, + this.clinicDescription, + this.name, + this.episodeID, + this.actualDoctorRate, + this.admission, + this.clinicID, + this.companyName, + this.despensedStatus, + this.dischargeDate, + this.dischargeNo, + this.doctorID, + this.doctorImageURL, + this.doctorRate, + this.doctorTitle, + this.gender, + this.genderDescription, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isInOutPatient, + this.isInOutPatientDescription, + this.isInOutPatientDescriptionN, + this.isInsurancePatient, + this.nationalityFlagURL, + this.noOfPatientsRate, + this.qR, + this.speciality}); + + Prescriptions.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + patientID = json['PatientID']; + appointmentNo = json['AppointmentNo']; + appointmentDate = json['AppointmentDate']; + doctorName = json['DoctorName']; + clinicDescription = json['ClinicDescription']; + name = json['Name']; + episodeID = json['EpisodeID']; + actualDoctorRate = json['ActualDoctorRate']; + admission = json['Admission']; + clinicID = json['ClinicID']; + companyName = json['CompanyName']; + despensedStatus = json['Despensed_Status']; + dischargeDate = DateUtil.convertStringToDate(json['DischargeDate']); + dischargeNo = json['DischargeNo']; + doctorID = json['DoctorID']; + doctorImageURL = json['DoctorImageURL']; + doctorRate = json['DoctorRate']; + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isInOutPatient = json['IsInOutPatient']; + isInOutPatientDescription = json['IsInOutPatientDescription']; + isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; + isInsurancePatient = json['IsInsurancePatient']; + nationalityFlagURL = json['NationalityFlagURL']; + noOfPatientsRate = json['NoOfPatientsRate']; + qR = json['QR']; + // speciality = json['Speciality'].cast(); + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['PatientID'] = this.patientID; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentDate'] = this.appointmentDate; + data['DoctorName'] = this.doctorName; + data['ClinicDescription'] = this.clinicDescription; + data['Name'] = this.name; + data['EpisodeID'] = this.episodeID; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['Admission'] = this.admission; + data['ClinicID'] = this.clinicID; + data['CompanyName'] = this.companyName; + data['Despensed_Status'] = this.despensedStatus; + data['DischargeDate'] = this.dischargeDate; + data['DischargeNo'] = this.dischargeNo; + data['DoctorID'] = this.doctorID; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorRate'] = this.doctorRate; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsInOutPatient'] = this.isInOutPatient; + data['IsInOutPatientDescription'] = this.isInOutPatientDescription; + data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; + data['IsInsurancePatient'] = this.isInsurancePatient; + data['NationalityFlagURL'] = this.nationalityFlagURL; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['QR'] = this.qR; + data['Speciality'] = this.speciality; + return data; + } +} + +class PrescriptionsList { + String filterName = ""; + List prescriptionsList = List(); + + PrescriptionsList({this.filterName, Prescriptions prescriptions}) { + prescriptionsList.add(prescriptions); + } +} diff --git a/lib/core/model/prescriptions/prescription_report.dart b/lib/core/model/prescriptions/prescription_report.dart new file mode 100644 index 00000000..51f5750f --- /dev/null +++ b/lib/core/model/prescriptions/prescription_report.dart @@ -0,0 +1,127 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class PrescriptionReport { + int patientID; + String patientName; + String patientAge; + String patientGender; + String address; + String phoneOffice; + String itemDescription; + int doseTimingID; + int frequencyID; + int routeID; + String clinic; + String doctorName; + String route; + String frequency; + String remarks; + String name; + int days; + String startDate; + String orderDate; + int doseDailyQuantity; + int itemID; + Null productImage; + String sKU; + String itemDescriptionN; + String routeN; + String frequencyN; + String imageSRCUrl; + String imageThumbUrl; + + PrescriptionReport( + {this.patientID, + this.patientName, + this.patientAge, + this.patientGender, + this.address, + this.phoneOffice, + this.itemDescription, + this.doseTimingID, + this.frequencyID, + this.routeID, + this.clinic, + this.doctorName, + this.route, + this.frequency, + this.remarks, + this.name, + this.days, + this.startDate, + this.orderDate, + this.doseDailyQuantity, + this.itemID, + this.productImage, + this.sKU, + this.itemDescriptionN, + this.routeN, + this.frequencyN, + this.imageSRCUrl, + this.imageThumbUrl}); + + PrescriptionReport.fromJson(Map json) { + patientID = json['PatientID']; + patientName = json['PatientName']; + patientAge = json['PatientAge']; + patientGender = json['PatientGender']; + address = json['Address']; + phoneOffice = json['PhoneOffice']; + itemDescription = json['ItemDescription']; + doseTimingID = json['DoseTimingID']; + frequencyID = json['FrequencyID']; + routeID = json['RouteID']; + clinic = json['Clinic']; + doctorName = json['DoctorName']; + route = json['Route']; + frequency = json['Frequency']; + remarks = json['Remarks']; + name = json['Name']; + days = json['Days']; + startDate = json['StartDate']; + orderDate = json['OrderDate']; + doseDailyQuantity = json['DoseDailyQuantity']; + itemID = json['ItemID']; + productImage = json['ProductImage']; + sKU = json['SKU']; + itemDescriptionN = json['ItemDescriptionN']; + routeN = json['RouteN']; + frequencyN = json['FrequencyN']; + imageSRCUrl = json['ImageSRCUrl']; + imageThumbUrl = json['ImageThumbUrl']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientID'] = this.patientID; + data['PatientName'] = this.patientName; + data['PatientAge'] = this.patientAge; + data['PatientGender'] = this.patientGender; + data['Address'] = this.address; + data['PhoneOffice'] = this.phoneOffice; + data['ItemDescription'] = this.itemDescription; + data['DoseTimingID'] = this.doseTimingID; + data['FrequencyID'] = this.frequencyID; + data['RouteID'] = this.routeID; + data['Clinic'] = this.clinic; + data['DoctorName'] = this.doctorName; + data['Route'] = this.route; + data['Frequency'] = this.frequency; + data['Remarks'] = this.remarks; + data['Name'] = this.name; + data['Days'] = this.days; + data['StartDate'] = this.startDate; + data['OrderDate'] = this.orderDate; + data['DoseDailyQuantity'] = this.doseDailyQuantity; + data['ItemID'] = this.itemID; + data['ProductImage'] = this.productImage; + data['SKU'] = this.sKU; + data['ItemDescriptionN'] = this.itemDescriptionN; + data['RouteN'] = this.routeN; + data['FrequencyN'] = this.frequencyN; + data['ImageSRCUrl'] = this.imageSRCUrl; + data['ImageThumbUrl'] = this.imageThumbUrl; + data['hasPlan'] = false; + return data; + } +} diff --git a/lib/core/model/prescriptions/prescriptions_order.dart b/lib/core/model/prescriptions/prescriptions_order.dart new file mode 100644 index 00000000..db2b1855 --- /dev/null +++ b/lib/core/model/prescriptions/prescriptions_order.dart @@ -0,0 +1,134 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class PrescriptionsOrder { + int iD; + String patientID; + bool patientOutSA; + bool isOutPatient; + int projectID; + int nearestProjectID; + double longitude; + double latitude; + String appointmentNo; + String dischargeID; + int lineItemNo; + int status; + String description; + String descriptionN; + DateTime createdOn; + int serviceID; + int createdBy; + DateTime editedOn; + int editedBy; + int channel; + String clientRequestID; + bool returnedToQueue; + Null pickupDateTime; + Null pickupLocationName; + Null dropoffLocationName; + int realRRTHaveTransactions; + String nearestProjectDescription; + String nearestProjectDescriptionN; + String projectDescription; + String projectDescriptionN; + + PrescriptionsOrder( + {this.iD, + this.patientID, + this.patientOutSA, + this.isOutPatient, + this.projectID, + this.nearestProjectID, + this.longitude, + this.latitude, + this.appointmentNo, + this.dischargeID, + this.lineItemNo, + this.status, + this.description, + this.descriptionN, + this.createdOn, + this.serviceID, + this.createdBy, + this.editedOn, + this.editedBy, + this.channel, + this.clientRequestID, + this.returnedToQueue, + this.pickupDateTime, + this.pickupLocationName, + this.dropoffLocationName, + this.realRRTHaveTransactions, + this.nearestProjectDescription, + this.nearestProjectDescriptionN, + this.projectDescription, + this.projectDescriptionN}); + + PrescriptionsOrder.fromJson(Map json) { + iD = json['ID']; + patientID = json['PatientID']; + patientOutSA = json['PatientOutSA']; + isOutPatient = json['IsOutPatient']; + projectID = json['ProjectID']; + nearestProjectID = json['NearestProjectID']; + longitude = json['Longitude']; + latitude = json['Latitude']; + appointmentNo = json['AppointmentNo']; + dischargeID = json['DischargeID']; + lineItemNo = json['LineItemNo']; + status = json['Status']; + description = json['Description']; + descriptionN = json['DescriptionN']; + createdOn = DateUtil.convertStringToDate(json['CreatedOn']); + serviceID = json['ServiceID']; + createdBy = json['CreatedBy']; + editedOn = DateUtil.convertStringToDate(json['EditedOn']); + editedBy = json['EditedBy']; + channel = json['Channel']; + clientRequestID = json['ClientRequestID']; + returnedToQueue = json['ReturnedToQueue']; + pickupDateTime = json['PickupDateTime']; + pickupLocationName = json['PickupLocationName']; + dropoffLocationName = json['DropoffLocationName']; + realRRTHaveTransactions = json['RealRRT_HaveTransactions']; + nearestProjectDescription = json['NearestProjectDescription']; + nearestProjectDescriptionN = json['NearestProjectDescriptionN']; + projectDescription = json['ProjectDescription']; + projectDescriptionN = json['ProjectDescriptionN']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['PatientID'] = this.patientID; + data['PatientOutSA'] = this.patientOutSA; + data['IsOutPatient'] = this.isOutPatient; + data['ProjectID'] = this.projectID; + data['NearestProjectID'] = this.nearestProjectID; + data['Longitude'] = this.longitude; + data['Latitude'] = this.latitude; + data['AppointmentNo'] = this.appointmentNo; + data['DischargeID'] = this.dischargeID; + data['LineItemNo'] = this.lineItemNo; + data['Status'] = this.status; + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + data['CreatedOn'] = this.createdOn; + data['ServiceID'] = this.serviceID; + data['CreatedBy'] = this.createdBy; + data['EditedOn'] = this.editedOn; + data['EditedBy'] = this.editedBy; + data['Channel'] = this.channel; + data['ClientRequestID'] = this.clientRequestID; + data['ReturnedToQueue'] = this.returnedToQueue; + data['PickupDateTime'] = this.pickupDateTime; + data['PickupLocationName'] = this.pickupLocationName; + data['DropoffLocationName'] = this.dropoffLocationName; + data['RealRRT_HaveTransactions'] = this.realRRTHaveTransactions; + data['NearestProjectDescription'] = this.nearestProjectDescription; + data['NearestProjectDescriptionN'] = this.nearestProjectDescriptionN; + data['ProjectDescription'] = this.projectDescription; + data['ProjectDescriptionN'] = this.projectDescriptionN; + return data; + } +} diff --git a/lib/core/model/prescriptions/request_prescription_report.dart b/lib/core/model/prescriptions/request_prescription_report.dart new file mode 100644 index 00000000..c8323740 --- /dev/null +++ b/lib/core/model/prescriptions/request_prescription_report.dart @@ -0,0 +1,88 @@ +class RequestPrescriptionReport { + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + int appointmentNo; + String setupID; + int episodeID; + int clinicID; + int projectID; + int dischargeNo; + + RequestPrescriptionReport( + {this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType, + this.appointmentNo, + this.setupID, + this.episodeID, + this.clinicID, + this.projectID, + this.dischargeNo}); + + RequestPrescriptionReport.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + appointmentNo = json['AppointmentNo']; + setupID = json['SetupID']; + episodeID = json['EpisodeID']; + clinicID = json['ClinicID']; + projectID = json['ProjectID']; + dischargeNo = json['DischargeNo']; + } + + Map toJson() { + final Map data = new Map(); + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + data['AppointmentNo'] = this.appointmentNo; + data['SetupID'] = this.setupID; + data['EpisodeID'] = this.episodeID; + data['ClinicID'] = this.clinicID; + data['ProjectID'] = this.projectID; + data['DischargeNo'] = this.dischargeNo; + return data; + } +} diff --git a/lib/core/model/prescriptions/request_prescriptions.dart b/lib/core/model/prescriptions/request_prescriptions.dart new file mode 100644 index 00000000..abb39143 --- /dev/null +++ b/lib/core/model/prescriptions/request_prescriptions.dart @@ -0,0 +1,64 @@ +class RequestPrescriptions { + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + + RequestPrescriptions( + {this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType}); + + RequestPrescriptions.fromJson(Map json) { + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + } + + Map toJson() { + final Map data = new Map(); + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + return data; + } +} diff --git a/lib/core/model/prescriptions/request_prescriptions_orders.dart b/lib/core/model/prescriptions/request_prescriptions_orders.dart new file mode 100644 index 00000000..9aaab33d --- /dev/null +++ b/lib/core/model/prescriptions/request_prescriptions_orders.dart @@ -0,0 +1,52 @@ +class RequestPrescriptionsOrders { + int patientID; + int patientOutSA; + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + + RequestPrescriptionsOrders( + {this.patientID, + this.patientOutSA, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID}); + + RequestPrescriptionsOrders.fromJson(Map json) { + patientID = json['PatientID']; + patientOutSA = json['PatientOutSA']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientID'] = this.patientID; + data['PatientOutSA'] = this.patientOutSA; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + return data; + } +} diff --git a/lib/core/model/prescriptions/request_send_prescription_email.dart b/lib/core/model/prescriptions/request_send_prescription_email.dart new file mode 100644 index 00000000..2d1f3aa3 --- /dev/null +++ b/lib/core/model/prescriptions/request_send_prescription_email.dart @@ -0,0 +1,112 @@ +import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; + +class RequestSendPrescriptionEmail { + String appointmentDate; + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + String to; + String dateofBirth; + String patientIditificationNum; + String patientMobileNumber; + String patientName; + String setupID; + String clinicName; + String doctorName; + int projectID; + List listPrescriptions; + + RequestSendPrescriptionEmail( + {this.appointmentDate, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType, + this.to, + this.dateofBirth, + this.patientIditificationNum, + this.patientMobileNumber, + this.patientName, + this.setupID, + this.clinicName, + this.doctorName, + this.projectID}); + + RequestSendPrescriptionEmail.fromJson(Map json) { + appointmentDate = json['AppointmentDate']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + to = json['To']; + dateofBirth = json['DateofBirth']; + patientIditificationNum = json['PatientIditificationNum']; + patientMobileNumber = json['PatientMobileNumber']; + patientName = json['PatientName']; + setupID = json['SetupID']; + clinicName = json['ClinicName']; + doctorName = json['DoctorName']; + projectID = json['ProjectID']; + } + + Map toJson() { + final Map data = new Map(); + data['AppointmentDate'] = this.appointmentDate; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + data['To'] = this.to; + data['DateofBirth'] = this.dateofBirth; + data['PatientIditificationNum'] = this.patientIditificationNum; + data['PatientMobileNumber'] = this.patientMobileNumber; + data['PatientName'] = this.patientName; + data['SetupID'] = this.setupID; + if (this.listPrescriptions != null) { + data['ListPrescriptions'] = + this.listPrescriptions.map((v) => v.toJson()).toList(); + } + data['ClinicName'] = this.clinicName; + data['DoctorName'] = this.doctorName; + data['ProjectID'] = this.projectID; + + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 57686824..57910888 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -43,6 +43,7 @@ class BaseAppClient { if (!parsed['IsAuthenticated']) { // await helpers.logout(); //helpers.showErrorToast('Your session expired Please login agian'); + var asd =""; // TODO create logout fun } else if (parsed['MessageStatus'] == 1) { onSuccess(parsed, statusCode); diff --git a/lib/core/service/medical/my_doctor_service.dart b/lib/core/service/medical/my_doctor_service.dart new file mode 100644 index 00000000..349d7ace --- /dev/null +++ b/lib/core/service/medical/my_doctor_service.dart @@ -0,0 +1,102 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/reques_patient_doctor_appointmentt.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_profile.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_rating.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class MyDoctorService extends BaseService { + List patientDoctorAppointmentList = List(); + DoctorProfile doctorProfile; + DoctorRating doctorRating = DoctorRating(); + + RequestPatientDoctorAppointment patientDoctorAppointmentRequest = + RequestPatientDoctorAppointment( + top: 0, + versionID: 5.5, + beforeDays: 0, + exludType: 4, + channel: 3, + languageID: 2, + iPAdress: '10.20.10.20', + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'TMRhVmkGhOsvamErw', + isDentalAllowedBackend: false, + deviceTypeID: 1, + patientID: 1231755, + tokenID: '@dm!n', + patientType: 1, + patientTypeID: 1); + + RequestDoctorRating _requestDoctorRating = RequestDoctorRating( + channel: 3, + deviceTypeID: 2, + doctorID: 2477, + iPAdress: '10.20.10.20', + languageID: 2, + patientOutSA: 0, + sessionID: 'CvsUFeJkyLDnFQqw', + versionID: 5.5, + generalid: 'Cs2020@2016\$2958', + isDentalAllowedBackend: false); + + Future getPatientDoctorAppointmentList() async { + await baseAppClient.post(GET_MY_DOCTOR, + onSuccess: (dynamic response, int statusCode) { + patientDoctorAppointmentList.clear(); + response['PatientDoctorAppointmentResultList'].forEach((hospital) { + patientDoctorAppointmentList + .add(PatientDoctorAppointment.fromJson(hospital)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: patientDoctorAppointmentRequest.toJson()); + } + + RequestDoctorProfile _requestDoctorProfile = RequestDoctorProfile( + doctorID: 2477, + license: true, + isRegistered: true, + projectID: 12, + clinicID: 501, + patientID: 1231755, + versionID: 5.5, + channel: 3, + languageID: 2, + iPAdress: '10.20.10.20', + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'nstatCtNEmuwxeuVAOUmw', + isDentalAllowedBackend: false, + deviceTypeID: 2, + ); + + Future getDoctorProfileAndRating({int doctorId,int clinicID,int projectID }) async { + ///GET DOCTOR PROFILE + _requestDoctorProfile.doctorID = doctorId; + _requestDoctorProfile.clinicID = clinicID; + _requestDoctorProfile.patientID = projectID; + hasError = false; + await baseAppClient.post(GET_DOCTOR_PROFILE, + onSuccess: (dynamic response, int statusCode) { + doctorProfile = DoctorProfile.fromJson(response['DoctorProfileList'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestDoctorProfile.toJson()); + + ///GET DOCTOR RATING + //_requestDoctorRating.doctorID = doctorId; + await baseAppClient.post(GET_DOCTOR_RATING, + onSuccess: (dynamic response, int statusCode) { + doctorRating = DoctorRating.fromJson(response['AvgDoctorRatingList'][0]); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestDoctorRating.toJson()); + } +} diff --git a/lib/core/service/medical/prescriptions_service.dart b/lib/core/service/medical/prescriptions_service.dart new file mode 100644 index 00000000..3e7259f7 --- /dev/null +++ b/lib/core/service/medical/prescriptions_service.dart @@ -0,0 +1,149 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/request_prescription_report.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/request_prescriptions.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/request_prescriptions_orders.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/request_send_prescription_email.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class PrescriptionsService extends BaseService { + List prescriptionsList = List(); + RequestPrescriptions _requestPrescriptions = RequestPrescriptions( + versionID: 5.5, + channel: 3, + languageID: 2, + iPAdress: '10.20.10.20', + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'KIbLoqkytuKJEWECHQ', + isDentalAllowedBackend: false, + deviceTypeID: 2, + patientID: 1231755, + tokenID: '@dm!n', + patientTypeID: 1, + patientType: 1); + + List prescriptionsOrderList = List(); + RequestPrescriptionsOrders _requestPrescriptionsOrders = + RequestPrescriptionsOrders( + patientID: 1231755, + patientOutSA: 0, + versionID: 5.5, + channel: 3, + languageID: 1, + iPAdress: '10.20.10.20', + generalid: 'Cs2020@2016\$2958', + sessionID: 'KIbLoqkytuKJEWECHQ', + isDentalAllowedBackend: false, + deviceTypeID: 2); + + Future getPrescriptions() async { + hasError = false; + await baseAppClient.post(PRESCRIPTIONS, + onSuccess: (dynamic response, int statusCode) { + prescriptionsList.clear(); + response['PatientPrescriptionList'].forEach((prescriptions) { + prescriptionsList.add(Prescriptions.fromJson(prescriptions)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestPrescriptions.toJson()); + } + + Future getPrescriptionsOrders() async { + await baseAppClient.post(GET_PRESCRIPTIONS_ALL_ORDERS, + onSuccess: (dynamic response, int statusCode) { + prescriptionsOrderList.clear(); + response['PatientER_GetPatientAllPresOrdersList'] + .forEach((prescriptionsOrder) { + prescriptionsOrderList + .add(PrescriptionsOrder.fromJson(prescriptionsOrder)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestPrescriptionsOrders.toJson()); + } + + RequestPrescriptionReport _requestPrescriptionReport = + RequestPrescriptionReport( + appointmentNo: 0, + channel: 3, + clinicID: 4, + deviceTypeID: 2, + dischargeNo: 2018003246, + episodeID: 0, + iPAdress: '10.20.10.20', + languageID: 1, + patientID: 1231755, + patientOutSA: 0, + patientType: 1, + patientTypeID: 1, + projectID: 12, + sessionID: 'wgKuHpsPsEuLnlJhAYCQ', + tokenID: '@dm!n', + setupID: "91877", + versionID: 5.5, + generalid: 'Cs2020@2016\$2958', + isDentalAllowedBackend: false); + List prescriptionReportList = List(); + + Future getPrescriptionReport({int dischargeNo}) async { + hasError = false; + _requestPrescriptionReport.dischargeNo = dischargeNo; + await baseAppClient.post(GET_PRESCRIPTION_REPORT, + onSuccess: (dynamic response, int statusCode) { + prescriptionReportList.clear(); + response['INP_GetPrescriptionReport_List'].forEach((prescriptions) { + prescriptionReportList.add(PrescriptionReport.fromJson(prescriptions)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestPrescriptionReport.toJson()); + } + + RequestSendPrescriptionEmail _requestSendPrescriptionEmail = + RequestSendPrescriptionEmail( + versionID: 5.5, + languageID: 2, + channel: 3, + iPAdress: '10.20.10.20', + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'twIUmHfOHqFdDfVcyw', + isDentalAllowedBackend: false, + deviceTypeID: 2, + tokenID: '@dm!n', + patientTypeID: 1, + patientType: 1, + to: 'aljammalzmohammad@outlook.com', + dateofBirth: '/Date(536743800000+0300)/', + patientIditificationNum: '2344670985', + patientMobileNumber: '537503378', + patientName: 'TAMER FANASHEH', + setupID: '91877'); + + Future sendPrescriptionEmail(String appointmentDate, int patientID, + String clinicName, String doctorName, int projectID) async { + _requestSendPrescriptionEmail.listPrescriptions = prescriptionReportList; + _requestSendPrescriptionEmail.appointmentDate = appointmentDate; + _requestSendPrescriptionEmail.patientID = patientID; + _requestSendPrescriptionEmail.clinicName = clinicName; + _requestSendPrescriptionEmail.doctorName = doctorName; + _requestSendPrescriptionEmail.projectID = projectID; + hasError = false; + await baseAppClient.post(SEND_PRESCRIPTION_EMAIL, + onSuccess: (dynamic response, int statusCode){ + var asd = ""; + + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestSendPrescriptionEmail.toJson()); + } +} diff --git a/lib/core/viewModels/medical/my_doctor_view_model.dart b/lib/core/viewModels/medical/my_doctor_view_model.dart new file mode 100644 index 00000000..e04f9bdd --- /dev/null +++ b/lib/core/viewModels/medical/my_doctor_view_model.dart @@ -0,0 +1,97 @@ +import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; +import 'package:diplomaticquarterapp/core/service/medical/my_doctor_service.dart'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class MyDoctorViewModel extends BaseViewModel { + FilterType filterType = FilterType.Clinic; + MyDoctorService _myDoctorService = locator(); + + List _patientDoctorAppointmentListClinic = + List(); + List _patientDoctorAppointmentListHospital = + List(); + + List get patientDoctorAppointmentList => + filterType == FilterType.Clinic + ? _patientDoctorAppointmentListClinic + : _patientDoctorAppointmentListHospital; + + DoctorProfile get doctorProfile => _myDoctorService.doctorProfile; + DoctorRating get doctorRating => _myDoctorService.doctorRating; + + void getMyDoctor() async { + setState(ViewState.Busy); + await _myDoctorService.getPatientDoctorAppointmentList(); + if (_myDoctorService.hasError) { + error = _myDoctorService.error; + setState(ViewState.Error); + } else { + _myDoctorService.patientDoctorAppointmentList.forEach((element) { + List doctorByClinic = + _patientDoctorAppointmentListClinic + .where((elementClinic) => + elementClinic.filterName == element.clinicName) + .toList(); + + if (doctorByClinic.length != 0) { + _patientDoctorAppointmentListClinic[ + _patientDoctorAppointmentListClinic + .indexOf(doctorByClinic[0])] + .patientDoctorAppointmentList + .add(element); + } else { + _patientDoctorAppointmentListClinic.add(PatientDoctorAppointmentList( + filterName: element.clinicName, + patientDoctorAppointment: element)); + } + + // doctor list sort via project + List doctorByHospital = + _patientDoctorAppointmentListHospital + .where( + (elementClinic) => + elementClinic.filterName == element.projectName, + ) + .toList(); + + if (doctorByHospital.length != 0) { + _patientDoctorAppointmentListHospital[ + _patientDoctorAppointmentListHospital + .indexOf(doctorByHospital[0])] + .patientDoctorAppointmentList + .add(element); + } else { + _patientDoctorAppointmentListHospital.add( + PatientDoctorAppointmentList( + filterName: element.projectName, + patientDoctorAppointment: element)); + } + }); + + setState(ViewState.Idle); + } + } + + setFilterType(FilterType filterType) { + this.filterType = filterType; + notifyListeners(); + } + + void getDoctorProfileAndRating({int doctorId,int clinicID,int projectID }) async { + setState(ViewState.Busy); + await _myDoctorService.getDoctorProfileAndRating(doctorId: doctorId,clinicID: clinicID,projectID: projectID); + if (_myDoctorService.hasError) { + error = _myDoctorService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + +} diff --git a/lib/core/viewModels/medical/prescriptions_view_model.dart b/lib/core/viewModels/medical/prescriptions_view_model.dart new file mode 100644 index 00000000..75ff319f --- /dev/null +++ b/lib/core/viewModels/medical/prescriptions_view_model.dart @@ -0,0 +1,126 @@ +import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + +import '../../../core/enum/filter_type.dart'; +import '../../../core/enum/viewstate.dart'; +import '../../../core/model/prescriptions/Prescriptions.dart'; +import '../../../core/service/medical/prescriptions_service.dart'; + +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class PrescriptionsViewModel extends BaseViewModel { + FilterType filterType = FilterType.Clinic; + PrescriptionsService _prescriptionsService = locator(); + + List _prescriptionsOrderListClinic = List(); + List _prescriptionsOrderListHospital = List(); + + List get prescriptionReportList => + _prescriptionsService.prescriptionReportList; + + List get prescriptionsList => + _prescriptionsService.prescriptionsList; + + List get prescriptionsOrderList => + filterType == FilterType.Clinic + ? _prescriptionsOrderListClinic + : _prescriptionsOrderListHospital; + + getPrescriptions() async { + setState(ViewState.Busy); + await _prescriptionsService.getPrescriptions(); + if (_prescriptionsService.hasError) { + error = _prescriptionsService.error; + setState(ViewState.Error); + } else { + _filterList(); + await _getPrescriptionsOrders(); + setState(ViewState.Idle); + } + } + + void _filterList() { + _prescriptionsService.prescriptionsList.forEach((element) { + /// PrescriptionsList list sort clinic + List prescriptionsByClinic = + _prescriptionsOrderListClinic + .where((elementClinic) => + elementClinic.filterName == element.clinicDescription) + .toList(); + + if (prescriptionsByClinic.length != 0) { + _prescriptionsOrderListClinic[ + _prescriptionsOrderListClinic.indexOf(prescriptionsByClinic[0])] + .prescriptionsList + .add(element); + } else { + _prescriptionsOrderListClinic.add(PrescriptionsList( + filterName: element.clinicDescription, prescriptions: element)); + } + + /// PrescriptionsList list sort via hospital + List prescriptionsByHospital = + _prescriptionsOrderListHospital + .where( + (elementClinic) => elementClinic.filterName == element.name, + ) + .toList(); + + if (prescriptionsByHospital.length != 0) { + _prescriptionsOrderListHospital[_prescriptionsOrderListHospital + .indexOf(prescriptionsByHospital[0])] + .prescriptionsList + .add(element); + } else { + _prescriptionsOrderListHospital.add(PrescriptionsList( + filterName: element.name, prescriptions: element)); + } + }); + } + + _getPrescriptionsOrders() async { + await _prescriptionsService.getPrescriptionsOrders(); + if (_prescriptionsService.hasError) { + error = _prescriptionsService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + setFilterType(FilterType filterType) { + this.filterType = filterType; + notifyListeners(); + } + + getPrescriptionReport({int dischargeNo}) async { + setState(ViewState.Busy); + await _prescriptionsService.getPrescriptionReport(dischargeNo: dischargeNo); + if (_prescriptionsService.hasError) { + error = _prescriptionsService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + sendPrescriptionEmail( + {String appointmentDate, + int patientID, + String clinicName, + String doctorName, + int projectID}) async { + setState(ViewState.BusyLocal); + await _prescriptionsService.sendPrescriptionEmail( + appointmentDate, patientID, clinicName, doctorName, projectID); + if (_prescriptionsService.hasError) { + error = _prescriptionsService.error; + setState(ViewState.ErrorLocal); + AppToast.showSuccessToast(message: error); + } else { + AppToast.showSuccessToast(message: 'A copy has been sent to the e-mail'); + setState(ViewState.Idle); + } + } +} diff --git a/lib/locator.dart b/lib/locator.dart index f6a76c1c..c1a2a170 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -1,7 +1,11 @@ import 'package:get_it/get_it.dart'; import 'core/service/hospital_service.dart'; +import 'core/service/medical/my_doctor_service.dart'; +import 'core/service/medical/prescriptions_service.dart'; import 'core/viewModels/hospital_view_model.dart'; +import 'core/viewModels/medical/my_doctor_view_model.dart'; +import 'core/viewModels/medical/prescriptions_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; @@ -12,8 +16,12 @@ void setupLocator() { /// Services locator.registerLazySingleton(() => HospitalService()); locator.registerLazySingleton(() => PharmacyService()); + locator.registerLazySingleton(() => MyDoctorService()); + locator.registerLazySingleton(() => PrescriptionsService()); /// View Model locator.registerFactory(() => HospitalViewModel()); locator.registerFactory(() => PharmacyViewModel()); + locator.registerFactory(() => MyDoctorViewModel()); + locator.registerFactory(() => PrescriptionsViewModel()); } diff --git a/lib/pages/MyAppointments/AppointmentDetails.dart b/lib/pages/MyAppointments/AppointmentDetails.dart index ffb5f6be..07d13e9a 100644 --- a/lib/pages/MyAppointments/AppointmentDetails.dart +++ b/lib/pages/MyAppointments/AppointmentDetails.dart @@ -72,7 +72,7 @@ class _AppointmentDetailsState extends State with SingleTick margin: EdgeInsets.only(top: 5.0), alignment: Alignment.center, child: RatingBar.readOnly( - initialRating: 4.0, + initialRating: 3.5, size: 35.0, filledColor: Colors.yellow[700], emptyColor: Colors.grey[500], diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 50c32c78..18dd45af 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -2,9 +2,10 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/auth/select_device_imei_res.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/landing/replay_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/providers/auth_provider.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/medicine_search_screen.dart'; -import 'package:diplomaticquarterapp/pages/medical/medical_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; @@ -71,7 +72,7 @@ class _LandingPageState extends State { body: PageView( physics: NeverScrollableScrollPhysics(), controller: pageController, - children: [HomePage(), MedicineSearch(), MedicalPage(), MyAdmissionsPage()], + children: [Container(), MedicalProfilePage(), MyAdmissionsPage(), ToDo()], ), bottomNavigationBar: BottomNavBar(changeIndex: _changeCurrentTab), ); diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart new file mode 100644 index 00000000..c9bce380 --- /dev/null +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -0,0 +1,110 @@ +import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/my_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import 'doctor_profile_page.dart'; + +class DoctorHomePage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getMyDoctor(), + builder: (context, MyDoctorViewModel model, widget) => AppScaffold( + baseViewModel: model, + isShowAppBar: true, + appBarTitle: 'My Doctors', + body: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: FractionallySizedBox( + widthFactor: 1.0, + child: Center( + child: Column( + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () => model.setFilterType(FilterType.Clinic), + child: ListTile( + title: const Text('Clinic'), + leading: Radio( + value: FilterType.Clinic, + groupValue: model.filterType, + activeColor: Colors.red[800], + onChanged: (FilterType value) { + model.setFilterType(value); + }, + ), + ), + ), + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () => model.setFilterType(FilterType.Hospital), + child: ListTile( + title: const Text('Hospital'), + leading: Radio( + value: FilterType.Hospital, + groupValue: model.filterType, + activeColor: Colors.red[800], + onChanged: (FilterType value) => + model.setFilterType(value), + ), + ), + ), + ) + ], + ), + ...List.generate( + model.patientDoctorAppointmentList.length, + (index) => AppExpandableNotifier( + title: model + .patientDoctorAppointmentList[index].filterName, + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: model.patientDoctorAppointmentList[index] + .patientDoctorAppointmentList + .map((doctor) { + return InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: DoctorProfilePage( + patientDoctorAppointment: doctor, + ), + ), + ); + }, + child: DoctorCard( + name: doctor.doctorName, + profileUrl: doctor.doctorImageURL, + rat: doctor.doctorRate.toDouble(), + subName: DateUtil.getMonthDayYearDateFormatted( + doctor.appointmentDate), + ), + ); + }).toList(), + )), + ) + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/doctor/doctor_information_page.dart b/lib/pages/medical/doctor/doctor_information_page.dart new file mode 100644 index 00000000..7634cde2 --- /dev/null +++ b/lib/pages/medical/doctor/doctor_information_page.dart @@ -0,0 +1,199 @@ +import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class DoctorInformation extends StatefulWidget { + final DoctorProfile doctorProfile; + + const DoctorInformation({Key key, this.doctorProfile}) : super(key: key); + + @override + _DoctorInformationState createState() => _DoctorInformationState(); +} + +class _DoctorInformationState extends State { + bool _isShowInfo = true; + bool _isScientificQualification = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.grey[200], + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(top: 10, right: 10, left: 10), + padding: EdgeInsets.all(10.0), + width: double.infinity, + //height: 250, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(10.0)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.person, + size: 25, + color: Colors.red[700], + ), + SizedBox( + width: 10, + ), + Expanded(child: Texts(widget.doctorProfile.doctorName)), + InkWell( + onTap: () { + setState(() { + _isShowInfo = !_isShowInfo; + }); + }, + child: Container( + margin: EdgeInsets.all(5), + decoration: + BoxDecoration(shape: BoxShape.circle, boxShadow: [ + BoxShadow( + color: Colors.red[700], + blurRadius: 1.0, + spreadRadius: 0.0, + ) + ]), + child: Icon( + _isShowInfo + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down , + size: 25, + color: Colors.white, + )), + ), + ], + ), + if (_isShowInfo) + AnimatedContainer( + duration: Duration(milliseconds: 7000), + margin: EdgeInsets.only(top: 20), + // height: 150, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts('Gender'), + Texts( + widget.doctorProfile.genderDescription, + variant: 'overline', + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts('Nationality'), + Texts( + widget.doctorProfile.nationalityName, + variant: 'overline', + ), + ], + ), + ], + ), + SizedBox( + height: 5, + ), + Divider( + height: 3, + color: Colors.grey, + ), + SizedBox( + height: 5, + ), + Texts('Clinic'), + Texts( + widget.doctorProfile.clinicDescription, + variant: 'overline', + ), + ], + ), + ) + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10, right: 10, left: 10), + padding: EdgeInsets.all(10.0), + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(10.0)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.local_play, + size: 25, + color: Colors.red[700], + ), + SizedBox( + width: 10, + ), + Expanded(child: Texts(widget.doctorProfile.doctorName)), + InkWell( + onTap: () { + setState(() { + _isScientificQualification = + !_isScientificQualification; + }); + }, + child: Container( + margin: EdgeInsets.all(5), + decoration: + BoxDecoration(shape: BoxShape.circle, boxShadow: [ + BoxShadow( + color: Colors.red[700], + blurRadius: 1.0, + spreadRadius: 0.0, + ) + ]), + child: Icon( + _isScientificQualification + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + size: 25, + color: Colors.white, + )), + ), + ], + ), + if (_isScientificQualification) + AnimatedContainer( + duration: Duration(milliseconds: 7000), + margin: EdgeInsets.only(top: 20), + // height: 150, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts(widget.doctorProfile.doctorProfileInfo,) + ], + ), + ) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/medical/doctor/doctor_profile_page.dart b/lib/pages/medical/doctor/doctor_profile_page.dart new file mode 100644 index 00000000..61bfd804 --- /dev/null +++ b/lib/pages/medical/doctor/doctor_profile_page.dart @@ -0,0 +1,181 @@ +import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/my_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rating_bar/rating_bar.dart'; + +import 'doctor_information_page.dart'; + +class DoctorProfilePage extends StatefulWidget { + final PatientDoctorAppointment patientDoctorAppointment; + + DoctorProfilePage({this.patientDoctorAppointment}); + + @override + _DoctorProfilePageState createState() => + _DoctorProfilePageState(patientDoctorAppointment); +} + +class _DoctorProfilePageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + final PatientDoctorAppointment patientDoctorAppointment; + + _DoctorProfilePageState(this.patientDoctorAppointment); + + @override + void initState() { + _tabController = new TabController(length: 2, vsync: this); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getDoctorProfileAndRating( + doctorId: widget.patientDoctorAppointment.doctorID, + clinicID: widget.patientDoctorAppointment.clinicID, + projectID: widget.patientDoctorAppointment.projectID), + builder: (context, model, widget) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Doctor Profile', + baseViewModel: model, + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + margin: EdgeInsets.only(top: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + margin: EdgeInsets.all(5), + width: 50, + height: 50, + decoration: + BoxDecoration(shape: BoxShape.circle, + color: Colors.grey + ), + child: Icon( + Icons.calendar_view_day, + size: 25, + color: Colors.white, + )), + ClipRRect( + borderRadius: BorderRadius.circular(100.0), + child: Image.network( + patientDoctorAppointment.doctorImageURL, + fit: BoxFit.fill, + height: 120.0, + width: 120.0), + ), + Container( + margin: EdgeInsets.all(5), + width: 50, + height: 50, + decoration: + BoxDecoration(shape: BoxShape.circle, + color: Colors.grey + ), + child: Icon( + Icons.format_list_bulleted, + size: 25, + color: Colors.white, + )), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + alignment: Alignment.center, + child: Text(patientDoctorAppointment.doctorName, + style: TextStyle( + fontSize: 20.0, + color: Colors.grey[900], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + alignment: Alignment.center, + child: Text(patientDoctorAppointment.clinicName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[900], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: RatingBar.readOnly( + initialRating: + model.doctorRating.doctorRate.toDouble() ?? + 0.0, + size: 35.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: Text( + "(${model.doctorRating.patientNumber ?? 0} Reviews)", + style: TextStyle( + fontSize: 14.0, + color: Colors.blue[800], + letterSpacing: 1.0, + decoration: TextDecoration.underline, + )), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Divider( + color: Colors.grey[500], + ), + ), + TabBar( + indicatorColor: Colors.red[800], + indicatorWeight: 3.0, + tabs: [ + Tab( + child: Text( + 'Doctor Information', + style: TextStyle(color: Colors.black))), + Tab( + child: Text( + TranslationBase.of(context).availableAppo, + style: TextStyle(color: Colors.black)), + ) + ], + controller: _tabController, + ), + Container( + height: MediaQuery.of(context).size.height * 0.8, + child: TabBarView( + physics: BouncingScrollPhysics(), + children: [DoctorInformation(doctorProfile: model.doctorProfile,), Container()], + controller: _tabController, + ), + ), + ], + ), + ), + ], + ), + ), + )); + } +} diff --git a/lib/pages/medical/medical_page.dart b/lib/pages/medical/medical_profile_page.dart similarity index 68% rename from lib/pages/medical/medical_page.dart rename to lib/pages/medical/medical_profile_page.dart index 049ba0bc..ceacaed4 100644 --- a/lib/pages/medical/medical_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -1,18 +1,21 @@ import 'dart:math'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/sliver_app_bar_delegate.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -class MedicalPage extends StatefulWidget { - @override - _MedicalPageState createState() => _MedicalPageState(); +import 'doctor/doctor_home_page.dart'; +class MedicalProfilePage extends StatefulWidget { + @override + _MedicalProfilePageState createState() => _MedicalProfilePageState(); } -class _MedicalPageState extends State { +class _MedicalProfilePageState extends State { @override Widget build(BuildContext context) { return AppScaffold( @@ -39,23 +42,32 @@ class _MedicalPageState extends State { padding: EdgeInsets.symmetric(vertical: 12.0), child: Column( children: [ - Row( children: [ Expanded( flex: 1, - child: MedicalProfileItem( - title: 'My Doctor', - imagePath: 'doctor_icon.png', - subTitle: 'List', + child: InkWell( + onTap: (){ + Navigator.push(context, FadePage(page: DoctorHomePage())); + }, + child: MedicalProfileItem( + title: 'My Doctor', + imagePath: 'doctor_icon.png', + subTitle: 'List', + ), ), ), Expanded( flex: 1, - child: MedicalProfileItem( - title: 'Lab', - imagePath: 'lab_result_icon.png', - subTitle: 'Result', + child: InkWell( + onTap: (){ + + }, + child: MedicalProfileItem( + title: 'Lab', + imagePath: 'lab_result_icon.png', + subTitle: 'Result', + ), ), ) ], @@ -72,10 +84,16 @@ class _MedicalPageState extends State { ), Expanded( flex: 1, - child: MedicalProfileItem( - title: 'Medicines', - imagePath: 'prescription_icon.png', - subTitle: 'Prescriptions', + child: InkWell( + onTap: (){ + Navigator.push(context, FadePage(page: HomePrescriptionsPage())); + + }, + child: MedicalProfileItem( + title: 'Medicines', + imagePath: 'prescription_icon.png', + subTitle: 'Prescriptions', + ), ), ) ], @@ -114,7 +132,6 @@ class _MedicalPageState extends State { flex: 1, child: Container(), ) - ], ), ], @@ -123,10 +140,7 @@ class _MedicalPageState extends State { ), ), ], - ), ); } } - - diff --git a/lib/pages/medical/prescriptions/prescription_details_page.dart b/lib/pages/medical/prescriptions/prescription_details_page.dart new file mode 100644 index 00000000..35a9a307 --- /dev/null +++ b/lib/pages/medical/prescriptions/prescription_details_page.dart @@ -0,0 +1,175 @@ +import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class PrescriptionDetailsPage extends StatelessWidget { + final PrescriptionReport prescriptionReport; + + PrescriptionDetailsPage({Key key, this.prescriptionReport}); + + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowAppBar: true, + appBarTitle: 'Prescription Details', + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only(top: 10, left: 10, right: 10), + padding: EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(color: Colors.grey[200], width: 0.5), + ), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5)), + child: Image.network( + prescriptionReport.imageSRCUrl, + fit: BoxFit.cover, + width: 60, + height: 70, + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts(prescriptionReport.itemDescription)), + ), + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(8), + child: InkWell( + onTap: () {}, + child: Center( + child: Column( + children: [ + Container( + width: 50, + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.rectangle + ), + child: Column( + children: [ + Icon( + Icons.pin_drop, + color: Colors.red[800], + size: 55, + ), + ], + ), + ), + SizedBox(height: 5,), + Texts('Ports') + + ], + ), + )), + ), + Container( + margin: EdgeInsets.only(top: 10, left: 10, right: 10), + child: Table( + border: TableBorder.symmetric( + inside: BorderSide(width: 0.5), + outside: BorderSide(width: 0.5)), + children: [ + TableRow( + children: [ + Container( + color: Colors.white, + height: 30, + width: double.infinity, + child: Center(child: Texts('Way'))), + Container( + color: Colors.white, + height: 30, + width: double.infinity, + child: Center(child: Texts('Average'))), + Container( + color: Colors.white, + height: 30, + width: double.infinity, + child: Center(child: Texts('Daily doses'))), + Container( + color: Colors.white, + height: 30, + width: double.infinity, + child: Center(child: Texts('Period'))), + ], + ), + TableRow( + children: [ + Container( + color: Colors.white, + height: 50, + width: double.infinity, + child: + Center(child: Text(prescriptionReport.routeN))), + Container( + color: Colors.white, + height: 50, + width: double.infinity, + child: Center( + child: Text(prescriptionReport.frequencyN))), + Container( + color: Colors.white, + height: 50, + width: double.infinity, + child: Center( + child: Text( + '${prescriptionReport.doseDailyQuantity}'))), + Container( + color: Colors.white, + height: 50, + width: double.infinity, + child: + Center(child: Text('${prescriptionReport.days}'))) + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10, left: 10, right: 10), + width: double.infinity, + color: Colors.white, + padding: EdgeInsets.all(5), + child: Center( + child: Column( + children: [ + Texts('Notes'), + SizedBox( + height: 5, + ), + Divider( + height: 0.5, + color: Colors.grey[300], + ), + SizedBox( + height: 5, + ), + Texts(' '), + ], + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart new file mode 100644 index 00000000..c84be7bd --- /dev/null +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -0,0 +1,112 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_details_page.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class PrescriptionItemsPage extends StatelessWidget { + final Prescriptions prescriptions; + + PrescriptionItemsPage({Key key, this.prescriptions}); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => + model.getPrescriptionReport(dischargeNo: prescriptions.dischargeNo), + builder: (_, model, widget) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Items', + baseViewModel: model, + body: Container( + height: MediaQuery.of(context).size.height * 0.8, + child: ListView.builder( + itemBuilder: (context, index) => InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: PrescriptionDetailsPage( + prescriptionReport: model.prescriptionReportList[index], + ), + ), + ), + child: Container( + width: double.infinity, + margin: EdgeInsets.only(top: 10, left: 10, right: 10), + padding: EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(10.0), + ), + border: Border.all(color: Colors.grey[200], width: 0.5), + ), + child: Row( + children: [ + ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(5)), + child: Image.network( + model.prescriptionReportList[index].imageSRCUrl, + fit: BoxFit.cover, + width: 60, + height: 70, + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts(model + .prescriptionReportList[index].itemDescription)), + )), + Icon( + Icons.arrow_forward_ios, + size: 18, + color: Colors.grey[500], + ) + ], + ), + ), + ), + itemCount: model.prescriptionReportList.length, + ), + ), + bottomSheet: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.2, + color: Colors.grey[100], + child: Column( + children: [ + Divider(), + Container( + width: MediaQuery.of(context).size.width * 0.8, + child: Button( + label: 'Send Copy', + onTap: () => model.sendPrescriptionEmail( + appointmentDate: prescriptions.appointmentDate, + patientID: prescriptions.patientID, + clinicName: prescriptions.companyName, + doctorName: prescriptions.doctorName, + projectID: prescriptions.projectID), + loading: model.state == ViewState.BusyLocal, + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.8, + child: Button( + label: 'Resend order & deliver', + backgroundColor: Colors.green[200], + )) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/prescriptions/prescriptions_history.dart b/lib/pages/medical/prescriptions/prescriptions_history.dart new file mode 100644 index 00000000..1df9a467 --- /dev/null +++ b/lib/pages/medical/prescriptions/prescriptions_history.dart @@ -0,0 +1,13 @@ +import 'package:flutter/cupertino.dart'; + +class PrescriptionsHistory extends StatefulWidget { + @override + _PrescriptionsHistoryState createState() => _PrescriptionsHistoryState(); +} + +class _PrescriptionsHistoryState extends State { + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/pages/medical/prescriptions/prescriptions_home_page.dart b/lib/pages/medical/prescriptions/prescriptions_home_page.dart new file mode 100644 index 00000000..e4c6ca9f --- /dev/null +++ b/lib/pages/medical/prescriptions/prescriptions_home_page.dart @@ -0,0 +1,122 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_page.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class HomePrescriptionsPage extends StatefulWidget { + @override + _HomePrescriptionsPageState createState() => _HomePrescriptionsPageState(); +} + +class _HomePrescriptionsPageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getPrescriptions(), + builder: (_, model, widget) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'My Doctors', + body: Scaffold( + extendBodyBehindAppBar: true, + appBar: PreferredSize( + preferredSize: Size.fromHeight(65.0), + child: Stack( + children: [ + Positioned( + bottom: 1, + left: 0, + right: 0, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + color: Theme.of(context) + .scaffoldBackgroundColor + .withOpacity(0.8), + height: 70.0, + ), + ), + ), + Center( + child: Container( + height: 60.0, + margin: EdgeInsets.only(top: 10.0), + width: MediaQuery.of(context).size.width * 0.9, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerColor, + width: 0.7), + ), + color: Colors.white), + child: Center( + child: TabBar( + isScrollable: true, + controller: _tabController, + indicatorWeight: 5.0, + indicatorSize: TabBarIndicatorSize.label, + indicatorColor: Colors.red[800], + labelColor: Theme.of(context).primaryColor, + labelPadding: + EdgeInsets.only(top: 4.0, left: 18.0, right: 18.0), + unselectedLabelColor: Colors.grey[800], + tabs: [ + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('Prescriptions'), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.30, + child: Center( + child: Texts('History'), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + PrescriptionsPage(prescriptionsViewModel: model,), + PrescriptionsHistory() + ], + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/prescriptions/prescriptions_page.dart b/lib/pages/medical/prescriptions/prescriptions_page.dart new file mode 100644 index 00000000..e335f41c --- /dev/null +++ b/lib/pages/medical/prescriptions/prescriptions_page.dart @@ -0,0 +1,102 @@ +import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_items_page.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class PrescriptionsPage extends StatelessWidget { + final PrescriptionsViewModel prescriptionsViewModel; + + const PrescriptionsPage({Key key, this.prescriptionsViewModel}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + baseViewModel: prescriptionsViewModel, + body: FractionallySizedBox( + widthFactor: 1.0, + child: ListView( + physics: BouncingScrollPhysics(), + children: [ + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () => + prescriptionsViewModel.setFilterType(FilterType.Clinic), + child: ListTile( + title: const Text('Clinic'), + leading: Radio( + value: FilterType.Clinic, + groupValue: prescriptionsViewModel.filterType, + activeColor: Colors.red[800], + onChanged: (FilterType value) { + prescriptionsViewModel.setFilterType(value); + }, + ), + ), + ), + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () => prescriptionsViewModel + .setFilterType(FilterType.Hospital), + child: ListTile( + title: const Text('Hospital'), + leading: Radio( + value: FilterType.Hospital, + groupValue: prescriptionsViewModel.filterType, + activeColor: Colors.red[800], + onChanged: (FilterType value) { + prescriptionsViewModel.setFilterType(value); + }, + ), + ), + ), + ) + ], + ), + ...List.generate( + prescriptionsViewModel.prescriptionsOrderList.length, + (index) => AppExpandableNotifier( + title: prescriptionsViewModel + .prescriptionsOrderList[index].filterName, + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: prescriptionsViewModel + .prescriptionsOrderList[index].prescriptionsList + .map((prescriptions) { + return InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: PrescriptionItemsPage(prescriptions: prescriptions,), + ), + ), + child: DoctorCard( + name: prescriptions.doctorName, + profileUrl: prescriptions.doctorImageURL, + rat: prescriptions.doctorRate.toDouble(), + subName: prescriptions.name, + date: DateUtil.getMonthDayYearDateFormatted( + prescriptions.dischargeDate), + ), + ); + }).toList(), + )), + ) + ], + ), + ), + ); + } +} diff --git a/lib/widgets/buttons/button.dart b/lib/widgets/buttons/button.dart index d63babb5..f8aff960 100644 --- a/lib/widgets/buttons/button.dart +++ b/lib/widgets/buttons/button.dart @@ -13,6 +13,7 @@ class Button extends StatefulWidget { this.label: "", this.icon, this.onTap, + this.backgroundColor, this.loading: false, this.elevation: true}) : super(key: key); @@ -22,6 +23,7 @@ class Button extends StatefulWidget { final VoidCallback onTap; final bool loading; final bool elevation; + final Color backgroundColor; @override _ButtonState createState() => _ButtonState(); @@ -103,7 +105,7 @@ class _ButtonState extends State