From 5241206a6ab976ed01356767b2f8555805326c2b Mon Sep 17 00:00:00 2001 From: FlutterFlow <140657486+FlutterFlowEng@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:15:54 +0000 Subject: [PATCH] Updating to latest FlutterFlow output. --- android/app/src/main/AndroidManifest.xml | 3 +- assets/fonts/Nunito-Regular.ttf | Bin 0 -> 131736 bytes ...76383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg | Bin 5963 -> 0 bytes ios/Runner.xcodeproj/project.pbxproj | 8 +- lib/actions/actions.dart | 230 +- .../option_selection_modal_widget.dart | 110 +- .../visitor_not_found_component_widget.dart | 4 +- .../arrow_linked_locals_component_model.dart | 0 .../arrow_linked_locals_component_widget.dart | 0 .../local_profile_component_widget.dart | 191 +- .../menu_component/menu_component_model.dart | 40 + .../menu_component/menu_component_widget.dart | 26 +- .../menu_list_view_component_widget.dart | 388 +- .../menu_staggered_view_component_widget.dart | 1046 ++-- .../message_well_component_model.dart | 0 .../message_well_component_widget.dart | 2 +- .../schedule_visit_detail_widget.dart | 6 +- .../view_visit_detail_model.dart | 6 +- .../view_visit_detail_widget.dart | 37 +- ...got_password_template_component_model.dart | 26 + ...ot_password_template_component_widget.dart | 292 + ...iter_vistor_template_component_model.dart} | 8 +- ...ter_vistor_template_component_widget.dart} | 21 +- .../sign_in_template_component_model.dart} | 13 +- .../sign_in_template_component_widget.dart | 900 ++++ .../sign_up_template_component_model.dart | 45 + .../sign_up_template_component_widget.dart | 771 +++ ...tails_modal_template_component_model.dart} | 6 +- ...ails_modal_template_component_widget.dart} | 26 +- ...earch_modal_template_component_model.dart} | 7 +- ...arch_modal_template_component_widget.dart} | 46 +- .../welcome_template_component_model.dart | 13 + .../welcome_template_component_widget.dart | 458 ++ ...etails_modal_template_component_model.dart | 13 + ...ails_modal_template_component_widget.dart} | 20 +- .../fast_pass_page/fast_pass_page_model.dart | 17 + .../fast_pass_page/fast_pass_page_widget.dart | 44 + .../home_page/home_page_model.dart | 4 +- .../home_page/home_page_widget.dart | 61 +- .../on_boarding_page_model.dart | 48 + .../on_boarding_page_widget.dart | 131 + .../people_on_the_property_page_model.dart | 23 + .../people_on_the_property_page_widget.dart | 289 + .../register_visitor_page_widget.dart | 9 +- .../schedule_complete_visit_page_model.dart | 31 +- .../schedule_complete_visit_page_widget.dart | 4776 +++++++++-------- ...chedule_provisional_visit_page_widget.dart | 161 +- lib/backend/api_requests/api_calls.dart | 118 +- .../push_notifications_handler.dart | 18 +- lib/backend/schema/structs/device_struct.dart | 110 + lib/backend/schema/structs/index.dart | 1 + lib/custom_code/actions/get_dev_u_u_i_d.dart | 28 + lib/custom_code/actions/index.dart | 1 + lib/custom_code/widgets/image_cropper.dart | 179 + lib/custom_code/widgets/index.dart | 1 + .../flutter_flow_button_tabbar.dart | 854 +++ lib/flutter_flow/flutter_flow_data_table.dart | 341 ++ lib/flutter_flow/flutter_flow_theme.dart | 8 +- lib/flutter_flow/flutter_flow_util.dart | 1 + lib/flutter_flow/internationalization.dart | 409 +- lib/flutter_flow/keep_alive_wrapper.dart | 25 + lib/flutter_flow/nav/nav.dart | 46 +- lib/index.dart | 15 +- .../image_cropper/image_cropper_model.dart} | 5 +- .../image_cropper/image_cropper_widget.dart | 64 + .../legacy_local_component_model.dart | 12 + .../legacy_local_component_widget.dart | 167 + .../forgot_password_page_model.dart | 0 .../forgot_password_page_widget.dart | 12 +- .../login_page/login_page_model.dart | 113 + .../login_page/login_page_widget.dart | 244 +- .../register_page/register_page_model.dart | 3 - .../register_page/register_page_widget.dart | 198 +- .../welcome_page/welcome_page_model.dart | 0 .../welcome_page/welcome_page_widget.dart | 27 +- .../select_header_component_model.dart | 12 + .../select_header_component_widget.dart | 185 + lib/legacy/test/test_model.dart | 17 + lib/legacy/test/test_widget.dart | 44 + ...isit_history_template_component_model.dart | 13 + ...sit_history_template_component_widget.dart | 389 ++ pubspec.yaml | 4 +- 82 files changed, 10144 insertions(+), 3876 deletions(-) create mode 100644 assets/fonts/Nunito-Regular.ttf delete mode 100644 assets/images/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg rename lib/application_components/{templates_components => organism_components}/arrow_linked_locals_component/arrow_linked_locals_component_model.dart (100%) rename lib/application_components/{templates_components => organism_components}/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart (100%) rename lib/application_components/{templates_components => organism_components}/menu_component/menu_component_model.dart (53%) rename lib/application_components/{templates_components => organism_components}/menu_component/menu_component_widget.dart (65%) rename lib/application_components/{templates_components => organism_components}/message_well_component/message_well_component_model.dart (100%) rename lib/application_components/{templates_components => organism_components}/message_well_component/message_well_component_widget.dart (98%) create mode 100644 lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_model.dart create mode 100644 lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart rename lib/application_components/templates_components/{regisiter_vistor_component/regisiter_vistor_component_model.dart => regisiter_vistor_template_component/regisiter_vistor_template_component_model.dart} (89%) rename lib/application_components/templates_components/{regisiter_vistor_component/regisiter_vistor_component_widget.dart => regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart} (98%) rename lib/{application_pages/login_page/login_page_model.dart => application_components/templates_components/sign_in_template_component/sign_in_template_component_model.dart} (65%) create mode 100644 lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart create mode 100644 lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_model.dart create mode 100644 lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart rename lib/application_components/templates_components/{visit_details_modal/visit_details_modal_model.dart => visit_details_modal_template_component/visit_details_modal_template_component_model.dart} (81%) rename lib/application_components/templates_components/{visit_details_modal/visit_details_modal_widget.dart => visit_details_modal_template_component/visit_details_modal_template_component_widget.dart} (82%) rename lib/application_components/templates_components/{visitor_search_component/visitor_search_component_model.dart => visitor_search_modal_template_component/visitor_search_modal_template_component_model.dart} (86%) rename lib/application_components/templates_components/{visitor_search_component/visitor_search_component_widget.dart => visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart} (91%) create mode 100644 lib/application_components/templates_components/welcome_template_component/welcome_template_component_model.dart create mode 100644 lib/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart create mode 100644 lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_model.dart rename lib/application_components/{templates_components/visitor_details_modal/visitor_details_modal_widget.dart => visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart} (95%) create mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_model.dart create mode 100644 lib/application_pages/fast_pass_page/fast_pass_page_widget.dart create mode 100644 lib/application_pages/on_boarding_page/on_boarding_page_model.dart create mode 100644 lib/application_pages/on_boarding_page/on_boarding_page_widget.dart create mode 100644 lib/application_pages/people_on_the_property_page/people_on_the_property_page_model.dart create mode 100644 lib/application_pages/people_on_the_property_page/people_on_the_property_page_widget.dart create mode 100644 lib/backend/schema/structs/device_struct.dart create mode 100644 lib/custom_code/actions/get_dev_u_u_i_d.dart create mode 100644 lib/custom_code/widgets/image_cropper.dart create mode 100644 lib/custom_code/widgets/index.dart create mode 100644 lib/flutter_flow/flutter_flow_button_tabbar.dart create mode 100644 lib/flutter_flow/flutter_flow_data_table.dart create mode 100644 lib/flutter_flow/keep_alive_wrapper.dart rename lib/{application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart => legacy/image_cropper/image_cropper_model.dart} (51%) create mode 100644 lib/legacy/image_cropper/image_cropper_widget.dart create mode 100644 lib/legacy/legacy_local_component/legacy_local_component_model.dart create mode 100644 lib/legacy/legacy_local_component/legacy_local_component_widget.dart rename lib/{application_pages => legacy/on_boarding_legacy}/forgot_password_page/forgot_password_page_model.dart (100%) rename lib/{application_pages => legacy/on_boarding_legacy}/forgot_password_page/forgot_password_page_widget.dart (97%) create mode 100644 lib/legacy/on_boarding_legacy/login_page/login_page_model.dart rename lib/{application_pages => legacy/on_boarding_legacy}/login_page/login_page_widget.dart (80%) rename lib/{application_pages => legacy/on_boarding_legacy}/register_page/register_page_model.dart (89%) rename lib/{application_pages => legacy/on_boarding_legacy}/register_page/register_page_widget.dart (81%) rename lib/{application_pages => legacy/on_boarding_legacy}/welcome_page/welcome_page_model.dart (100%) rename lib/{application_pages => legacy/on_boarding_legacy}/welcome_page/welcome_page_widget.dart (97%) create mode 100644 lib/legacy/select_header_component/select_header_component_model.dart create mode 100644 lib/legacy/select_header_component/select_header_component_widget.dart create mode 100644 lib/legacy/test/test_model.dart create mode 100644 lib/legacy/test/test_widget.dart create mode 100644 lib/legacy/visit_history_template_component/visit_history_template_component_model.dart create mode 100644 lib/legacy/visit_history_template_component/visit_history_template_component_widget.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a88ef9c2..08fca23b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,7 +5,8 @@ - + + XR#kzZE zx!AiSE>}bvo0#2rb^FdX7i+m2y=<9S(ZAx)JD+WKNzyWWUbt<~)_pB?#bx;W`z}}T zfm64hy^lsi|M-q z`{(0x#c6xaIse7_|GE=@U*mGg#k==z+gk9`=U;NMg6q-U$M$SJf1hW)>zDX^8rqkh zxpmKuZN`Ux;9`9bxm@l)?Av?xIo?lxW`~On-R^Q#ePiGL9s5r6-h2)Iem~m#T#~DC za)kXr`o7DJPp;K+nOs>Wmo>86()Y6Z^sm0|KKK2b8r?F8<0_v#COsxS<;r)JqGfqi zRU2z1*l^%0 zJ!QcKeeHG1te?+rPk26PwfB@~!9Q=qE3)7_Yt%l*XnN_-Hc4t|k*I`**ghh40E{zAMWb4PEml%i7e`G{2T-Z`E2w^Rp}bMvOhJ zsH&3QAomurjr`Y#wZ2j|i~stIGJi#J`ohxPevO^~N`Nhij{9P{5$U2xSc%I@QTjKA zEX#_K{&^vNF8gAx@kk^potnNzGuS2I1db`^v_f+y{~15suGLt^otS~)Dsff2TxVkq z<>uBVNEVuduZ90erm$!&%~i={i}lOZMj~Onv1mu@(t#x_FWmdWPnY4ppMH0Ae0=n~ z2}3&7NYpK#H?Sre4Xj(dY5PE5|3L3RUsq2rjY+KY2aH+aYH+o>Tw7_(WVu(zfF#PQ zTEIq4pxg&zz+6V6w5`<_4~66Yjhorr8If7p+^PlQ!Jr&SjIWphE#~T;JR%*Co+c`Q zlflY863JI^s<%8rcCVtYPKFOMCX!L;^lJH&(H#aqP_Y_A|%k zuBnXW#(lnU?OA~}_wHM9&Bmr=c`z>#3lW+ol+2o zk&I&lmApw_dcpu?v!QIE%6=r+D?S4`M{sH}k?fx)#H^~(-P7cAbzll2@z)Hnk z1zEhIYf*`qqDSIf!I|OvU;NhW4Og$a`(yJ@9WKA|#*Yau`1+StUA1o3{EGQ!%>U4b zFjMrHqq`sWRJl?ZA>}$O{Te@g9@!J18B87#BLWlpyU&wyJ<4Z>?@14Ei7enU+yBAs zC;JI=s~_2l*} zY|?~{poZtarS~jqus=wLXx8pS?&tB7arzek+tLj6Es3H}{e>?AJ4aR&IsG8(;y<5Y zIv*5&y0xnzd$vz2KT5xck*$=_( zeux_Z$2c?f7q-5KwVuOIWid|Ff@4h!I1dn z`ozkH73T(;w_H1}%EM)wuN)Y1V>nOW`K@3C7P{Se=ZesZk#d|cuy0WT&vNh8qwUTAwI8JZIX z%1B`lq#(lJv*x{A!)dPR?DO<5{V%;%^CdLt0v+6tew}Ib^Tc&pBB8P3^dGbYSl{J` zHkCmCEv^o8ghaBO6WT}rVhA0^js0s=BWYR5HVkKvtCqEteN;0NtIC!5SlqzC5%#?Z z{Zz)2io7NdxESemn#MktUI&EOo8hvUoY+n1>`queOJhnj9plL5rT?rY*iBanDPBYK z2VKT#J=`bQC1RftUASE0a8HLudMn1;=COw67 zVik?-+R2zTGSj)F;&6}ObveN&Uz|L~YB}c!xN5@x2Dr*G74WbLe{%Ae>p4e1NfUk? z?Y(Z2c%r@JgnObk+%4d)W$5RtT#pd#b4>WyWWVcSPB{*DA2s`V9qqs17}saEuLArK zmxQ99aB71f?qlrD2`;pxI^k6&o^Mn^DKOvXl+9?XgP1sk8ZE~P& zw#Ot@jp>o}0}^M%3;EE0WOKqHB|n^gqCWj-v`CFaSV#IrlRF__Fe<1|eh?qzOP9a~ zn>ryq=~6P<3zrx82V3?E4L=|v7Al&iKs4;*BH_!bEUR=zLKd`ej^9Onx^_wn1jkdK zoMSlL;&`qpL3RKK0S__QIn)nu0}d7(xZ(IP&tNBfH@nb9n)qs**-rRTt3A%hXQd~x z19|^!tpq8^+i%ZmpBC*W|0?Egjq9m)eHjvtxz=KZCb2@WGT_BAmp{RhVuk29;j*mB zExbDJCO|GD3dL1FQ;M1FSKzOKp{V7)=Zi(7aqo#-)u*e{WttX=op@jJ#3Gt@;tEv< ztT9~|35CP#g%dwfb;5QnW{1&%)j52nj$~b1FI~_4y-aeh4Ty{bE&Fn@pvrA zzMiY8iYmurN-(`Nq4{)8x>z$p(G!nLtu#8}5ROR0C!W#x*tDY0@fAH_uIQgk3Sw-& zq8tt_lxz0Myq|F`?d@|SWyd~ z?OE;9c6-8;v?0-dKEb&(@8h&fL2vL@RYBvywr)u-4# z@Dcdhz`o=b!exBT1e`1c0auw5PMV2;hn;Y)nG1N-hWAT9(2 zi#Xw2qZj?fop7$v3wX>4cg!Q11*h{(w3o8r&)aa%3~;Xv$2_=(#rqNSn1+5nyFKQ` z&o?n{c@})JJ??Dwq=Vk%$D{Ts4~O&hxYYbR(b4*z{r4I0u>bDyG3)zId@_G8&-y#@ ze)jmYvi@%2=ko-!=0oSTm}f;6oX%?jFLuJYG3PT-?00y zVV7s%HXo!s9DWjCTl4gJ^6hbm4@ut% z-;10~C)q8QXb8 zY-z~0^XE$~$pyRSe+Vi+{5g>GYcak;{v7N4A;lV^Dv5to%e@Ev-O%1R>%t4q`jMtR zK0Yxq{y3@cXY2aj9ozT43zc}sqWKFJi9U}@>u}1G2hr{mUFwd0+p_xAv?r(>~pQ{_XvgynnJNBNVCH}Z*!GeY4DeRu?=9XsERqC1r8D~T#IG15xw!t%( z%6RFfk$BSCLARWn7wC_-r-o*?75r!h0eDR;PtFO&PAx1dDyyF}votiRw+GZCzok7> zF-va}QzVzD8H@pnq+p#y&$eBQgIcOHcMA@4SvLH85?ymI*R;o$uUN7CF_Xf(PU%@c zJ5pW$wP*oO*Qe`>((i%Z`-g`IhlR#*OxnYF`14#=`q@g(+qAZOxGWWL*@8m@0@mPB z4##=vY)^Yuv`^ab{;c*#Z8-H$ds(!vu;JUY+NTMQb8#-L$X?jfZQ^Xgs`W_lrV37= zMa+0uofbA|$XAoio4synNjQ)bGa?N;`_`@QU3}W6ja5UNI(qlihy31HB3iwwxn*hH zyg|h6Du%WM;>C$TA`vH>da$jbDW+@dM`kZ=D^4Z@2|X$WiVI4+tLL;w41MLI`o%4U zkk1@PPRj>PT6S_;3ivV1Rlozx38(W-z-1@gld$264euiwSa5j2pc&iaX8H+R?XgzQ z_FR*;+mmi1#?7(XL!WcDKWg_6IJd*7J)Nthk^4OSdt7HZBHf6!>EUaWy);QuTDW(^ z)E{i6wAu3JATCghP!9Ya4>qqa5BYMUTBvlmYQdth@l)fP8l4yzTQPRZ4pQ$2FI&5K zPuFl))8d-uQv&(9eqE2beFZ-u?|6;T<4Pz!xUY>X^YNN#ectG zmTsB`q>`NcLGj&n}DlXaN2IfJ-*KU&5R$IQY&v zZl)h!7M$XcqMvdH{5aQV1iVTbw(&o1&nxBOaDIMU3eV={K zrpvW%if4*`a_#ouF&kgfXB_x&eMYn|Bsh37g1vShcrsVW1xD5kZPf?_EldGG`QjJWfwYC+`}BmY`F@uCrB9RNs_*9|&*kW{uK8br-K*&S9~;m3 zG@q(U=jlbVa^fCogNpx7+$U|8l|tjh4fIJGJn-*;Fx74D7XW!Dmq3W1u)=UkbyG1qi1UK3Fqq6P}z4fP%q{kpf zf0F-fP>aTODfFkef^JQY=%It92ZM%B$&ax4C9FA?uY_aiKeN18ST2aApDjs$E0V87 zqO30cd^AEh#DK$m-~b&Dlx~p|)1UyaDXWE7^mu@2@u(4aUVlD>VHFm9Pxd9?mFZyX zA_eF+{aaQgM*4h5`kVE1dhz}_4PO>CWVM`z0!}m(@NgEKXei)P7MxBs0nf4F{e-^- z$L@9ZPc#?peFQh>`)TRNuBs{XH4<_r*vlzMQ+6>(2lRcjm5%j{zgsS>QkJnmM-HNP*+KAk=rJ_D6K9M^rm zPp5lDFQ{`ra>2E{1S*T`2)z-h$a{;MK^sH&=}!R;jWCVppxldX=#c|uQra&YP;;rhWhc1l^t`dyOWI_$@!_M7M4Qc z`cI=Kp0CKt!gbM zd^ujyB$!bsfSeW-W)AxR1e-CtVH`x9C zG7CP-hX2Y5m)^7ChqB;l8~&;T{=R#z4S(K-6TVja48G3qJ>~e`3-SMw%B_*N=DjHk_j9 z0TxjWe{TNh$btz|X1JS3W-uJaTxNV4KPA@)^!+@X%EcmXUX^O2`O*1ohEFkVC|l%< z@lJ8x4h(FLhjfT|2zetcZyFfb($cbZ`K-ap@!^J{%H@Hfj?e~@TkybxO6eEc2fEK1 zU3ykefBlMi>$lWRbg$cLWAJ0hm&X@h3oRsNz~9i=_1+bTv&gI;e`59PP! zr8=wiwQ3w9>>U%(+rnSdW+7QByewc*E|aJwJMbwT@+`h!F@`+L>?9_B7VqM7iQ`1d3} z{&5Gl2w?(UJUb?XK*LGglGDEx+|fU<2|NR15j>-Z;+yA!QO1YCGRp%!XDuB)t9ziG z6hK`&aW!$y=4i)IHn)HRk|g~vcx8}ti-iGDXvNO+QLLklXM0l6174d%O5}C=+Q>P8 zwabn`Xv3#$K#1WK;A29wFxEcHI(YXlElTaM9?4K=x&)`S<=0x zWA;#TY(c|N#aN*8wE4rQc9ab^Z@Z&m!0Xo%zB!?w?8`BXa89sTVXc4}zM62=sTVI^ zuxCltK=qQQku}wen#NX}t10awjgrB#!K(a8g64xAL37*yDmS|NvgVjb+BqK1d;{Sp zwe*f@DBriWl_-zhdS6^o;!l)f)9R(0kaQ*Y(66ERrp8%A73QwB*5Mm*#PP~D$(kl_ zDx=>|9HS-K6m8F163&(V3|wK)<0ym9YtG{qXu#Iaw$=*s5W>aY+8=;?hHX}kmlcV< zJ!fX_c_6c~(~`wP19g_b*&^t^JqzD7;VX8R$3=N>d_7Xgdt1QQ<&Ya1peYd!Ln72U zSB1NrKHxxLsik|nyG|dTJK9!+JevF1qIhZdtfmDOYnPV~mPQlNoIs>(U7&m4=*U@p zWj$-!;<1)U>yql(6K&oNTQY*&-2I37ZZ73`y+U}}aOiPN!2gm3Cut$zhirHsJ4|{X zhm%wg{FnVbk_zH`uiD=`BIS^NWx}7g;r-~(YEOEZ=+E&zcG&T~7wqpHVegP$X7=}M z2mCPUWhVSZC)^%~^fKrCp_iHM4`#thij}%(f4yYGfiIVq0?zTZ=}2d!fWK_FKZ5x| zFEin9XThPDnecbB;LyuV_?u2R>ER~)tr_6|u;ExI2cGYB_<5=>~r1jHh zQ2&tYHIAhl*48FOW~^KT({tKHBCUTvrs8b3D;t zqPs18KKW92`wWd;EyrSUy=wDzzng^>HOi!%zMk4xJQkDF7uRxGG|19??;?wfJUtG_ ze+v{gp&5(hYD>66D!H>yi)71=ny}9kRfF}*QVSLZV_W+NPiZOc7;hZd5)G0rwDkAP8=)XZxUQkO_~p? z4Z9|?sRmsbS#TuKo0@#YTvJGBNqCUZXRl+M_hfo*uMPWhB5JUDMXIqs7Tg|*$0NJ_ zk`#z-8tgx%t)z3=+`&yTPFlB=(?Wkfro8)e^x(7sUPr8@8ogh6Mokf zapjrwH7yG4D#1B?dz-Y>wYIrE}K_WLVFE>#jR_VCwlk6~h z6!f$Ev--&TuE6;?WBkNi44k~~SIz-+^0$-6S(NWG0sRYy{uTJ9`RO8{uX5-w0sXN9 z`VNQw4bb-_I&nnXgBhs1$%g)ppsqo*{Vdm|McbD+v=_ODpbpwD;+P%fJ^UGMKk2~t zW!^Rq(BJU$NA&PEZ!2a&r;mWX%b_n}ZXtB-#adLl<_g;V>zqU9 z8eKZ4Gga=*@eo9n1q04jD_~wiYreYDPynE`^06Rmt7b z!G6glZBzGH%AK$WXMB`Tvo|ox^kYovce?&C1K`Re&Kv9a8oqj-B};ydU0$BerA;F1 z9A{fg!r&%$Duv_*lXaz^M0MPTWZ~bw5mjS~5r0X_h?BifM51zD^k?<|7tL2$pa=80F*L(Q8ka54poU>(|ZsMg)!OQDFOpYrKymUHm z?;*NAG8He);Nu)&6`23jT~A(;rdB%9ak{^}aDHN zUeHq__A-;0H~lZd>7gCaKq(l@>dJXNOCvF5V^7-x#9dW=R$JFF{hZy}HEgfRnrJ&* zLhb#T^T$8fJF(#J{3sH?a_$+O>?h1Xr_(w8j39J($oG`y zYj(g~Gt2ixaIz)^{4Wk4k~mKV+~Hf2ByJ4~`15xAe)L1SEWyc&H264<@3FMwdoS4E z!}#2a6#e}=3r<#~fWPR3+vAWGiE-@t(U~sVAIyRi_X+s#XMq2o4aYn)MfteSVy1xkD2)ZPWpO(pUuiO(&dN%L4w^4Df&0 z@V+d%zt8C2iyM6V3yiC|XlK+}mN7T%f^Rqg?q4@pe zx14^{tO|QVNDcIa-610)IE*l%mHPm6rzXX4l@C*n;*E)dyoruO%zv=u_J4(A(HZR$Q)VMv1`!>!+Ame^E z4Chuu<6v^-c)f>%9vP^eUXSl0#^8k4iw+swylEcOWcCg}c zWV5d#^#d;FK@p}HY)`+h>2EuN6&422Zl+=&XJ|Py2D%FUIX*K6?zvn6`qc+wFl%y{ z9k*z}GbwD_Tc{P5Jqa32Su|+F@bz*62!AknEcBn->jEM$Py3+o01tLVHxoL@RLdfQ z&=IzwHi zZ)pZUagVX>e23gEc8KfO=1F{vZRMOT;D=0jKQsVff}KEculqf&8@Ay5-@+xlX#I}a zdT_Eot2MW|TwQ2=7MDw+^}C|=oPDQZpD@>KoPrO7`i*?c2{w0rWdV|#I|fTpPYfu*A0 zCi`gJn(`17F)dWKuy}6!oO#RoqUFUUd9&;0FEOxB4xG_4Qe9q~$PdoyUOLdQJdl^` z({O+w-K(~uD5d1}&e2nKc?ETOWvLZQ(;Zyn{?5J&OFC0kU6oo%)5cIli}wIC1(2SVXg zpk}ONlANJu)80Ls9H2)!=D}Gjhc%DK2dni2I2a>i4IUy|dKz4xbs-1Mgp=hY;PtMf zw8ntCb9^)Na3>oteSMohCTeb`kn{ z)wWkN0cjp?Z!yUvYeY8+Hy)k0G{rq}9X+FD6{S=?qOA|qt?FZ8%2G|g+t<5d=q>*1 z=2}BrAD!2Oox?|Qqm~cd(coHC9#+SMORwATzc45KxD7v)1*fxJ^z-Tr@OQG{-?rNy zwBh|UYa4zPaMB&7;`y@O9#oQ!+U?&axS$^HKkOm?;u#LM1BJ|Rq8?JvTABru`DUVG zNu^w&C|w;+TJjT$)A9{Xak~?>Wu@_W&uB2c+a#)qEk-A5{J^HFfcFztHrz40toAg! zOh2THihgKz88~T791h*nhJzZJRrn)O!=j$_8rqB1c{dA=%wrS&W)?it&)*5osoE#S z!INDs*ADO;cyC6&Brk`R8Y1cni5=eN!*|%nz?)rDICg5jOq8;1f*#MM;8f1W8PdPS zf8Bgiij19MW6jwevgh_%*4$pQ;fI}Yu5Sw(yE)YsE=AwO?dO ziX2>IrV6Ewr=`9l=lk#Q=4i2)>b*JlHlHrX4ey5%xA>4IDofrwdtZ6b*S3fs`&{x>mEN@MVjMl=?A z@V*Gc1zJ6DYvFAHEf!T-l+T(J5>=Q}$Ke7B6=iTCh5lUZ`D2d6yk@wBl=?`L^TyJtZ3OM;U1pH7IoYq6YU$WrP)qtZ7KT2@W zeKoRH{(o_M2ecT0PVu|HTRCGF-r) zv*DDXW3?yW8u~$hGkxzD_V+M8W%`=q{4xtpzBMt|Emm=J! zC*aT9aKhJWpTXDhJ>W%|DB^oB*xx(CPHPYC!+HXQhJ`$)h!eWzK!m+khnt|Tu+`?s^;v zqN5~_IDb%{tl9oGyFIOEj}8B;6V5$QqW{AL$DT%99P!AfTsTM^-WJ)4TJaDSY1AjK zuI0Px81qx4M)Kg>nMlns7Np1shh`!*ed(jF&)aazcBe>uE5%*R*1KJYP$iI}sQrkd zTD^GP!gi;9e0!!fTT43_wg%bmAxCT2?trGzcbRC7!_WsLZv~!`i!xIFEOU6GYYwwGWjkv6L6(zOP>_fJQLx5L zSlP7Q=Vl>AL&A!uzpFNeGDN%e1VZ4KBW*=G#SU450&d9Hvv@?R6IlD;n^?-%x)(IK zgGVnGakxnXKC8cG+Djg4k2Nh|cd>HV%#iyNrp-xr8icNzxza$Vj~S)Vg^`u?das|| zGqJF%vuSQgd0v%KQK8iuIEnnByym>Rw!#9`c9dtayPB(JRafNZX+=hDQAb%>Adusi z<(zOJud(Xh!g#o(1jn1?N&t^8;1MIu1ejRTm0RNwr>51e84uJARN+oUE&W?tJ!ejJ z&73*xuBxF~$N{OOf2(G-H8r7qb1U(_S(Dc5#awBe)%a&8Zm}d>rJ0H^_U(3I0cA=_ zih6Zd@eA#reqry0b`i-;wYs-XIc4jP;ogCMvLDUfF&eTY_$hb{l~?F4yS-zqvA{NT zfn8^NN%>5Flh?7?uNz3oJ{zh*r^V<}L@`mB_OylX<2NdVEb)2c4K! zZo!?b`!w|u-H^^O5&m4IuHC6>gk3(co`*RLjmy3Z+vM!qzIP8Q+@~5n9dm{{5ik8BVC7Vpp$DEW- zOf1s&z3k(;&1xhHZVr3s1M$Rd z_`;o7&r2>zy(YDtch8F^_faiBFYRXQGrv)V&)}cz8h)4I9)y7N8i8Wv++RV4?hvOa zuXjq$+gTEX9;#BgaXB8>)!^49@p6bAKMlOUP2-hsD+XE!yUQPlF3>ZP7^UYT{Q`*wXcQ zEbNZv#edMZ&{x2cQPe;PMAJWtvjo3J{92sNiw1I#3X%SOK~A!(?g#O_s5=~cyt_I5 zC$I=}r63~*AXB<64#DOAVv+s`AD|`GxoqM5l2r{5_s30FVEfor^+-#LCn81tOKSTk zs>jA}p*-kI$Cgzs>1f$j8%e}-{NXv5^iAw(TRO0KRp+^Z>I#(3!+n0eFj_pXzP}sw zF65rB>dxZA5@y;l36X~G593;mHm4r&{r za_++cH5Q8c>GGJ79u3BQIpJ7Hx|o+YdRiKeh5}0D#FeC1N-ZZIkAyjAV2|GHz7?l1 zMuX<}+pPLQbY^onIA%ZoPBl3;NbkCDMSY9;pd}U>Mk~+wlL?vR^ym_k`*0+}xaE-m z+L~Y_>`^e4^vxW_ko`IJu|?Q%gm?U;DH-E=x<7qQ*OokAAQ+Z?>cE`2{fb`>p|nEY z)*B;X7SdwZ#8ge1Llc{B-nSZgxze9n+hVH6J`3eJt--Q3)`JMhDj?p39m{a((x#Y@`ub5Sd*k!A6xZ(-jQ_B7@DPOc$U z@%`y%h{ypiW%6C=7RZk>b01=>!?En;gzRy1XQ!!nNIS6R&n6lM>*K}2U?5)JQmH|D zT%hL~yuQG_JMKJdv>@b-#|wjc-`3l9eqIOE zk9$=gJQiOoWl!TrESlcQ?u^D!Smng^5t(MoN8o#cOGWGn$U$D;<&W;T^hexJZA0cO zMNHvg#)P4vz<-dPugPP`DEA0qo|4gs-wHCCniALxybdwMP8<6?VnBJ@ZdqEp{J=;a z(!a0)@^;*^xNiA@#d(I-qa_=ccb2qo?@#vV$+^orOIx=MCG{dh8%Qj^ZsUS|OKTF{ zBmuh<3$NQWf8S_rVn8#lWyj=_uGJljcC{-?Y4_^3k<(kr&NuIRgO2~l>DUQ6E(INt z(Zi#KrrWYbh;-9MX$g4ED^+Ml@#Z;eFX|<}-?6QJWhII`82o7V%4+}RTMkfm=Dz*A zRh?Dw>UdNRl1}IKNZ5LcR+CeVt_oY-+Qm4{V^I1Xj=7&22^xakL;Y86(TvY(>ZMS# z_VG?1kXG@Z*Hjwn-6`rHOY@}YAHI>3ySB%G4gf8Vcil~q0M-rG)Dy-@U0XxkW(fQ@ z@JayiN6w7DJ%~9GuO~-U-~a5%!&M@7%2lQrN2Q73f;6Yx2JEs7<@nw*Ph5LI%!+Cu zu?rRTIVa(A_2*Pl%}yEzv$}-zGfM-0%B7lqC7X5-*Q9M{X}?6bUoAeZ?ZUmkdX}oE zKWlZIexrVMzp41rE+N@KH3O+v(9F3eC-qBalEn*}*Ib=P_$ZHjg+}>`)F1>cgqdIf z=Wyw-Ly+(yt-SQ8GYIHLF-DYH)Tm;I=O82u#m9jawVz7r1Y34m?(Pt%f+W- z_D6x=T1|>PGd?yp{tTTPSru?i(nGB4R0MZ~OdXP!X6+T zm=*d)?!RUH;PxF?2By}i-#aVn^D4Q~>J`mPcXzrA*k-PX|96qpxo2tf%9?0yEGH1I z-)q;auL|ZGQ5GyI>^px2Y2vcF_M-lxl8_Y3McI0oAp9PTwB5!FabT;&Q)^p-q!Q`m zzFD{ojTp_8a?p7_dmB*QDV~VdtZo`TW1du){xm&xz_t{++fHBFw6>ZGbNM54&+a<) z!y^qVFT#+)+}s!omKFA0v>G~}tmLn{pueOrBt;X6Kvf0m>`zd2XwVOBo7W=&SK+evh$T0p2k{CzW4Z1cKF+9bDdu#sseV|Hdu0+>QmD-e}zn!WBK$ZMqX~X!r3-Ktzd3zS_Y&}0Pe)~@1u?!1tzjc%fYG0FG z^%0nKO&*mNfC{|M89&LefIQbkm@7D#`Pw3ePCEm)45&~Y`8A|sO+QdNyE3-VpP#FE z0-F-^Qu*G!7q{+O@>ht`e?CTq&d37shD(Zm77KgieEBPNHIZGL2G-3X%Zmz~F$I;* zhWTm?x@F)2FAT6qfq_WDoyG_?MN-x>nTDt|kZ4q+5f)UUa#HObB1^OcmsGL}Mip>d zw4!llThy*5m1T`iz6$C1IYH44X z>o0z>@4^fB{n9!M*kL7BTD6Og=3Q0sc-bwsGlWi>0&wc5L7P^JkXmbGS(IFNa>K7g z7O@vLB+0BP>bAQ{)yrDg?^R>8V^PsMVM}f?=B@7P^t>I$<$Gy1{uh2br?Y!ix4uQ_ z;p>VPb&SF_@n*U#+m3vqw!cDW32a#zVaM0>ivHRs5V(?HGIq6)$;fVHdBwb@hOPNZ z2e@oQ%^|lRe2?mZw91z1$&zZ11ltCca*#bjk;#(^4?SMcIns*CKsj=xqNzrIGQ0W^ zd%AzT+RY-G9+TX~U5)7))Ix#G%AefeehZe#GC?=4Z&EorUa*gEHxgGcqyA0X+|p0n z&njx=qEMc16}Pjos{fIZzBAdY85;D9dn+T+uM0c-|H)K;j=UF8MP*e)`j@e%F6&x|=%N16Z%-8Q1G1 zmkBYuwJZ|evQk>YxxQ80hBQTFww1ZFyj#%zHZ>gmhDCd6dRxwzQuG+di8MP;^WMdukL)XXlYFKGH% zIB?~QQBeSyjh9d?bpK5SFCa53E(LyEQQhBcV_Y=Swu`W3N8nzROSh3ZwXKwXzg=U! z@G3zEN&lwA#5v2WMCY&c8nA7!Wg6EZ_%V|~?<85q+?v6)&X-l=hK%p4Yjuf5Mr_Ib z{1jfTLJ37F^}jnkTqk=F1mC&6knNV0!bJnw;ry4WMuW|6C`35GpF1!)O=yGU*X728 zZm>l5F>Jnta8<_33%+tcz)zKvHBjq}v+&4zYysZY04a5UpjDdk;zC4tQ^`kwwK3mZ zARgWTTk`uZ_@w9*5uR%2ENMW?r|KnZ5(Y7x515^BMvysa&P*B;y-UI?adT!ykooQo z$oM6E6o>xmqcq~GDoA)}4>;PzgF?=ymJqFl@(7~yhepUb$`v4X+4kE;8z#sF0(+f9LfmOLG3JN2Ex5eGfQIU@a}b zfO(h+H5|)GyWCnzcB7*97`eY8c99|!CV7Q;)U?n<= z27i_*jrU$dpJ2ON6@Qe~P~|&EeY{XKjjTYsKHh`H;zT40ZFFCOnkF^onvsoS8MOA! zvMoImC-+9~LdkuUXvMxqw0eZyLtBg}_8CnfSISbVx<=*JPCP5EC<2SJ{{wwO77=LS_)cW+P2(WqI}WB2HX^H?-cMu-6COtr7zoc)iJX)aB69FtCJ3=mBJ!7;BdMj z;_17@^j_^fJty=@z&;r~$%}Q2YO+kZ|0dg!P%dXPCf4P`wkh2-d+o)&@at(iPia_L z$z{4Qso&#f)d3Q3`_9<~v+6f6t4#gjr-J%BczUukc16O?8u29ROSxhU%$8;>hUSu7 z;X?j)YZ%+65;$Ba1fNNLx)XfFy$Q0S-KwOM5CPkPr+lF_O z^@W#jPzOtzzyIFVQmmqLELCeL?zwY|Vyt1+1tWbsN9N`QwfKp*BU0bR>svNA#1b)2 zFg)j+9ZS#bU}1JbYdJNr@>6>Xs~0ww*6MLQhSyYAG;#H&#$^B6GrHl=En0U;e?du5 zio=*LOG-BnUAeKebj#&~wD)nVnP!04#TMx7KKJ|5E-nM6*x3}Hbbp2Wc_D*%?Bh@P zNv90O6Mt;hf`Av;O)aK>O}iVqO8 z_@r;;sJep0?$DB%Vg)HWC;e1J znHqvirqOpc=Vwiu6-hLZ+a53yv{z%Gd^bR(a;)&oxP z=QM_rJON+Yd>N*OL zj~Qfg9x3}_EiasYJ5jfyuYc2Aq6BP=o9V46GY(sv6`!S2!uow3O*AAbYP{1iZE#N_l(V-t6)#CkQZ}4$@IGpG> z$>BUp3ix~pe<%OS5}u>d28&a;@DZ36b_MMp+S;^-O?9ixa*WxUDbBj{;u>Sn+uLUi z%#^@VwH4cXNypb&6j|qt<#e>;MqTd72`&GJvpC)}QRfC`m6MD3>sX|j3e5P8rBuq? z_bu78#2-)s~ceWU6wSRk!*6sCH78!07cle~N`4m(b#?W?2cUNK4-A%+BJDy?1S%+YsNkI}imxN?&(E(` zT71gDnIX#VWxqjX5f3Vhv{JBr2*LJ1&@X3#?e)ueO^^uP%$IHuhi5P+o)yD6v9)`& zig?w0F9cHWbDT$cRc{^#_$_!-LR7#d-3=-K|KP9vwvjkHt|qU89S?QzdiZP4`Q?A$ zuch5WFRv7v_ZfMRjx=ppw{7%n2tAsO1CPJLg18!Tg6QG`IkLEm4(cy|kfo=C)ge12 zFW92Tt95#uC6XHo)o@UgJTWm&F(&>@%Yv=BvHnIR?C8Tr?qtgLGoy-5|vyz1E>{NM9lo=%jZZ zzt%lQ=M?E$Z-Ex|{A{p%4l}TbrIkxR5w3@6GcvNA5Hl!PraJ;$LTiDyL%}5=06x$3 zYN6>rMM4eoIXQQ6n;)NfR0(HaANf}yG5Oht>V85pb^|`$>&)|zWBwENCeGToa=?hL zChTjs^b`1AAaQX@a#g1l31JAJ!vhVUh@P}UKHjM}jEfeY-qCdW=tq=1w?|g)YF$_n z4L2{H-MgiwM0TqjpxGHzEzR^ek+vtFEqXtF5erh+sr}_9cudXQHjPA+BAZA=!lmR7Ft_ zQBnGj;(3=iE*D*1FIJ6xi8A)3kI=c~e#P}VKYysl&q`aJ8JtaY>X22-Js_gnSK!`I za*Y?vepiyBc3L8VzByLsajcMON?ubQBj7vM#?4~Or%^0#K;>wX1U;lcsZsIdz_|)$ zev66k4T`S9uR*(wGNZqT`I=Q<__;_&B4KECZXb!d_90ClqDrDeL zi8k>E#RzxDkjeRZf%#%~4E>W=3K0x``A`_qeD>t;aE@f%rRPf5rZ`?p4Ml3};!Qon z<1n!^(~7Fw`sR(M3WmO#0HNK`IX^(5Zt-QSh| zVet)`a&fg>v2xeY)&%}bZ?Dv}i>owc+qSBw*^Z4%ZlYa^T}8EFJYH6sV}Is1Q1BUi z^0HZ5hPRU*$ITQ0KWNsL(GmST&R)0kk#LaO;UGk$AeMz(wwbC4M;xiIK1Zr1V%|K5 zNC52Z2ID&EnMsQNAoGka6pPABBkTi zi+Wn-tS0_jTG!Otms(h+3YW%5?0&B{DCBnLEEQS(^RZ^+>|mkN35-}!VO z?(4BngI%@s_3YYE%&*4Nn<+(;U68&Y7&j$6J1XH0u=FV|D}KX}zF^9bqg;jv_{#(b z?=G7>APq_1hBsgs`zXsEL?Rp+FLshm23hVBfC(^tPG&4e(UFtc;A>EIjsFI%=ysWS@eR%p85)zHo$LqF2D(#`e*?rkVBLSZ+enL`G&HN>vh~ z0Xrje+2m1n6nqWeC+$Ylj^RJyD)gyrqB?@b+vKVxPmzem}w2UZw zY)0gC#@L+B_X=6f$i`x@QI4{|K}LWB$nK~8PkJJkTUp7N>_@8pM69$W6+xCtFj7=$ z1RxP}j9iYwl|7^9t?Jagcq`2C#pf*CIxx!R!x>^1;6#uH?fb7Za~?)WsE9CgL1bz- zS+@Q;vg)TAmSN8W4|u}y5UQjpvYPm!CmISza=w_rqpJ$L7xhVfkwE%6HaigUA=h>j zVoM4;J^d?xDC}eP>5nV8Rv=Ef}=jw=oOj7j!9`FAS zi(=rfE7O;XzL(*KXEE>lPFt3KkAIeFEQ;5$?_w+@zwxn>{JHKj@h~?AdPy}t0{P4i zRI18HRhq_?cy7BCM>qxm?!~w<`zCt>vijG&fBsqeHe@nBLstKW`M@V`$n;@kp*@An zm>w5&G43OpQj5i|i*6lh&{VNeQ#>q_RiMTw6CbNcvLo!oKBVe_=)#tkvHJS4mevJP zkY3Y+u?4LJ8EtJ@7z=7&u4pXiZZ2;sENEuSlTC$1jmczV!Mw)}{dik<&;Ahk{UFARX*}uS7ZXT%lqL7Dt zhI|72xa7KvK~{nA8H2R!AyqHzuQ+WxZPDKO747-eP{X19-y_T0cC4kXJF##eu6zr{ z0@7P~-srN)^Q2DnUusg2M?Xvsv@af*ij9=Op?fVo(X8sn>7PpElHZ^zcz=w2f-~VI zcyf%GadnlZT~f(852EvDqW`QMMN`zs_88c2&>2y&Mtg?x?4QvozaIZLrDtn|onS`d z>+{@&=shcTGZlM#2x}V0@FLWGQ^%TdF4l-^pjeo5nmi9ulkZ%VJ-GQBaH4;G-M2G)#1V^rnuUo{pO= za@{n(c?d6O?kS!^yqktg`2#O*aIBT{uQHSe{~K97Cnw1MnUp zjZpQO=ZW?}67W3HOeU1j^iCf7Db2W;)Y*G=<0G3k*RSaQ$W84%-F#9P;n7Rk(5`Y! z3$#j19(8x2|0>FkTb#S1frESGENMSk^9k&7_aM_xT?!}-k_a9i&l{Tj($+Hk4 zd2XYTCD+BAA4AaK2wQg}E$59>WV|4?p*{3yZ9g9z@}e2q+@oCj-pAzyX|T^jyAu&; zN8s6V2O(-ClsRO^^TavZ7gWCZjLx#&bscqU@vR(c0h`K&?M3}Xcoi+j7b;#|yZDTb(%v19J`MQeXV`YEXG$j>BuGP8&D8S^vQp@Hq4 z-Yu{UX*+3K{asu8%#x6HS+qdgslzzYX;+c#zJFkI<22PFfd{;S>>2EYq{Dw=8z|6h znslHz;i>m`8L#Ty?17y3RAAf9aT|HQhO};s~m?*>Ver0wd9j8EC>_9?cx-3ZR zaOU>r>S!Xu!jangc=No0WjMb2P;z^@LXuAT7Jj`yqHpQx9H}aX)#;1tN=~Ff7)1Z9=M(G?~UfJ;0IYac9XRQ|B^wDg?LKA`WQ_;dCiwJ6%db{CdiDx?Tv4 zjO4wXp6U1|X};g2-_CLfD+znxs6;k+JG2#{t7O}dAPgCiA~}<9Q9C))v>V+`ZIqlT ztjA(ynJ?FfyM6QX>)UGQ`#*)qhRkllQv$(H1s2w{HRKQb+;Jn}UnZAS!fMo|kEef* zJ^CA>tG3b59*O7?{Qo1G-dJ~5Bp3JUB3Hmvd>9%~@q>AJ4qXx+uD7^; zUX0UZ9(b)#+#W-3)#50(UL!lW~(~6eCX|>6aVQ#8t$`HlzO= zmbj?`c->xE2^0nu--xiP!CwE7O+H>&2H((iy1Xk83|%UW>;KF!zrIx0&X-{cNU+Gy z;TE~y)hBf3maLpiE~Wo%WuRx(NGEJi)HhMc9G23EPOC{i{L0b21#ULNvu4bY?Or`X+YF~2zObT zh;S`mS_lmbK0~f=lN8|I!K{!%6 zgt%jt#yuvz%r!gPYPR({aX{Gl;n`+-uJK1wWWRTkseZTV{Dq}!8tYn++I)q?4i0%+p88f&S`F* z)3mVC=g;xRHQYfDl+K%Io;|<1dj9O@6`e3tDN1q~Qo3F)Lg7IHJ8b^EOJnr?d>}bxTNFyZ8!t#AsOUULR z=?4kH88?XB3Q1>02re?+A(;pPZgvc_*TIQUr}+-ZI&{H`sL}>o)2$khWh#jIRGErv zeG6q}KgJ%KQUq@NzhDTW8j0C&*3N<;n)ZQW&hoGt#7ObosKK!1JK5vO9^ZGiC`!fd z7)CvyD6z5xdvwasOEiF$1AP2BI7JN1D=ROQ7huB{pRrJzO~AP(YiLMH7!aR&uiSa1QjO3b-ZXe+1v8FGfwhiQ)c9O@(DGu(M#`A;wWu}B9?-IOC zW=2j+3pTo)14_6ER|@=LSvjC481;AlM>X<$3Y6k#EV1WwlCT5)dQmj4mCP%kqOB0| zpNY#Xwi3CXD`VTXa}U(Y1^p~|1|VkyxGm^hZ$Vim*Cli7Y3u`bNmR31Q!(6u6AfCuH9}b$dB6Iv6s03sL_Q7MFlL`~$YQ=Vp)Rjry2l_FP@{nwJc-BQ44Xh)UAxLjHl@_Ku=_cboX z({%ClgE{WCV`W1nQSwaSO}gbJJycu=B_VnPoo6iel(v=U1Uxa6zVrBVD$2Zr+uOu@ zb)FULGF7{oiZZ!13ue1Xb5|z22zx|0eh1AR8Jg^WC*K#8cHKi(tmNSyRvz8rk&wH2 zyWg-I@RLraMeGf5$JDqX=}5F8PFC@V2Kb|wEsG{X2piVa$A{*hWovh&4M069oimDZ zMMDqg_+&ER>IY}5ONO$PyNJ)HAc9qrhnFGs?hSo}jgI(B8_vn8*_hn3b8>uuc8O1t zkb);88Phj+hFC#-RzmYT<0#y@Gfmv!0>n``P5Mx4><#{|IK{^J`#AjccT&XGMTi!Q zt!HwkDk3$b;%OUCbH{5Z>ml@Pj#vf6oiHNFXh+m(<}t<05nD3w7$%?j)Pds-h$=ZI zJ&hK$ho+19LOOB(vn8D%5pYlF1EdpJgV$qVo8piFt@26IN!R){iiV#Fi~hc8q|>RI zp`44rIPu>B>BE?LYxd0LteA{RcCtZXgj&%XL4ysB_?jb1gImi}!Z`89Y=W@O&S=ea zK^+RK(H`UZ8x)=3`5P3SK-|NIBa&>w4`$%*cJ_C8kRp8ViHI{rH$=qwH)bT7YKP++#{% zN&9xTX<#DNL?mF6CxQpCiLkV%|J1pyDvbA@v~bzz>}BI)izlLZXZ3gK-$M^z6L=QT z7kokO9@^B@ar$@ia{Zbfb^CRF@%-MQSR(Wf4d-82H-d-rP|<&23%`*~68|XG=QJa* zZ)QbcX-*;nd(ecF2J7ZDpr{sTz)+opM}h!{l%_W(M4b&wy9MG<18tR-JYFem99BS{ zw(eE*21{A@$`-o>|9-Z6<`*UYyQ70BYhnTH$RA>20XX+^(yL^M5sMXik*|b^U)^uV zuim8i71|3p?+#Hbc%7MhJqDbzoTC)1;gvx8`Yp?$Z~CkyArO-K^&{`!6|7cg-dn4 zw722wQUn!X81oFmsjlelWAz^JU^C8@cdc`Ua(=nVfs{*b zWz4MiaXw_*WIZP=*QClSPbvC%0BWDg!e55kr$%F1;I=}jeaQZlBA+>@p?b+Tq-d_@ z@mH1Sx6QuzyHubz_Ujr)z25xzGnKcsEvoKVNGoE+-l`bI-YC~HH2E3eOZ6Oo4*miq zNkeOHb!1v5{#BwSZ6X{3uG4lc?rQ0)U)3{rT`C-KM~rCM{8Z1pruwCHM`-oj=AMN$ z5%^WPuCgKp*P@(CRoCNX2Y(_jXmAg^jw*x{ zGp_=M_Nl}(XE3;(@gvq6hNYKvi!-Uc`H6z=CJ{eR@n8tT=Z<5EeZA+jTh``_AiA;W z+|?q6-ixD&?}TB96p~SQaT!&MNJur0T|P&jEq^OKhfjbb$y+`w6@iX*RPoFiDM`^i z7rwgmJe$|bdxU&4pAvB-KAP4kZRPXHb&k@m{<2veWqAI)9xqUOWFt@+(B~HS)AQ&L z=v5JSO~4IcZNSJKAEJkrVVYQvjTAMM$q361pHUo~71qO2c(xRZm@kineEyb@9+ASW zImW^{){E(E@_#{VQv+C#p|zjav#p#s?uh15Qf+lJwO3g$qK&^8ZK* z0O>vF!QU$M9_rGxET_+ku(qz0iyDg9h|}gr$gPfiw3+lB%W(hu_~#_(jeI4@ zRdJFX7cV0~4)>7{0CJM@4t&V8q|-p6Sg`akGD#zdp;D}~jgf;o!3=Mbxv?PbwS~wH za{Ka>iYRl(6Zz@G|735xTa%O~lz91xFIT3dttY;pOiI0^|I|;8NORGf$jyVSVyL?$ z{PbMgZ$Ux^oZT%ZLDs}IpEtz9>33po!(d;bn`i0Ej)wjI@KJUJefoMV7x%NyD`p3b z%3R7f)YJFLMFmRwKAk?%n8<@cX2a7iAV5(H64Z8TH#ag+E6)_HP-V-1v4$odN zAe9Ka1>}YL`8j7ye0&?OsLq~!%II?x%6la&2XjJxBxiP=xpd^ru8PH-sD2MABrAD? zU){6qLnC#|&t1IevfT}N1PdvlKs4g5-@1F=vVHUB?OWEl`;_{i8jX`ayciyYLy+aT zU*Oo$@^sHch~$h^6L$E1_^x0dH+S@ol5v0+4*cZth0r8lNWeIo^&FY8?j{25o)eHcM(uRn5Q zBsUyY&;S3Z`wsZFseXR2I1K+xE~;p5%P$Z(lhdgWL`z0n62o&! zUq_;LCBFt?%YwJV3T7%NH5086U5x?28Qb7EkkOZANGrt?V4? zrPPZ~@4|+zrL~Q~M_A`{5va54dBe2j8xWeeQ zqD;=$ELWYw^T4|MWq0&RGQ@U|oX}h}u&%3YX~dw`NKRvLTBKt^xn7f;Ti3dzu6|Wt zNq13EcZvL|AHHV&!t<9_g$s4E&85K8zH8~ChLMu`l^vaHntG#sWo4uVE-UM!brCy9 z$@z2@pEi*BoWL=3ixy6qcbM#I9ovz*iY5npffb1`Q%`H1S`*S@Yz!;W*(Qg0@OG1l z=w53cX2K+TS`}*4^3F*?~x! zPIeG`7&UiwH8*#oPvGytxwCx&%6G_Is;xF5uNLX{vvbG9W%f{??32$+mmRS$8di2H zofRpiE-5YPiblKi;h>J9doX$0cQ08~Kc}RAReRU!rc6(1Qz>+)Z)X87eDFc8WJ> zb_AjyCgr-xma!%M8{5Ji3+w36xuC9UARZs6svJlp2J{_U`s){VhugOdBo}r^I?6|r z^>fP0=hP?XAk2bgcHm_etYTkHdv7FeeQ(hPMu!PGX!nUWz1e;$%^XT*!meGUCobFB(%KZC4Z;iWX=Cx~ zYK)4=j1yF7zc@w-5y`K1BU97u8Fc{}`H;%%% zNTa%kE0OUJUuzmUlk_&@jhk8drs(aBptpYk?=P^$TG1?+9i7w(osMRA>N7A9m)b=G zc5XdeXVAa^xZMn|q)Y9N&)K2Wtp;Fb0GP=G_wav9aVuMoPas9H*p$!T7wF*88!tKS~BmP3Y5s&p-ta9MWfp~Gvl8)9T zl*zgivzxezBT(F'Edxm_b$n~J8b?W$T97SvkorxutV>zpr>+}hT~b@eNIk3e#x z0lnR3)aCiQ_b!`A4wW`6YwK9u)CpRv*xf*PfwkWB0A~W$jzMw1i}*$zTa~&4?3IN* z-D=lsQZH(3KZMDJYx9w{7m3&0;=$*T7dfN3iTt-v+?ku2K#SUDG_39ITU#G$P4v!f z+IVb=JE!DOirdxM)z#6_B~#p{XiHaDOLLD*gSud&`lr$-$E3KhloDM!oZ@~_wmd4R zH83)U1|!+7Xj@#@u(CtxtD+o=`)~k*#V)csucveS+?jR5CH2eOI#)Kavo2XN=PV?r zsU(uy7gIioc5MgEJq2?I!5v?wx#Z%_4%;2^8$fd5+;ff5K_Nrrd2{9(EeCc)w*my$ znwo2IqOGCy7uak2F6;^bN=W=XrQ9W^lc;TmXvqfENBZVC;tk9a(2 z{PA_ewRy+kvo5dB9&3ruo@I|VCx(XsDFt{8vfpM3hz`oshZYD@04WTv%vTZl+kz}2 zUH%cX%cwC83s!?5>T3LE3H}&tMGX>{yY*FCtxghB_rlmjIDp=R9R=J_n17kORWwX! z2Cd#;ZmVSyJ1SWP-AM(WaL`$17oEsv?d=W5ngW5)3HRb%X3=QT@A6l9{Xt36scmk( z%~4Pj4z@>5)6+{?>_z?sJ00&#%9z4BTvrFi2uy57lbRu~Ssr^53IZZSTOW+}cto|q zWpY+}L*?bsDi8!S{F|a-N4Z^c0j9j3P|LK+U~x@Rhst5oyO3EK-czB%e5iq>Kw*Bs zgydN^7l3Q7Ow{Rhn!3`Wx_tCxVfrAu2DqN$U==PqgKEc=whtU^EmZof#%%qj*{aul zTaBEomau3xi(yNZ`6}Kb)mcTsX81%0ss0n_^-Oh=<&vjgwGiej z)2h{*%!z0`hM0eyQT%y<1Sh+*td2laaYBo?Juy9Dq)hrK-$X-LuIiVuL&eDaFhF2YLw-Cy`5>0L8| zf9_CQNEyg3D1a5!B(X!H5th7wkmMm`2>GjD-ZF6&NB&pZy8j6!` z803YKNMSJilOn%A9QOM$xj5vS_=26AgWKHko?$xy-jPJ$n|)2rDYWV|p~`~B{%~hv z=G>CuBH%R=DJxUi%sQt{M(YehYd_E$I&OLI%DU%EVzCn7m!dmEtP{J#KL&LR&37;E z%w)anAop|JAyXOMDZ-sm`56i&r8{B#YPx&}{Fi*Ekae+Z&3=kN8A_W928ps6%-|Zh1}}*(WmeUZWw5Qk{Sr6dKpSC$2Me71zKft}`?b z*QgQK87hNoU=r6EYJh9t5!aa+iECgH*O}RYYo!gDF^+3s5Z`A;8LojpT>pRA(+n0S=;EV%EjH}{3DUwlN5dYcmsDFe^B}WYe$ytE&c zw5U1#1#>5}jxl7Zp+YvcBI&BfQ&6DtyWM^&=yW`LvHUEQYhxO$$)p`}$vO|^N17di z6VAm5ee?PY++Lr~zF1TlouZ@I>YzG8g^toP&cTL|ZPiw{2enE@qlvY#ZW%l1y9W#0>~+vhno}#>1za-Q z7=o4urM?9`b&RANKucs<-forzWvptGj0mwqavoiL<}~BiqRA2oczj}WZP|>l%BS)Ff` z?w@Qj`M`Iv52D3InMe=<4Uj3!pA3wwy#@=Ftdot;paVI8z0@$bGFlsm5ClfiBt;5i z1%Pn~Fj`cAadn)Av$vq&;YfE$@nDs&vfOLLmJ|N^#$c?WAXe_l6C^;GALbe+p~A># zev5wSpjo0|OBt`(G5XudM=?u=nQ^q>LGZ`S%0u)l(86gdXIGWauBjNQs+>JuK2%jU zT#f&gLlyX40KC}E++*Y|Jwo*&NNFkjJ`OpTN2^v_t#ls% z2i|1JL$KE6oNF|wAejt7i8MJHy1I_0na?D~!^>^6SYze`Z8I#JO46T5oM|$0afcke}@3z@s z{iby?^E~FudQdDDIc@$48)YQt_Zh`8vS(V1>=X3)PqV=wNd^OC8G4?7|ESON4;}VA z-uF*<*&m_)#iGR`vezE={C}?gFSmyg)4ycVX>wmFxXZLBA-Cry`mCk4P@90iRq1Zl z4jSl2-zw@*j8b&1l2TSSG5@B%##Ir~dR&6m8@AfQ9-YDExpVc)o2FlSVUMWMdu*M1 z_jY&h-P2|B=xH~*M7o=KF;l0!7RmB36tJinGneSs@jAC#(B_4#wvbnAaC&sf8dv$9 zqDFAry7o*}Ca(JZrs?0fP_A>3T@1}X=mJ&%sJ&{6qH_BHuIzo8>2^?V*{?2COLGjo zeO8?M7`x#XCP-FG6xLMsNOp^<%Hed!^73MCr=!Ybu}k}1Wrc4him;Qh3GNw1@i(h# ztR~Usbp6>^nXk&P^u6VB+C-5ukzgbYV*kf1JhXO`JWDGGMUctxO{IuXAW@nQ+Zq8F z3d;~U9qzc-8+SXLG6cN=0ut25lqjsO+)poay57pX{m=Avla+vs7qKk9w6jGC07>wy z2Rw~{C&NpS!(kR9S!38GlEWdLBf-~r!2kJ7~yh7xT$x=-+6$I(0CT>-9bL>}PihNvQF%fqN{tpL-PU>13Az=x$# z>)`f_yg_E$>;)h_3fm^v^d4$@Os?sOoYt4PEB1>_O%}V~?eQr!p=}M!9QI81CxCU2 z4C@}|2XfnLaDSJ4f3JLhFWtwR@jUY!`xDx;@g!RAifTwlfnlZ9Vxm51aA{`ibi-OF z_FU6;bZE8n5b=4ADbI8^6tEhvw0oD7hgwiO^K_;bT4A&6DrK?IX!=cB{1zq$qfa0Q`ht^w7+aK;SJ%&4SIcH*F6s6|^R z$29medFiB?6iV_i=JZO?z1d5X#>JKmG|*3iEZkbI2GkM858zzJR&_O) zE|&}KlJQ>7*{iE+YtaRCs0jrf4&W4r?~0PD{%TQcez-|(SGPW5(TLYHs3p^NWhRrl z0ydG%Azv_<_iq!d`z2|=RoJ#)5{2~xk~B>9%{8 zR*W_@x2SBMh1D}g>zB3G^&+}Vja>8)tT~@A+E6%h*@}&KOw7A^L;uOx0LR3OW&8G) z_Qa}cN_yjUx3p~e=89!EpU}SOwvA&udwZJH&239Z`?q%1Rdxkz);C4BP#A1n)3f;e znM>~8deXNSB*F$BDRE*Ith;WaxxT(?ys^2Rbl;T0Zy#DtyPVCDb+@v*HJQ{-8t`aM zA*L(KBV+y2Mrri|M!*-!IxH|-E@fS_DKR@P%BNIQ#QJ+z)mkIUlzoY>JYuaJE{;4iLr4lXaQ6N5fSMZLR1UpiD9 zY^bjAI4m_Y;xN9>=nS{Dg&eJGZ8>tD?;FHgC_btOk2I}=vNS8>T3(OL167>bMySl%K0t7 zvpbO-Orcfc3%+<0WJ7E6-bA6+U`Z}%uAU!6oI1WNm{AmID#Vv{E#7z#U)C@EX<73`q{8H}+e%s|!j+=i zW`~2U#s;Oj#_sS`hl-N!YHxLOBtFCKHWddNW)Bef&tX)Dv}l?V37n-8M{ZLzC`TsHcmf?wqHUNm@{9qgAm4OY z02C$tSGKJfQNDY+`};eMzL*%&*{w!1pU_9V)5WEUM7((ES2u2Dh+S%PbTl-!2%hjl zhf6YS@K}VaLvIHoks!t{$GZ4I?s4>1D>A{;;8(P$N<4MWoX9xGV%l5mQz1!H?z?2@ zc@p}23DS`EO8XT$NK>`|9D>ePi#naCKF6B+mDReDV%XUj#iDMsu`a}mA7_-bf|&Xz zYZe8IC3Sfa_Xzty4>Awrqs$tcSz=j<_d4ue zSRb*%n$1{Y^PImin~$+#FNAjGZqx>$me$=&sEWnDSIJ%i6ER;&j%8mw8%LX_o`yRu zNoSMK^SKw9AIFtC*!75n)63pzAIA^AL>F=Z>Bn)jMr5vFNsfk3;z?9R#tM)PLzYcY zAaggHEOW8;%!R>g3|6PHD=ZQ_k#7@;^=h4YXEtjmxNmA-- zS`p=y0*1rfnae}(LnMrZ2ezZ3%~-Do4b{&qsEd>)UDYLd1^JeIo6!XqS5N(bTE|Bs zMV>r;SMxWF9eSf(SioxHZQ;7c=-_yL=(|NxgV~_6dJNd&W1q&Lshd~a6fewaX|d8$ zMC8j{&g3x@c&)S;W+$4Iu;XW2en|7PI9QZtGCh@phNtpH(;^uYRq4+&^QGZ%>J};l zlLFeEVFYMF!NSNE68}Ou14#RY2iQj!U$&~YZuO;$HebCUE*v~t&8uQNW)7cH0Y3(W zqsGTJr5<44QwzcI@lfL#wR&~^veSEe_pEMdKWa7oJK(CNVROLfo`C)}>q1{cU#vd|-PYx`ZBC+J(%wl{@2{w@bl=YA#J;h8V z6Dx(sIUR0gn2Z9u-;FFu@MVJ)Gc^P0UC%+bN9i4su})AXoU&niUd&M*&x<)LF*djz zb}-QgALQWv>#!Z%g`hZ*>pA#KWNbA`B7)gbt~g|4cXvgwy3SP|!q)EOO>!2Os`hFNTI^z&!-Y*+9A+&q_}4XyPQ5*#JesfbHdw_n-g2tT^0>eB?D2J1jcKKAg28E- zkXWOj+exQq+O#&4&WTi(lf9Ierx&eGp%4}*<0g7$wWKMq=)MIN8R%R*{T^4wroj{U z0ShDv%1D6ZQ6ozya^qdV0e11#YUK$62?Z|K!Dv)zG@1z;D9xB6ZAL7p((9XCd0uyu zUa$8EjlMxRg!z*~9x`_{xbyNnje?-_>KlC16A8H5={^4{8!RaqEGwH)S~_UZd-ctM znTg_={uaGk&>NaO`FZXJ11spgLStZNaq-MRli<6&RSZ{F4p*}BfpotW zm^U%>Yrn$p)}mj*QciA)NstnciCF{|b#gArQz^@&5>>-6m5IDOiRvVqwRc<0phtE? zQ{hA}T)DmV~P5LMdn$%hyK8{l_I14mV7nSKqdB*}}#ZoivwBD=ciJ0GT(j zpSCOLs|)8Re1gNiV4!h9EpJ*zy2WKCwkU**cgQZ8S1_%qEGar2qthBjE7g{jCOf#y zw)8gS!leCt+R0`JK0ZscTp}NGZ7; zP|;7x>#}qzlR4@}5-@W_c8y)xV@{UeeafDz8HtqLGi~EEqc|>Ft>PRbcyw`;P8V5? zxL-R#&RS-tF~6s%a%Q!``Yi(Sb}P?YZ>O{C4TkEOmC;VW5pz)`gqG;rPaVUrMT@zh z+bda(CW~$Sl=fg$aN3NVknbuUN18v;Xq7zO1^8ODnmgweI}7xj(dxvusMOv7H2uYp z!=MA86-tRKk=sjaRMyehF?o{hL>hqCSzVScLVbsXSc=W0gGfEXmdVH8JV;;s%Iea( zt!Fq1G$Z?(*^W`^c#nqW9%PHKdUjiBXOn8ojbhA=-t63vCABZjgD)>B+R0HSON|;# zdu4f<0|Gr~dso+X_&wugW>|#;6%s`mLD6~^S5z$S2@Z!GTPTq2O2mulL*r!zqS)&_ zw7?v9-MA{dzOaRHz0)oV1+>1*JEO~DE&ISGiO>e7KGmBMXQcM7S5_I?^}&OYvv6`I zY?OEZJDd z9}=4z%4S56pkJdE$~U%+E-s96P1Fge=I`U)rIXZi!C;`bvwSp4PpJiW-=0zEmoIzqBeRF82K z2Q5(iplWFw_RRdx@;cRW1P=6NEF>>kC=1mh97o}RXv@QEtS)JkCikdB6P;r{I{PnXX;`g->ZR#0T)l{4X*=g}=*I13MWbQ7;uHuynwZNYJQ=RFHTj;dwy9fJpF46JgvF8u)yk_X$~#3VGCjVEBTfo#5NcbRPmU*>|uufJx5%eO^@DHH*qrq}2zE_(2f zHjD}`(~kd8Rwh4cTV`iP=tQoxJGw|Q(B-smpSH4|v-Q$d zuZ^!?)jMLhk3|}aY{9OoF$(CrmU7!&>u^*|^qJ|@+OwqUcMccZZ!2n!*7X$TK+`01 zap=-XTgxQX&VZEz6}Y%55J4M`2I3^3b2d7iLf0+Co~W+iDZThfKE~c8L5hD z=_5MtQcW1C1Aq!6mAEY>30{WKLRmMpvpVUxl>3>Lo6>yd;u*LlGE7P_4f~2{Gpf(D zgi8ZkXm;E)K9?0!m(jRnkC${K1NY0PpU~$IEYVW6Wg(r;GxN#gW|)gw3Qp8>Hm%O2 ze=@JoWQA>_uh$|Eiev*F+P0Nzsacov8%4D~CRnVx>S)9f|zf5+CE?<*FaM=QE{$#S4F9fL# z`ruD1>hfKk?H6N88LbCpBFixXa6J>ab|R;%qN6?xqf0n)WE0c&aG?^kurG6XkDkAWHeDc~Gl!xV6128g+VyThsR&`211;sO^r- z4fzX~w(kiLN`+2N2c3jQc?_afb{#{?=n&<&BDN|_1 z7&n_Ar1VD*l9PPq3|62=NHu*w5!L(Y>=B8mOC`%7J7sG|mrS)~X3sFy!2Xb`V4199 zoABJrG-CfBo?;VDBD6u}P*hh3DoN>)$s!7B397rx=&`VdyYA8Rg2k@C=We41JLTSe z7cR|q;jUgIhXf9H-6Pm70x#TsH(eU9^I>S?LtYwwZs7KkG@jmFG4}F{Zkay?2BQ>Dl zNd8=r#nCTtf&8${OPNUkdXnc+i z@06<{$!OG(^XTeZ4X@JSqY?u-jT`6Fd(R^%HW>xFF^|sA%Ro}hlpw0vMqUflYjw$p zBO>co)U-Bh$BlLaCm7gAQ|$(UGuVynw-Jq2saC^FMe{`L32a* zrAlopBh)j=2s&S*RoALX9N?JLSfRzt-ibAn)rqMN_9vo_HQFjsf!V3W-cdQ#s%7kB z6mk}29XT968NiI{H#0aF!br~=jqDFo1Nao6ez^xR4pOR*5W@bDK6gQuwOdu!$F5gF z4AiP`P?MCaNxg0XGeejmZV>=mOxmSmcOq>!1mK&^ae_p@K5X49+Kdqiw4VoVLN zKQv;yk<>JKqWnO9^9>r(e&UTIRe zH)dw{yHo8x*=oMX0zU3ydgfx}lQCapww^rMXn4~yCm^@TQ}7h-lI>^;&j7UmoI$dz zglyG>I);=5VAW;q%~79VZ}c|BW5s4?#H^*=b?mJXPeUwHX2T7{DrmKimdIB=!L~qi zC)vE@Ds7Aw*_`0yvHKb*YEcm~N+0bjjKyZ=Wwd7%+C!N9ufzKCG2d3nT*w93Z_$oh zG94xZV}>xnZort$sm*d<++(&}XqA3MeQq&7Pu8CX=1eZYZI@?Y)`yu~m_Z1X4ZasR zMBUFYbn=Zq(~C}QtN!!Y&$XsAy*3PPV_s^u4L-W;{?wq!2>Pf>zYAXI8;H6uBhC;j z7`ji^0V`@ZbS1h^R{TPW!7HLj#z8tb(vT`@Uj%MA=j&Zowa{ADP&#ycdtx})Cb+CB zp)~=Y+~ZoJ(+iEP$J-k0T-Or)Y1_K?kT3PNyFqKD4ULA2Hgwdl8Y*)-W*a%AA|H;d zYinFJv&3N;WRH_9O{+Vq#uhZK?ku0}PhBO#4VXu)_{Cf)dk5CsD9N@b$*7Z=*Q|y| zMuzOHQJ0kMP=FTujX=@|KvziVBOfq_@&yql@xNv$M4KVbWQ!th+48RTZ}- z9Fvy^pP@^72Y3zH$Ej_KmzVREC@%pa*5u|Z!NAJ+qoet<$%WQ4JQNxrZgua>8UFS~ zEweY)2fJ(cQsDl@4wu@XEh@8z2a@sDxTCz$U_km2@?mi{eRs>W6GuvCUAS~`=bD(4 z?%6DY#jG!0x~^elQ$wJAqIK?79oPg5f#yUTA@<8zB~7$H4I~e8`o-cT57`K1hY1b% z9OA1Qy9G@CAB_%QYBqcI(_A>jEu{$WgExl4LF9&kXvi}4h*}PSb4Q)B%$=DrS=9xl z@Lgi1tBJJf%bm!A_?`p^u@m*!NZQ7$uk2FUKm19wPOl zFPSJmsf{2|LpB1LV#!!fNW7$YK4~)ttPahY?)L=0&7%24?f!9uy~AroysgEYI-Va1 zx$IwDW0SMXEQbFL43s0lR8w!MT>$Ms!|M){J+Ao12&K?BuX@EEE77$JVaCeCdpnMiL$Q z)qSPqJ+YFRwKcQgm!t-K@9^um-^sjE956!c?#bbxm8F^xPh<5kgT>^WKf-qa|-rrfP=f#|LX?Ex?Dr)LmDGk6KQ|^$dIy8>|bIxNFP(rLJ05B=e5Q-Gn0)iK*>d zR&_6_-i(i$rf_fd%$cE{nwhgwH)n4zt!@hS*2uSK!6>7p7O6fyq(vjlQbo#C#Op6Z ztNw3jv1-N=BH+wU=WyPGL5pAu$QDZ zVx*^6auMb_p8P988HZ{0#<(V3hQfg01Y|d=tZg!%+%jz741z)Ab;**Fq>eY?g4f2| z?OHI)+HRP+k%FF!bT=Z!1S^=LrKM4mz_M1UsKK`xqJ_n<0UP(ig8ud29)$%`(E%0F z+XcaZ40D;c!y%I1-a3c&By{5aYKXCsu0{#|<5O?9NJWjl&1+yChF|RlgGJz`-d>8f z*Bz_vq_UQ+w6Zxw!BBQ?9St70-YT%rj$@ldL{vyTuQQs1mf~_}=qSK#P;-K)LHcP) zsWd%^{f8R@R}2Z&YS=1)8x>&w!PPp0j?-HVCn3QS zJOF?pdguOQzcXhT9r2y#&DF9{&gpvKIcYuOJGU9^5)u=fgq;uJ4JW_z6-1ZXNs2j2 zJLNu6xF_hy4nchg$Cv?h~a>omdo$6^Xjc#*^shQ@IJ|Ebc)i zPBf#Lke60)^(1=8=i@Gq$K`apA9H#&^RzZet?5E)BY37{E59o9GVXFr1FK=Z31rVqVjGar97iCw@R1d7wsc37o zIU0nqb0yaqDYuB}7Nb?q)34scuP#u2mD?MIh;`R#=4hQRGq2-H1YU17-eN*FHz)c2 zq;JEoF6KMreq_27ItB_0TSrc-O>>dF%&gL{0u@6=%JATNGu2#2b^efYYtk-FsPisR zu$#FQ>I8Z+uwdPT2&s$``Fx(r40T5Tv&S$BGH%hW zSgEsMDIGO)C+hEk?iVRhDdhQ zEN+i#IFr$U#8I`eSW*K=GgtuBv34#Jn_h+3HIvwgKheZmO;yulfc{)A#GJ$niYGGF zOQI!F;|yP`EDTOA=Ye)guOC9qwqF#E*LKYsUyh} zGgdjG2NW2q0V7NxUkPCjy+1Zoym$rp_YB?V1ny`cZPgJ+t8kSgLx3?-?jG@{Aowz*t_%V3gJJhIJ2?Pb-@0{G1bj0R63m#dW(4vT{vy3QrMKt zT-hyhWTAAcfSoS&xfe7VR$(?@!@W&(Ri+-4tP6ssCPZv;Mnu^ODyoUL7ZpA5hA6R~uSa>I!rT7)U(Hfu1oxVhf6J?HMHWmbn_tC*?D$5#WiTeT}W?EtbF=k_|;{~uX3f9kPhpS zcAnnpgf~3T>RCL$OVq%n7)>Loiiye030a6Pjp=#n~FFzStnc)!di=@R(B(!2?V{fK*VMLF$f<^^bWI1J1%%7$OmKC;nAU6$}?DPt-^MS zDB6w_PQQ(CbqdGIVmhg`V+Id*Ks4iJ2k2L#*6UPSP?lra5pt%?q~=^- zS5i`^=S@e{F1{J5DvU;HXA~?r)4lX1qjCQr2~oyq+MkrUcV@+wN>_PiiwH`%#_meRb+l7!tG!VT=~ zA=WmMh9n=!#O3n>cM#c2NL#W37Q*ZKSN`kTl4F^Jj-V|`DGL6Kwj`@Lk+mgf^(DNI zypX9tUvgNd0ZVImCv%lb0vAU5k{lYI;dm7>Ig~f5=U{`?bzuuG+sa830>5b;CXPlg zu7?GQ9nNy%IrSb%50gWyr+Dd!DO(6wM`yOG`5AFSuaQ8IS@5|ZF)R7+el2~8Wb;5@ zqIU|CMK;n#?WNF{K#uyzV6=OzW~0H#sZoTTXeEiJBBvg z$=@z>)!DfLWr-HTUsTbSn7E5UAIuAynifi##oE{&E$T30vF1KzEmD7PZ$BB~H3n^6 zX=$C-fXr~vmwd|9^81gjFX24-;3%f_CHdT^1^Kq(m;`%;O;#en%mrQ>D7c9EAwNL* zB}byQq?5|XO`3Q-Q33BLi>aC0WY5plV>#9c(Z22zwUBZdL}#xRl;N z{*o*Na(woZ0~7s-e$m2m%+Fx4r(Yb)Fv*CNajlJZfQ-9SFT=$T!`ET#jj^AF z`fzS?;yk4ZqP`L~$-KaBlVvqU2317;{bcN5*9L&>Bn3nHMeJyio&jz7UC@?8YX@2D zn3VrILFDwcQCB43vpRh;X(_Uw6)nZycsOkH1T|Q{=tgsiClLwJ4bH?vXWS|-&xN2S)NPd&TGv3@|~r)!{LsGfBgiiWf|u~ z-tH8hc$4{&{KPUmaiVdGd%H$sU- z2pcVk6dr?5u0&TC3c~#fuIGYUU0|^kXjB3$OVok`T%28^)YqXQy&EP!H1?p|I9KX} z*hITF;Lj+UO`+mqu7o!VMnQ!H6P5z#=gC^8O9n%f&E%ETyR19?GvW*sEeI{R4*O>& zVhd95T1;0%*LXGMVts`hWZlsF9q~zS&>~%l#64FA@Z{xKB3S+>$7=JN;mJ0`9l&Vj zK9k$5RiVuW720er&}a;hhpEjUpuQzaeH}8!uu>h?a@LA=0*Qzo!XGN+AJo=`LUl3{ zl?r`os00kC5H&KY0cIII12@9o5mz~Xv@a`zkv4=V_BG5lW-oIwa~*RBv!8jCc^b6s zZRP;dgBn>k8)hrmW_B8OIatCz#6H13&%Vah!l!mS_c*WO&3rx|(!5IBu$3^qxL+}ej!a`wS<< zS6n7;5FZtvhCcew;y=YNOgiL}37ASu&8ACDKQ#T+^o;5EroWi}ZAwWcQoYnI4M_{7 zHPSX|r*yt_m2`)6zx0IklJvH8z|5G9X16(Pt}r*7rEekBG zEn6*TSoT@2wA^BO&GMe*6RXNvV{Nw%TF0#`tS4LdTA#DNVtw0sz=k~+Z27jBt;W`F z8?-I7t+8#h?X;b5yUO-0+xKh_*`BaHZ+p!?!#>Zx(!SaLH~UA9q+^fcKODbuyzF?( z@gZ0c(K*w(-}$J^?Fzd#xpuhDcRlTT$@OQ~Ki!Pm=ytnf?izQyd(b`ZUg6&4-r+vS zeVO|v_jla)yMOL}&i#rf&lB>Ld)9d#_B`o%!SlN3@19S+YVRrD?|47(rt=JWuDnp* zVBX5SO?lh%&dR$a@4CF(^X|=iIPZzP-{$=>@16YW{MP)<`IqJ2nE%`SKjpt$;4kPa zm|ZYYu&&_5g53od7F<(sYr($@Qoc%Gi*K55j&F(Yc;Cssy}pZm*ZF?$H~3xtkiXpD z}tBV&GuP(l# z_=e(#i=Qlhuf$z4SaNmA3nj0Xyi@XF>7vs8rGG2^sEjLHUv_udkIVjE_F>tue zd3AYHc~|+i@}1>>D*tOmUd8l^?G^V|yj^KSuAJSKPgWVL>{UyuzEico>d~qvsx{Tq zt1qg4t)`&n)SBHj57d^|URwL7y2`q9>Yhm&k{!uy$ye*6^>gbd>etoZU;jZvO~dI8 z_cnacIHz$*AWp>L%%es~ywQ5^!t!rEFX#HO6{jDFib+&D9d$8?iZO^v7*!HKkciTR0 zOSkv6?`prH{oCzNw}09Z@7U1s?T&jp9_e_hv!e5i&i$Q_c0S!z*R`!{XV-mQ2fBmZ ziSD89@$MzvJG;;6zN|alqwPudtnRs@=hr>y-gxiI-phMm>T~t^`_}f|*Y{xG<9*Nc z{cf6f+Jb3!PkXn2TK`c0S^b|5j11g3@bBq8)6bp$*z`{ZO9n3;{KE`kM%|1PXFNLN zlbLlhcg);7^YK}cS(URIX7$WEf7Y`@x}m7e8TXq z;R}YZ9)524mEpIC56os}8)v&`hi7k|{qXE3N4z7WBa22>j;tSfZjNqF|C~*8PM))K z&N*`~n{(5gUyQP&W24^~{q5)%bBpJ$oBPwbpN{p6T{iacxHLX7e%AN{>g{^-Jzw^30OIEp1!6f9Z2e-&@8l z^DYZ6Yg{&a*}7%Bmz}rl=4DSW`)GOV^0StId-*fV|Ghl5LRjHk(X?X8isM(DyyDsw zkF0oV#a~xet~_bwfmNGUUA@}B`kd7tuNhjiW6hOoZdvodnm5-9Ysc4KwDz@igX?Zv z_r-CiANTh0vyXphea-q4*T1}Be8aalN*j;g_`^-!O-naDy4kRK>*oL1{K=MqE%$BJ zZY|h4f9r``Z{GUg)_-g(+BUrHifs>Xd+UV46BeCt?TP$}jVF$sc>0MiofJK3-bvp* z>4lR%Kbb$d;^gB`e(03QDfgZ7`l*3a7oWO+yJ36J_A|CWv%|lmf5+AxSMB)qX}Z&V zr}dt;^t2tP-FDgwr@eQ&<@CDK*PVX(>5rcN@fqc3>^kGgozl+m&ILQq-g)27zwC1E z>e#hv*Unv+?|NX@A9s6pckW)ld-v|EcJJT)%dakd-gf5i&r+Y&eb%0{et&lP+4Il79sgK$Yi(+G>OIu~=u@z32Vza+KlT9pCSPWP|62vNRTUNP zTg(_AfGqz_rsb&RFU*)a%#3k=K~xORvqye8eurz-4{@*Wf4HOpAHncD9FJB$MO%D~ z4jPWJY++fPcQa#jWZCpfDE~lt9OZMRV4nl*YK!yta70pf`I$f9yb$N#W4qG_sKAqH zOfG)BV;|0OJiI_s&fH7?jUQv?QQ`g!{6ujd$HNQ%>|yt)jsFi6l@oBB0@zMPA$YFG z@mOUwQ^|eZ@+9h-pFVih@)9$f`=2V`XGGNurs(j(oySDDIgE7FvhuL+W-xK?@PaW$ z;|%fgb^luhJO0#B!Q309!amEC9j)N|GOhxJj)xWWcNu5@A1w*&>}rzB42FkZtn8Sj z9_^`5{{w-GI8GJFb!{kvN=g5oc{}|#l;5KKLn(--mY+%g6-N*5(KCO)b;4#5E%9=@@2X*q>~inMq{|ru09j&J{TM@D#lAcO_`+{{w};5O8G1 z3H3jswFh%b2hM9zx=@x&Tl|Aep8W2=G9v$62Htb=%#A3w zVSe)XO(E*P9VHJX0a&Q+-t=dawEa>h!e4{yr;tMhFrtj%e2l-Au~Q)!WL(gC_Yq?y zK0;pC??QXlVm;6BXfp2v{J}fDMJ`$V?Zn!UUF&n#@^3PUERN(O;Rm?js6Pl_RCY40 z9PmtSq&13r3VDAB$Eozwh_tp6{{#4jLx(=)@U`(>t@eF*(wWPDVB=W67{ zsYHgACT=b>#QRa|@hm;>LHRw(D)h@r#>H>J@84x=P^#I#!T;djpx6ISf53d0{w3F$ z{s4F!LR(sK{yw)lodS$*`Q1f$Pg4foT0B#VB4K@4063Q8{I4iWPZA3`c4&)k*F74vvId6n-_13hv5rEYISP z*0f3d5uP%I+Ly(Ve5Cq-3zquB1&?Lm4EQhO2+zYzH9vy!fi|O`fb;Y(2o~x~;An{Y zNp2S%fq&E!=f;^5%;6wc$qaCV_}w^Di*f==XXd;d$5|-tD9tF9C^aaTqR_KDP=--j zQRw~v3jMYhr5c5v+0O33J9l93(jDN9cVHdd0ls(#XygtiijqJHpafCA)^p6==`HX* zn#rFg7pm`T{qAc&myxFcJHxC%`7=Z^+@r!gfr3AL_bL^9*PL6pd#0|jZyt~0rti^z z!|YEPNwLuN97(PvMtOilmxp(E-c%`tVdy~ zPWHU1l7)f&G1Guj!>Vvp;dl=AE_)SGTjS{GOPM&l%v!h~puYy0Qm&9mVBgU)xm=H( z8Meaj>Q$^0_zkOP7RsfY5%JqCEROu?OqD7LTB7v#g3OV|Q3XmHiV202rPuIXO3(DU@YfTGIWci{LD%5f-{pwO73LSrg>PRC-Dy2I|#7|o7TdLPwE&uv19 zptw-#QA$uWD2wTuznQ65Bl{uF;mwp@nN!gF=~HqFU5}w4S3>&KOj(2DvnX`jiURvy z`Zkoil#!A?5$9AkqpU(X7v+4EK@>>8lVu&wsg7*973Ygl=r_MYNu$tv=)F&)+>Wvr zg}$fXcA;!UnT~QK*pA2jf1wa;-^;+Z0q5EFW!p;kwxCcuv$&w|=sXKMawx;MeX1uvgNz?4OY}g<%57o`Z@}=tz0R0TGTW;R-yX!i5(5DUgps zIkEwr&Q`IfV+XPG*o)Xp*>AGnWB0Sq!20x8?3wmHmxtW4*clmFev{k?H^$B5F6AEL ze!@M?y$Y+8k(YQYpT~z`n=0cg`C3@0F5_?E@8loiA60o(AyuQQOSKr5spC{9sBTrI zVTUSE$JOONy-z~;T!F997x5MQ%6&;+lds=5;#=Tb>)Ytt?mN?Wk?$M6D}6WkJ`ETG z=71xBoz?=uKvAF~P#tItbO&Y!HU&-zoE!LN;9G&)19t}Q3EUg_LEwSF!-cj&XJN3g zs1T`jf|?*=(u0nmH|Pr%2dBZ7url&g^qo)ApK~%l8F*VPC>m=Bx8H`Z|4szWKfh*`~77ccJf684EWB zw7`Nj;11*m0x}k=0u31~YzyoJ7H$dL1}xka_;T7fu z=6U8>=2y&9%#-Pp(reQz(zDaE7$zm6tj&4)KY9A5?+v(FGR&KxWXj*0O>f@#=HfR8 z-uURvrEk21e~-NJIlkxK)MlSxm^b#|-}*Pc`Nq1}f5|YfKY)T+`TFgzU;FyWug`~u zQ}c(d!ns<+tF$SMp>ch3x) zip&Zqf+FA+mjQ-FVL&#)sKGTxjT&Q&F~(<%n#34mj4{Tz5~9W!w-_~vEAGZ!+?W1; z>r~zD+rx}v^4|O9{cnG&?z!ilT23wJoT{!{HOC%kp|nfva(v{Kz0TfXZ;mN=zR})l zZ@2f_M_9S>IhVbUe~Eb?jfjq*CCsNSTv{}}Xjaj|Me~am6fG)hD_T{wrf6-^u|>xf zolvyC=%k`^*%a>5q8o~CF4|CZZxP{54{cldk@qT^lrLAPt^zMukhdZVttfeqra!WuP@e@BaLp<59kN= zBl=Oj$sS|BZP(g6sFQj2`~3g?1N%#Q+F4P`e$#AYPqZ6sn>{<)!=7tzvwPXSqiX8q zOuHbOXs4Q9_9VNz-OcWSeecd&Dr4`)ZJ2r4NexnyR2rSUhdM$Xs18P-6^^#k=s^?UUPb(eZZU4d*ULe788zxGC#>FyjOU8O7Z5M8PF*L&-I^bEbd zUZqdb$LMwXe7)Y@h+Ms0|CWFCZ`F_Ki}c^scDf5vd9&(=?Ngz9arRSRY}W0tO}EAV z+ChzE4BenJDuXVVs7I-0UCUTuklII2RD0{)nFHp02)!pKKTcLNv6))+f#{|=>L5K0 z{d9mjOz))*Pz&`TYOy{{AFh_@7IfA;Y`VE>89HyJUZmFQCF)qcOs&&xdZ}8kSF7*o zv(?FZt@^G$OZ`Y+sD7eeu=zb-n(nx=#O?RdK&kx9IEC&H9(> zQGFk~sotYD>YLOf`p@b?eK%{*Slxi8-NY#1S@o)ZR=uvDSFh>kSj}~s`V%(li~32< z(yr1wtE1G>%;g-Tj@K(xsrpFQGe@(BK2%+-zomB2T~&Wwt}fBvRy`R}_SGd=qa#(l zPOC%obTsp9b%y?$x=?>p{Y+n~e$K9(cj{ZzL;8>E2K_U28(&KH(w6<*&(bHV%g~eG z)F*KY@YCp}`lv3N6g454Yol?|pi30qZ<3Pea1d-|7qW_FWD#U zKkPg9W&5ms!3;nnOg7uGPH!S>H0n)*+1>168rhd}ut^)X`Zm2yAJf-%`IT_D z+=s5e-^?}-nmOhnwEkbrf#zX!|6k3)<`HvEqFG{IGE2?Nrp>%!mYIK=<>pm$ zw0X^}Ft3}H<_)vTylGaOx6B&zwmHVUW7e9@W}SK09BbY)Up4QW0CRf{oS#RFkez zjk=nd#KDYO>(p#LMeVPf)S-G`wOqF{5?QEL>mwOeE?39tqp^}!Vj+A-{ZL<^zK`X0 zkv>OVt$(Pl(LYkZ(O0V*_0QEW^_A*ZjHrIAuTi(_8`K^8H|jBF=pNR8Qcp4}{)c`@ zJ;4mvb9^cGhJHb9%gCvZE>>ODC)i@2@ilK&^*{@CV+CBK-sK;+_p#JIP+ioASc>nd zJz3dSr&DUO9;3$Up^UtSs|k8nwVNKH#_3^Lva_&YXR5RH$?9BvsybC4tG>=?^mKi^ z`UaNkY5J>t(fM_CzW#>#4x_pY^qK10Sh06=zUw{u4$gV~y}D2TLEW$K{a$M?7@rdHTG(IrTww}ncZmbw)dbzud{zbbKasTy6mafM&ER5sF!-uS*uYg z@MSm;b4mqI9yXNHH37DqlXG)`Bjot&0WLynlm)mLdwOtyyC82T1-LW;cSX(~81UT^ zaCf~6rR38sXAF3CfVa=*$JLhE3}~TRLQD&Q+K6Q(__jo9yB4H96H0mjAzDbQnz+W0*9_l7 zPv;E#>8eSfd|pSX!Vrag6uz57+%Er%B_{(Du_r^dkI{!}3t{S*F=>IfmAMk|{2zlJ zIfmS>#s&bNY&(v5S|f^F48e6CjJN^K4# z$F8+3B6N$STZb*?;8nDUfw|I&+s8_{aV>B;?^jAWx!6X-{R&E{3J#j##I??3tJ=Cy z2f%yWwx<%lg_vFG%_R1vJTc;zQ7JcO2E?8REVv@Z8EUZlBbJqAq*|nlbqTi8U3?$R z$Gliv-E}!SzlZLLrr$>Q(%b6ZSU!D_3Fl%%4Z(&Qiu7cKHJ0V}SW?5Vq+Z6V@2>~w zov}45=rgVK>p`ry9D?KT!C!o`7|>8!I*Uz!s~-2D=xT@@HL#L%T+C+jI{l%9&V*$XRYZ#@mm za5}c(zIs1BQ*B~ia)0JkXX)8`jy^yii1m9g_Sypd6?)kNSU(Rs%ME+DMbE`@Td3#j zR;;AI=!JR_Hu8~J$xHN7Y`0~4xjtI2KtFwp_5Q!mtFfMsQPa|#*$7*Ir z_3`L{G5TwIJsRjl?AMd@$ylkU>eJ8(WA*9!8_WTmsn5ca8i&q08yoH%wFq7J2wO0o zr@xIY`yG9O{;s|d>--|I&wrpV!9E<17P^#~gUir`yD=~MPj)>19VdQYsei10qJOHd z!VcR59r=R(xxNPL`C8S8UHVIX9b@e4^{@2}=*gq7^M9*v(!aw>z6E>rR&>&lSj~6n z4QQn{G|^J@?;p_HchW*X(+WHGE>_9@k+V=<(f4Sr|D^BLf5sA>g8shWjTzA459z-! zhX1P@Jz(=bhAn!u{=5E%eq2AHpVUw3r}Z;>6Sk=v!F;HnW3>MQ^Bynhm$9;6VgBP) z{hEHA{_v<;#q9YS{iZrbzop;S?_e8j*6-@~^!xe)tnv?;E1J&kub=2ovCTizS+?BM zhAkybg!Q|xDPs1z*pwK)^>g@mQX_iM=|J9oG(2Ct!uvsr9B_ooE`=*RW!pO*$Dnaw<0D-q?xz zU?a}JKHSgD=I_n&NOG4Z<@1nw)3~KY`=qL`(3f3osAq@(wAcYUWRpixw*nz zX?|>eVt#6_GCwm{V=X%y`&z7QXJcQFg?$5-wzH;h!n(dWSl73U)%|;{>OWvn--Xru zM=a()VJ-g|OZk4R%m=ZO|AK}5SFGblv5fzQRs0XE;wP|rpTZt~23z=9?BM6IfM3M= zeHqL5pIE)GVe!6!wfh#9?mJky?_%M;k9GSYR_(`Fw4Y+lW|?8q?3u_$BDRRRrV`u5 zaxQ{pmk>VJD`)PhC$mqz?6$VI?PL4e?QB20z1@NNsGV$oJHYO22igj|3$s&$?GR?D zhA~&Ss~urS+Di6gV^-d#n7PZ?YFoqn-55KTIlS?90wd+!87oh;d)i61&eq!o)}A-n zW;@wVu~XgX+D^0k*y(l#E7JF~Gnqx2g&$#9YPK?dhzFKZDW!S@xUuY#R_O)Ur5D=o zVTXR-Ud*h)C1RicP;Ar7?G;#&o3Xdw6ASex%wArFoq9F%3)f)5UdtTAb@o^GdS*gy zu)krx=ePDI=0I+?x7b@*Gj|)aKX)+m@Ox$xdZ_-)iu?@g{YPpSY}VhauVdL4W7qC! zH>#fY59&JgD|@HC%igW(vHQEJ!QVcc{hR$euV@ zzHdLUAKH)X$MzHZsr}4m`9eWQCbE2*Sj0xLd_WknVP4cV>K1j6%A+29zpzczE7~^d z9rcO&M%zXGqV1VG-Z9!K>K_e=c8&%{711utB@d2kZbW|0k z7_Vod>Zpcs{20dY;~2$HUWgqd+{yBv}m7bdNd>2H`*_n8SP(OH+Mzrn%0ulZHv=QbxrqTwozQ1e5>G0ViQk8K>m=S(CY33vTiP;j#j>`N zx@8NOwY45qR<~kt+rpN4t5>y_)HV6LBt0(eqfU+M+AweNig~M-E?CmKwya_PvQ;hf z=C!u1k`&VoHN}ndT8NO_ie)W=O*f?^pQ-dX$rsPUFZ|RNH%T!RH%TC$>rCJx9k{Cx zrPC0&Xb4<1gwkp7rISh3lr+_Z)4XIa$ zRBL>@NH^3KPxnzwPef5u>qFN_d8eCd;somhew=M;TUb0J$6mUrF;rD!NT@MXS!0Nz z(MOR94J4BZ^;8{KacBY!O+_;nEnCs%6KV|EZHi+HRE?n!n^N6pELu%7Ua@-Vl9tuN zG)37|G9y{{wIOt^q?MvKb)B(tNz2MbxmFL0A?6z2U^AJ9;+ei+W+n=zHgJ&+xvmXd zq~jEtiuX@MIwmkbW=z-p+f`yF9SUkph-yrTVobn~Z;EEo#ENGnlJ_*JOga?Hn2_l) zO~tcwb;0Y9Y*Tz6Q#3nYrcEJ%=8$kxT*e`?rl#(*w=7fo&+KHGj;$-1?VD-QY$r&H zXG>%C)i!oq@c~i{T@T2!U3$R$#jPt^S1w*ze89pLEo)l49+ZFS!;K5o+FVn7kdQcZ zDqUagUpI%+uMS1kJg)d)Nv7=JcKvgFrsq_7bNF7Pmn@sNWcswmu2b`HaZ9eWXbjCh z_WH5m9^_w~YQ1y@dRxd`UFaNjv4{@g>c;!6MSsMCRs z`cMoFAyh-iZbL}B!52d&Ra@4YOE;8Q;JiNOd~8W;vaO^;l$cGUKIQ z>7UKT3nhnL7v{NjNu|=6>avCHQqTBuPB+y?i}Er#WF_6)bx~m)$mZJO#ku;Y9zyOj z&83T_vCNvex96)Nh`WZ6zf^t6;=tG9AfgxNT74>0J+|wSg=xWx51OtX+wG`@D_UFI zmbA3ZUp%jPiPUcKl3Ya~)f=KEu;!DlmLj9hLguPNR%)t?+aze$wwC3~R<2sHZ26+r z;ELQ@^?oic@A+g3#<&7bVMju5cZdjR6xYcnJ2~DV> zxoBBl&NPNBH^s39s>aaJn$q2uZ7FAHtjm&ZCvN(+aV^((UABen4l&pGhMvhZ7O(K- zyCP9AzB?ctL#}HB7wM3{+UDYwxjvU}8WWfwGq&r>cD0&Ghk_atq8byT7&AUvA3DRBkm)ha#jA65kxF}g33*7qDZY;_TAeRj->m2;Ap=cuS%*lQn!B&w zvTR*HOqT6fLIoMVT4ea@Tx(7@jU8WnjBjbjGhCMUy>@iKf}{-tlZ<3jZ|*A}l! z%J86znnPRStY@*yn#UI(E6J1{+pb@aukNw1b;VNp%iJX^N6%|nva07|p*;M^Sf&@Z zj9$4imG0Ui_y9{`3fxUnsB2C<)Q?R*q>~TT$%oq9gA@Gn(6c4aYVIxSBTvdhWAaTh zt-A5aH}$y(rzhm0yd^H$#JfyE6rQkaixg{)id6GicWTAI3A!ab_-dAiGSM;u_Q)$7 zdG6XG4M5=HCGM8#>LpcxrCkf`%GSv&c_?*)D~C=uRZF%ro~A)Kmj~Vm=fo;~*vGm! zU!f%ne5$T(q-wmC#ohP)8gFIsENv%Mg9a74@!qbh3HCuv&?7bDrOiPf-=!}RF3<-J zUE{|F(D}Am<4rT3z3{FHa<9e@YQTG|uO`^CHNInF3gzf6c<>>7QwZM_%E4RqshZ|c4$UEab147j5Ux3dYxd!4Lw~Cc{j4^$ z^V+ywj|=qPOs8Iae6^XT9=;!DL@?LyKgB<%#uPq}A6NKXS6BEP-ZxB{?Zb!nJo|R$ z$BL;MZ+CDH{CQoHs`0i$s%Ctsx1eik#>a9Z)L(TdkLvIo#)UP(#;6H{=9*xH)l`Ra zs}A*D8|ryn=ofxaP5PmHys<|9;^#nL9qOk#^q-ng&ov>xVNhOE6Y^Ud=>0G}RpU)M z?xBB%VR=nW$X`vIzc~Joeoe?{O{n+Um@a;f%OR9YO~`K;?bZa#siroh6D+5iFjlS! zc2|ubXQ$Z9D9DA7E?a9$`xqP2@g@-U6!I}X(2Wo2jt}{-3*{0D`Viiacn;;{r>S@j<nQ(HPSAmNNZ3g!h&-&mnwMXa`}CQRA&Z-iPo_ zA>ZCgL>`2CXb$0<1OLq--R2Ok*@vqQdbc*{+uES#YGeI2F3@|Ek9zU()n=N5Jg6@0 z-?i=K!T7@Wb@heM#7c|p}M}I3-g=Kv`Cj8+qz=e z=vB*BE)bLetB&!QvQ>*1kIBo@1X zOTz&n4F~!(Jmk_4I+upf`7{LdX$YaD;UHI}Oj(M6;w}x4y9iwF(vY}IN8m0Ein}N% z?$R*1OUK|Y4I`5p>jhpabi7nh)G6OVc^~5Qf`aD|-`Eh}*bv{?@up#BG=288X+EFc zU||wmIv{u7AyeL<;5nr44VlbXuRytv@4LKp#o}f2-Ly7yQ}d<$HPp?L7L}@NEL*U6 z;cD>A75bF?une1BIB6c&++4hLaT{~!#VcFqEo+-EROxheY3s^W%oVI^jWL0f`r7XE z*o2~ODXnHz%Zhc;{AFzmqo&m>mihR7iDXjVbYW7sF

Cg|u*xfjw`p@N!J?^468a z6T*gC^5P5fz_mAfAQyGQ-Q&Y3mI)nSs|-22v@Tt~Y8^3pHoSe5$ppJFRbSiH$?@vc z7+g95rxNh^1Y8|p1|>Oq2gmddj_Dm--Bku}^Oh~0J8xaj1kCVnWvj~+MB_rFa_p#yqScfZ>v673hRK|!73h&d7HpE#Ua1EmwW(J%$E~--v@w)`Q)F#h$;aweY zx>N>Fi4*MyiD)Z{pHa9mUlPIq6lY}rvQbC<25tu37!^67X`|d8IyeL`bDZeq98d(QQe-RAi28aTWME?fIq6l<2!$q;MRVdI?TP)Hw6B!#;OoynRM#fLFm2%a zd3fWSSeZ02N4BnOj>XZ-y8D*rYkyT~Oth+Jp2kHrdPcdtO4pB`A#qEy&%_hD!C=dT z0bC{w1T*nOcKl~z&{vsY5N5(aF%t~EOoQ(hyw5WLkvzB+YHZTS_d@J4$_ln}9yj1# z2c80EJKXmC@2~kMy%K*kEATX{a^~T;s^8-OPQ8Ht692YqzT$n0aBs7!jZ9c)6m1LKhc9?FtB3~U59KRd%_{U7{0U|P{zTUNXx91cg};y42Y(JL zd$e28gMS#Sc{D3|;Dxn2N8_(F$K$Uz>+xBegZ~Y44*q$3gRNP=ekuNC=I8jVtiiv* z+<z}-;y-Eh>3D$cEJU|j=miX;b0a?pj967Q*P zSm#it29b{;(h?NwR7Q|u5i8zmSQ$5+)mFB#dD<*BXWqIMOVpetEvwpC4{DEUUD2kR zm$s}pN=;jO)Y79^&lO3ln?hLlW(}HQ^@U*_+H}^FxEwcw_mFFYZr!A#bC==n@@?Q0 zzV_TSZGB*Y|qV;PExvl#iT~oW@ZWJ;(~ta z8p+3^N%z(Fob=eFtCGLEhx}6=pZ>bvq-*(Ys#AM4@7-^o3#K18WA46Fn&(a)T&Je| zWWUifd)KL%A33`HpPqCBzgNY-0nC)TiwXT+-NF2p%WuHs7wRfI`!!w}-h^~R>MkZV z>E?pphPnxLz1?rp-F0Q$Pm>?d${c-<<81Bvm19`VyRR#@|F>86J)ge&cJ}kH?B>Gv z>>QoDJe++q`?y1O6j%0xm^k}>_8Fo248K&`S^P?6U+`e|!x)wQ$U)in_?~>LuY72? z^ERRRLNCPgN=K2%`@hF;;u4`9mJ#lsF+RR$-vs+??&&oTWjDo`{5_ldnlX?2AAvZ_ z=l}WDbE|XUBxW^~CWm=gpaJnW`7z$z^IRmcoxv{N{FUA0b|U!qub9`4WL9Ufw`)(Gkrm)O zsvk#?eWQTPVK(D}90Uq7gnhjJ^Df^vwlZH^Q)*jRr`hK^OVUY(j;^?tw|tk-75SGz zo+4v>uR>x4{c(SuD29mJNegE;6#H#ij`dqEbRtCOVD>(85&CHyLrm>j zbR1juu^9Wmdr#&mdt)-~?1qA;&m1TJ&h^C{<~2lUYuFi115iqzdFhmW*OymZ<8gjm z$fW!#=miDs(uJ2e@>subL8m=A`%Bd`Sa-K&ulHpn68F%Uv4t2PhvruRU9z{k z=faCnPMYOfyc)=Ugev=w>`mE?;J3rM?=I!aeoF3K|LB?1w>!8O^!SVr6nGu!6rqk= zc%T-YCpJLmGAOTq3zEq7t~^#sJC}m55pvjpHtIaJIJRUcSIXWpc5mIAIBt1<4|(#U zKtaak+l#|O{btf4_qf=P?dR+>KE*`LuC(RKX{a9A*JyFCQn$YKxm|T0B8G>u4`v?; zw7<_@oV_pErn8S^-*R%<^(a^0VkJM%-PQHQE>!kWVsI4ntn9t993n?hfDuWNeZlug z(RN1S%9XUE@>kscvHSiO<2t|lS|}*3?v6V9WTF(>1#0Wr)M&E|8`b%9lw!Y^#GWh ztoN3$s?7c&rpe!h8v84>pmw73{K(_`M{yZJ4y(3bKg8B6sy#kNc0^F6*# zyJ&W7_biVx4szw!&g#k8j34{)OyYg6UXt-q&i_dCq@9V;wZzc6lWhd-C)t-6FUUBb zr+0Z|HEAC|plmpRvflFt><*(e6??b-d$?NhwQ34|GacP0w*S`tnHZVcw!F~l8;hPiE zWsF<$(dXYK>j>TpWJBCa<9nPF zq-D?uIZObYe8jGx2V%#?_8-y{tyaqOLyj!_wCXByw3}FT$cSVtP`S}W*BoxRn@h+( zmHmTIJNqNi3a}8|6X#|Jda+Ni4l=p$IY9E(QNE*?WDBlxZ7-%ECqB1vdU5+SL2l>s zoe$!6vMao7hkYkOmA6&1r;}zP*KRk#FzUVO7qp^`siQmbtgKP8g#CU(to>2JQ z*;Dp;+WH;Y<=NA-=XFNYG2Z1lZcW6osgMd;9_*7seEx~|Z|9!!r5#YdMDVwGlMC|& zKw&v%ZM#~sPb^Km6&zFLEf9~1#~+kZ+%{zXFQ(7mWqgjU z%S~F zFSEU)q!f2|_bo4H7b5?+!~bLUZa)io_M8SVbT&9VS*R^6C8b1xe)#eEiT_Tdi%1;-V@qZOc>L<*@nCw;KS|Ip?r3Edj;pMMQR8s@hUp< ze#W_F+1pj*Mg!T$83k?R{)b%Y<#L&Q0$KHm^iEGf$9f}I7C~ag_*`GkMZ9tFl3WR%yw*Sc4pTK?anZgVX?4i(??^Pe(*vnj@JdC&eM#$~U~&!fb+fA{V! zOczVx4DA=ko9946KV2B2{b;E0ZSqNG8(xSpaes*CiDG8hq={OFHjI3Gccj^aHqFJjb%2}o^Q}31Gmsy_e__xpG-*F!@ADsIK5=;b!T}rag%50LelYF_AZPCkolG4UQp5G&!o9Rl<=JXY^ zZXIby)l2yOnUBbYj4x8}Xv`kJ-r}CUA&L63tv4C=%fPOE##Xxz=h}y01}5Th*2Tb_ zPRiR-c@igiy!1(0BISuPbNlkf^2ybSmn_?hH8Gs^NMGWL=S;=AdBq2m|CDn%V+Pr^ zj7@R7aE<`-8XrELvR+&K$d`ORS)}*&6 zDLuKu{G$&Qq>#LzeJAaO!g)$;Kz{}9yA{Y6Sz(ck%h9%%V2ROSY_~GM9HQOgmYh>4 zh>1D8{FRfozU}2-Y>|5W%9S=!m@<*Nl+l;i&(FL12`iP}1b!Wgw}Qo}75LcxEa~i^#qlx5_wt?oMeG zw5nV$%K!5Q#XDY>7u0&F88sn{Pq(yYeIncD()w3{e9U9NAc}zn?KeTj#Bt+=vt z0U4W!h2;IhsPer$*TxD7a!&;%9qZrR+bw{c#K@&u=4(L4L~f+%TG2+@;zo31jye%f z+=D-a(iYZUf=clZ9kCGC<^t?yktrR;>+9aN9ckNfTjPJ&mb)mw)#}`|&Ls9ZhNaE7#uSG5k*lEVI6$jkx*e+)Ns!EweSu z#CS=V{fVDh2=QIx!V-F*duC?A&p-Q@^f2nRG(2=N|I9yMce@rvtT$$_VP!;z*A`AcljJS!glrh zun#Qtdy9u<4Dg2lZ+RkFONMJCRQ4{tS7be)A!Gj@-DA z|NhZ$**j^|{{JJ|G1~THWL~hX_)5c#Z;UU?xcB(Df}Y7s*lxZTk(!&gbLHd94IsD5 zpldFF5{~>8$|#9i?2cCm^?`fL{+9g3`Ek#m@P8lDma7}ks}2Y$3+$fV6>ROCR3nxR zU_W49&Pm&TxP1OLfpaC-N&n?d;!4VHV$6-19SIubZ#h!y*NdWm1=s$+1)#R>kiYp@V<@Z{2yM$rY_2V3 z6iC6>`yukmam~Oo}=Bnkw#yfm(OufN14-1%+)#zs?-1Vv!YZU!Q_@O!bq6AxcqlC{$4jy5J7|)@%$P0)FHj!V`BUpPl9M zdF!7EO@DmHMbhCvb$F2`!wPOK6`cqX1TNybky8hS345GTXIQ zljjbaSl>vC@#9~{+;`_A&gUqP>i`-r!uL}R4$y3`&2Tz(msg1Aht$IuLBq*A+ApU_Z3VRQ@ zod>qui6AQ6iGV!_wvoLM#=0-!CJpV-eewPUM$VJKE==xlKt4WJgWSmuYMAVHu&eBL zkWmBn-0-=-yZ8K@A3O~pl_%xA#b@2A6LQLgJ9qINf35^+70KBVWu&(ar$zMRjEDj8 zxe$b(i3OzXd{$0qyM$h-&1?M6sO<#Cy4rq+w}vw=hGUTr=Ww2bR5yJv){)Wf#PRQN ziip84wcn-IjGdqT)Gk6k7`>k=(X*%~7h*mkW(ZUY#0j2ujT&j!;*M1#Ii%%URmN$U zJ98>#74Jr5AGUjD-?H^sW zv>(KImj`nK{X#XBbC#xnnZOx#*K*d~FLBr5eucXp_iNk@xZkK9IA^FI=M42@kBfd% zDm|o}e#e<3H{))>-HN*ncRTJ5+}~6!=e5>yCPpnMWz=#qMlGlE)pB0O&U`cTJIeHC z+%33Uakt@a$K8Q@I(vnB2Db_KEbckn^SBpqFXCRpy^MPW$7pGfOaFu1mE`3=!%f2o zKJ7oo>D}3DrUR#TKZ`v6XSnU@38`f7(+|*39>hI_`wQ-2++T5zsA5h68^j6kgE$Lp z5GU~t;w;WVoNqaZ9drh9BJCi~xg4aQ#yz73(R)(#o)o<&rDiKNfqB^f5T_@6q|AiJ z3!F_nN4qhe-mMsiCY!MNKgMbDQnXtyTtD0Z>J7cAnGa)^BZVwhx(U~en~a-+n~K{T zN59bf;HKkd;P%Bi={%GB{y3zxrjFPrNg*#4J0&U3(^H(Mr#MYd>BDeG;978Var1EV zajm!oxP`byxQlSVK;TC>Mgyi8$JoGh!J*L&c93Dtm|d0>XSXTgpac#|;GhH!O5mUb z4ocvl1P)5zpac#|;GhH!O5mUb4ocvlBydmy2TsqFz(ENdl)ym=9F)L82^^HbK?xj` zz(ENdl)ym=9F)L82^^HbK?xj`z(ENdl)ym=9F)L82^^Hb0jJO5N^xbluDEWv9*lro z9hAaBDIAo-K`9)R!a*qXO z3J0ZdPznd7a8L>drEpLR2c>XO3J0ZdPznd7a8L>drEpLR2c>XO3J0ZdPznd7a8L>d zrEpLR2b`gY>xyG`2o6d)8@mUmL-)ir;2LpFxMtjB+!WkY+}^lpxP5TbaWioH;`YPM z#O;rpg`16=gF66sAnp*{S8#{o4#ORRYr)OM&BM*dwc-}w7UCA+F2emn^@M|-aL^MD zdcr|ZIOqunJ>j4y9Q1^Po^a3;+n_u8zB~H9J9f%0XldHDTFOszlKPe4o>s45WAtOM zuyVa4yM*;%m#_h98$DDH<%H|udN}6^Pe2m(<|Os0oGZLH`R=QaAUDG}9dZS=d>ZHd zru7dv)q5;wFJ8x)!4Du6$8)m!Gipy$L_YW8jKXeeZ?Ql3;~c^r)GW^W+g}~Td3-0R zgE<>+tU83V;U*|K+f5y6TWpIu+@0*Ej&SFa@V+9{`Y%Bh`lYNwpqDW`VIshx6ar<~d;r*_JzopNfY zoZ2a;cFN(hoZ2a;cFL)pa%!iX+9{`Y%Bh`lYNwpqDW`VIshx7lqnz3)r*_JzopQJ? zr*_JzopNfYoZ2a;cFL)pa>}Bd+9}7X>`o0eQbUc@P$Q>m{vYo#aMar_QhniS0$fdi zs|mERW?I{Jv^%$(-FD31RWjS^cC#BHyV*@wt!fP?&#h%oyQ5`KyI;wkc2CJ}b}z|p zc3HQZ9p|>Pn;mDhvYVYQce~kfVk^7Z(Ms9Pj&oJn&5pBG+071!-Rw9mmEG((>6G2< zI9Zh4>^KvY-RwBwlilp}{caySz1i(!r{8t^*y#`0$8H!48+YZzOT&qmX<9FP+Htlf zd)jfjCVSekvm1Nb5t2RaIE$S6#P;?4s^p}}l-tdY zbK2R>j&m~E&5n~Y-Pw^1oE!OL&c$>mM>fmJkyGU4$i3YDcASvO{&u9p{&r@%+ux3p zGTGmblhoPYjvmDRcAS{W{&t+2$^Lfah5hX~FO&W4I3bh$?KlyW{q0Pf+u6=6cRSdb z)ouqnbBx=;&a8Di*qL>12RrjsdhGvoX*XZ(K z$L0TNy-FV|h0CsRSqzuOa9IqO-QcntTy}%YZo*}RY>beN5wbBtHb%(C2-z4R8zW?6 zglvqEjS;djLN-Ro#t7LMAsZuPV}xvskc|beN5wbBtHb%%shTFIzTrsW$*9BLKE5migb;I>wWa}l#ws1KL zE=R%TD7YK}mm}bE1YC{~E;DeMfy)eBA^~vCxXHLFxT(0kano@7;HKkd;P%DshntDp zA2$m(8#f1c0PaBCAvjJ=hRY0GX5cadml?Rsz-0z5GjN%K%M4s*;4%Z38Mw^AWd<%Y zaG8P23|wa5G6RG0+&PJatK^z;4%Z38Mw>{mwn)}4_x+v%RX?~ z2QK@-WgocgL;$$Nawgb zT*cV8D*U&aYGVkzD$tzNF}yW2BNJh(Mv&g=lIrXa{v^ILcx&?z$GJ81Nt({mP2!XEBQK>)?(`*=+E=MG z|9HD=ymHk3pi)`EyP7O^}a+IOeUFBffM9>$N13H1Bsif}RRY0>9_|)8d zKdO2t4{r_r^JwD!*gnoAJ_k=H-@CiqSIw$Qz?EY<#tRMdE=S)1Tsf=q;L0N^MM6|g z|2JS4&y+8Sr?a%SChV8ZTQaRA+*v$H8f0l@kfo_cB*R{=48g7aa&T$~!kpm4IvrQ_ ziHED+`*N@gTY1XA7Pj(E!it>de#Tb7j$Y)vPY;eo4_00V{uFU!iC60j@hdp&;C1{U$&7vP&afwzVx5w`NN z%I7MPQf? zfafIeNjO2{axnUl(O0|sD0*%Vp7?LTox~$)y%f^=cj8ChjzZqKYZP)f2Y&^)E#T)Q zV27U@@Qd>J(T|VbH0oH1W&P*}5^xgl;8lU<-@uPLi*!#5d2sM~9!^hUTtnTtD+NA= zKM(Kfwvq$KP4l zYoWO+6+0qeW{Ob{%?X^oD;qv&KfwPj3lR%60pNh=m4Lj zNy1x`=dIx}Npl=|I4tC0KJfAYANl3r6n$aznh@5-d3JzL|B|o^d(yuc_EN%L6vCdr z6|kef($j}fSG)V@8*v*)-y`s?oxtsBt_$=@d}r|gW}L~iTz=wwCh=PXCwWQIcZNrY zdU-Yab*FQ4a1!s}m!yEJsH(xdACQ2r z;rR>ZW2;W_^v-u<_SB*fencMc=7Hm@>aiFi?oi1mAF0Sj#fPWHVOV;U7@OK9M?FsnaM2Zh3 z>NHt*NjNvpM!n?fsNLM)d&K{VkJrs<$5*FtmmEcTs&@>Nmqgtq=dzM>4z3L2x$)$@ zai`^ZxPnJfu!btuD{Z!CwWZfC#E3e)2SCyue#^d+o=yc zKJ{7Ry};=xU6y{_VbeVe$}mwc>0Njm>L^_UJi*73tQTjq#h0_$;wybv3=s~U9@k5< z{0rcd@?~DY?@4hy@P2j-6W{r`Q2w35m&WwzE7MoUFyRt)l)jbcjs9Kw9^eN8{0MNU zi_XftGkhkWRN~WV#^qlYUz`t+Nx-aH+nrTwt{3yw3-@g~PqQcIY%b>v%@yi6wN#y; z-d1aMsV-Hou_oQlvRZ8+ze=;%tRVK)=Bvbaf;o}ZYA2i1OuadswP(%dOml&mVlFh_C#D~mAF^ic za`SU@D67qGCiJcRR-4<+2D8R&`p? zlYQ5g+j8@3o3i804R(s%&)jYgwTsL>_DFk_dBiTYtIcDq+gxX!Va4WY<~jQfd!~8Q ze$$?B-m%}a-!mWEd+oiP!fMnrQr5*%*2R={f4(ppz|VbKv$LvZ-PTaPU>e5CLBp3e zqri+-lYyu3vuY|oqxRxt2Ft3#Ilu?1R{RBOAz#oeqP{rcRISH9QT+&-%heUYZvCrO zKUUWO|AMuL-PKL}3@Z@tV1Jtp>M>RT|BY`{w&NR>r_?y*R?3#Ef2ue5s^?9A+Ab|% z7ij^z&;rVVd$6`6Vyz-4#j-MSJnLlK+Sx&RH(d{=K~`PurT1b5+TOB~>L9+oN$Epa ztr6+N_2J;%%GyXT)=Plf^lJPy`a;5fPk#^iBGzj}`uqC(U@qo+of3UH=k@l`zi?}- zSm*c~R_orV?^j)94Q^Nc2;U~mkd?Sy^(M~o?W13$r5e{#iGh~N_e_4x6(`p6WkL_P z_KLRG6L=fbOQq$k-=VB%+(}I}6{bRMZ-$%UYA4s4RW~!*jK;4rRjh|dnY8NfTDBU- zn#me9fY!Vl_}$I!&`&fI)nv1$*%SInW|FF*l{cs`6<{03$W-Y0&W5r{CbDTL2%CDLA#B-84iLfV|lc70<6Ntyqb4~|yra6r%>2dt1pdab`_cm07x~>SeXnti&|8rn z?P2HHd1@kS&F8B++scabdb_}~-rg=^1<(X!*^#WyKFS`Yc0;1A1i#9zBJ65brB~WD ztPmO@Ytwt$wX75xAuH4??Xj#F8X@b{``P1JEi}ZQXirq5?Me0|Rb@}MCj*~iPXRvF zo~8yP8Nb1|eP`G+)OdTQJyT7xXW6q<1G4gL@aNcbRFgf|p3AzcZ`t#p|F%7!?+KBi z_{dPcsJzeKkMc8m8J#RFSF!MXFkns#c`xFr?~YG~|)|`l+M%4O2_djs1|dEAdyUHB{I! z{D!HuXiJN>T#tXEx{R2A#IFb`d^xdS!EbMo#ad+X_9BaWiY(q!WN`(u_#Sou{*!uu z{62_W?kaM5SCPxpL@sY5a(RTvDI3n>-bKE3i1hY)drHfl zjy_Sodx&&@-CrFnUq3{8XT3ABa-bf=mtA9#<|ZM{_eYM)*DE5;-S-fzhDCN)BfDGp zK5{PW?PlwFthC!fFJP@5YhaP-J0R1KCO__*iAb+RvX>&+ze~&)BHxRV?-v0($v#IU z`;H>ndx>P9C6aw7y+PllDn+t)6UjbLBzw1nWcS}&u)3CYd=urXiwGN}oL<)hnI4Hu zuNRpj%G)so|E}iyq8kQd89CiB)9@{ad{Z(A`-bm13@h`I z?@n7ZiME*H>?ZK;?&y_osUdtdZ~)?=$P)JV@8XPk?#xCcA{e@h>q!kj`<~FuQS&{|10w=;Oouxz`r)X zR#omB1mNGGb*e<`93fg~v}m2~qHnrjGv3ZxW~Xnui@xdN>__OGzUeOdW;@Y0L(new z5&!+>et3BRP16HS^B^>Q%b-S!zG)VHvmKh|G2Z?SP1D7F-9Y^RK;QJ>8;2**=uXr0 zK+|mE?X&2c9-?o$h`#B8zIhS)m(0shzJk{2E?Q@ZXq_%-oy}mJzS$0a^C2;OguWRd z`euUp)O<=#oYv_gT4%0ko$W;HRH1bY-|KLxE~0ySpnH(2d|Ocr#%Z7-qJc(>1{xw7 zXtZdcL!6C_Ho`{6cY0`~=%GDC4~-N(w4dmqnWBdd5IuCD=pnwRK@UwAJ#>)hp&6ow zdW#+!DSBwEXrQs8fqIJu8Y{YIr0AYn(LIwy_tc5*nIyWWPIOO==pHS)XCKi$R5 zt|Fn6%0Vm82)f^T)cdRO2D;-4r!p>&&zO}Ej?@U6qVDE`UfuXL&Cm6GCb zkhoem3jOgy|8?=t7R=X$-i>j!K2G4{CDeNHHwtEVq2I~*>gW1oDBZXgUt(C{eZhQ9 z;1eX&369>(@V>mAE%@0I+iaoSU3{z$VjCqiqXe_m`+{F8F*Hf2r9yM1_y-E+AP1Xa zLfI_%5fU~dm}92f5nO{Uqjo5>G#gr=NtH?|k*L)alEDALe}JWCOZgV(72l170OGtK{u50w3dH ziD!UygP(RfkHn}!VZ*B0|oz2psvD7*@H`R_6%j zdGXH?%5$U^W;qOBBoJ2j5x9@U_I<1&tyc(UviBWcH)1Q%2L*Gy*%f${z@w!9P89fR z@pqS0Hab}SLE;~!C(<(AETh)X3C$AkOU!K!j}~)pUlja{0yhfWDDdmzuM_&?1%6K8 z3F5C1|7()NuSuw{d5lnw5O{>ZjRH>;Kc%s$_00-r4Ki4In;O3l71b^RT+nXvt(HU~@1?&5vHD0w?f zFg}$Mfy=~S>U{N?`0q;0j|sd^!diB>(RvrjmE>PtExmXb*NgRC>@1>{aHsAUnsw3= zz9BL9_P)fkjpY9p@h=zryNrmn9xRv{LO)07ca%Kr zDEJ*+Z&i;8Tq6D%LQ^JinYx=8mI~ZWV(6+q05e?R;X-+pz*k8g);U;7O{wn)=3Qn^ z=*vR6qfqWB_>Wwi>LcswYrT}fdcmJ9u-7uuZnd;qzN>MyEb>s_0qi(-^NY(Fo7u+Z zX|vSZ^VY3cqTXB5vZ_rNtKqs**O-BNcYclfaemYEEXEr1^%A~rJ&xZg`Ye4uzl-(t z`f`1>zMfgfoAu46uimKdMSeZ5pVP1M+pIrfo+nbutmSVWZAqWdb9W+Io~Mpi^cCIey_IGOIMhF%ea{V z%T~;9GyAS|sSIAZxNU(Mv2tZ9ZBqCdGiK%Lxhu`?D_1XHY3enSQ@^TA{r*!1nqCc4 zW)CzI?4_!-?%<|@`tgRkSp)6nhMBW~_pUn_f1erC21YwgpVl}qYMeP^A273^!JoPJ zz-Wn-q%Jz2F(%PQ>@MQ&MZ=j#?se$;@*||$cGbtNQ%{Ur|O(|XS6Yc}JQ=idLrMvJ|Y&0u6ELs#Xw@j>&xMv)p_cV-a-3`v=eiCeCNwN z1p9;VzebtqN{j93Q)N!eM7@e?BwZh8`x(m+fnJux-rx)z|@c7dzDQJu>rmI$E!K*d=xaBd`+~TU{EBwpZI5?MC~6eViS~ zHp8TePEh@scYj6y6M6iaeqFzz-_&pExAi+n=Xdpc`hER@{!o9UKh~eK$zt^^MA-?orRE2O`}@5j&U_%N}N>k>ACvm+WJ}e{Y$hxfi}?(X=0+$(L}y@ztmnytGN#78hgFH$#Q-s@olho z+xvj-p)EaPAD47UjbEg$SGVe)vOgQJ*@qdgKQfcz@LHY7-Wl{|Qkj5H4ww;j_Y=Xo z{0y~jQ4JV&bvX!(r6rZoj=M!z;?gd>ly>7A&3xh6gz0L#6GEe-wY?07+_6{Ukc}1@ zf>hF$|I+NW_6GbLtkZQ}%nqhb@^%6LQn>uNM(zINQZg^eu6WSCZ$CuheH>}zgSDsI zvn_huo@Xz#mvFz>UPc-=ln(!0nQfFomVFcdEOKU$XT-zYi#rV%DdxsxlIJ&Fp7|%O z$nFToDLc_l0q##r$=FGDFW>>RnQB{S_XggX)>C8a?KI$lw4++vVD|y8phbmuH$|VbL+U>SM?uzNpJJDX# zc27(HBlLsx?fhlqfl?hEr7PR4U%eG+uQa*UTtUl(e_-q zyzOQHc(;w(k@R=sUjcSvlwEz4K8RMJB_BreT_*Y7R`M}a^06z_+mn*hL?`mow7%=X z-OA6ZcZi!kCFmIgq;_{^ZhH;(>reGh)vhv!JwpGAmO4^uy^>b319PHvrjGfx3z*%k zlK-$$lCQM%n+&sG3;4go{r|Fus#b=0j&a`|2Nrl5xdXryy*JM9CaZ1-Wxhk?RERSbE?ev1a!*94D!PN~1{-rBbXLn(rxMD5dPc}LG4mq-t1XAFoc z1hcbX2I9N?mP7v}X}n-xro7&Owun&M_?tTnIA&M=-_XfQ?;90F%w-h|nyKk00OG z=(V)m2<_)(Yvf_>f_Dkn!twR{OK1>>9_s4O4&}1RUPgA*B{m_H5MBU}BVwXMc>a7L zCB)W9Ax?qDuo-8BRv;p-tj6myeR>11c?NBc~f@M92O*?nXS>n zT_qBUsf1`M2=c)Z$Ye4OZ-z57!$JgBc$hC@hG6+Z14v;BTA@MX2-!h?0U|#E9}R0V zSpu=h*2riHdO=#`=lz@Z@8STjC;|bgq0u(*l(Lf}6!?o_H3r{LL^ZR){gL?tzWXe}F%>Ltf!vH$HOfzjqaS78jQfar~XH@86uq!_9lEU@0^KTg>C| zMO$gq`6u)eu>HI!LXm*YrI5&8B&H>kgEcd^u)vZm$Sf?`fBeUuhvEkg^XvrAlPGL4Q2eF!uT)ZicD09-&Y-u2{teBPU>3yEb=iYAH zTTxl4gJthYqYfc8@*Glf^wWDKD9!NzX{`6pGtIQLvEZB0@u=!$SccuU=JCkJl5BtO zWDmEgfHipJVjUx*Y+EMZ&{emuFrFnfujcIdW#s*JRL}YI_Q!5BzI(54cV%+mM9!>r zdffxktd0w{VoycBeYQc~F=0wom?s)MZ^j3jtE1Sam6pEA(=YUoO%mtoi-Jh4IYy|A zNKJD6!}O8YrzqFnOaDB0wQx1kAtP(wyB5zJy1sQil{1OKSkVHa09YKA&`qdXx4BE| zP3S3eax0$8m0nMy3X*MV0u}^}CJ#gp=SIesJIjF+i^ZL3YIAbU#3ZqjSg?vCdmI4$ zcpAgG$(>eFy*PTv+q#K1y}_=kH8V1!oJcy-Hk9%HE)$13CH#g%okWKCKHb^T|DNXq zQa`E8v~C?z*MuD_oXActksJlU%6yIzOLr=ZKDaD?M^*IOB1iXv4c7;Xf~6kDN!&E= zq_i+Yy-o9~yJz*DRPB;#4aAYy^d>nt=N>la0vGeEFCE*ssNfv-hvi>ns&Pv7iah-vCf+>)4vvJVl_`Mw$0B9UvriH?EY|Z zb*gZ*-gv6$=Y)jl=%*+d8oC`3i6YuyD7`=Ok8J72at#cPVsF~2N1i1+maUps0FA+# zd8^y~nO!-(t48jmc)AC>4Hp~*V8gyCkCVC<0fQ}f3@}zf1DSDc?^eSu!mY1yEU&Na z;pj+zw^WkJphJF}=aviigXZu`w$d5M;<>m8zc`H$R83?9F5 zJi4GuohBc)+Oy&rt1DYp6UI7HHcIv3o*e#1~=L1cEu&eJ`wEu zkzsC9=ee4mBlYF)#F@i#Agh@(p1P@3{M^QIQZ!TK_Bhv|E2g%qJ>z9k;80t2+;rTT zckg;5Ev<a~Q?yk?zZQQHxD z_L&^4pS^fI)?;;bos>4^;mjC(5`Djoay6I8>OC3t>ckD=Oe*nO*_I^{jN_rrl3JVc z1D6(3Q(2ZH?kv$9YG8KYV*Tn~*l~ z>sv_#Y34K%iM)-$7!*M68)DeUDxBTCQYUPSe)1W~F7+)8iny2;L+y3i-FA37-x8m5 zQW`iOnsdtIP=0V{aITB=48vYjzc@3i8$UW9$)pac#L^?%looQqH(7EhuKc$3UcK0~ zCw{x$T3u&X1x&Y?yl{Wph=ypjAs_o>wO5mFkn-BYb*I)Xx@O~~z#A`%WtKK$&nK^~5$)ig@GW+xyAW<;435!kVOF`e zW_^jh`~FN5=w1XumEr2ik@m5_H`X=vCFS23C~mQs9eK`BsA^*4Q^SqV&AHm!tu3^9 zIw0$O?I)_BJJX$MG)J|l!HAq84?%=LbBma0ykt?P*DS-^G8&b-h&-?M=nr2nl?h+$M%8pnQ&TyD004XGNL5 zX0MIal$%$<(nnzliITuPNALpFPTd{n{hrKI;=`tZ99@2I`2cN${?kZsj2T!r8U>tzlkS*0Q9l_EI zM5B z@B|>Vq~Yi5$9LY{1Wmpux>kDr*7)`_@CpF-uO1tY&8;YaNyJqi&T!av#X7|bK!z3H mEtLcNjS7^z&*^TdhW+AAiba(JL!$z_1}6pjKXRJByzO6czK>}D diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 19a32d68..683511c2 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -44,8 +44,8 @@ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 6436409A27A31CDE00820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; - 6436409A27A31CD500820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409C27A31CD800820AF7 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + 6436409327A31CD800820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -225,8 +225,8 @@ 6436409C27A31CD800820AF7 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 6436409A27A31CDE00820AF7 /* pt */, - 6436409A27A31CD500820AF7 /* en */, + 6436409C27A31CD800820AF7 /* pt */, + 6436409327A31CD800820AF7 /* en */, ); name = InfoPlist.strings; sourceTree = ""; diff --git a/lib/actions/actions.dart b/lib/actions/actions.dart index a5b0d07b..e7bc83e8 100644 --- a/lib/actions/actions.dart +++ b/lib/actions/actions.dart @@ -1,7 +1,12 @@ +import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; +import '/custom_code/actions/index.dart' as actions; +import '/flutter_flow/random_data_util.dart' as random_data; import 'package:flutter/material.dart'; -Future repeatVisitScheduleActionBlock( +Future repeatVisitScheduleAction( BuildContext context, { List? visitorJsonList, String? visitorStrList, @@ -49,5 +54,228 @@ Future repeatVisitScheduleActionBlock( true, ), }.withoutNulls, + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, ); } + +Future manageStatusColorAction( + BuildContext context, { + required String? visitStatusStr, +}) async { + if (visitStatusStr == 'A') { + return FlutterFlowTheme.of(context).success; + } else if ((visitStatusStr == 'C') || + (visitStatusStr == 'F') || + (visitStatusStr == 'B') || + (visitStatusStr == 'I')) { + return FlutterFlowTheme.of(context).error; + } + + return FlutterFlowTheme.of(context).warning; +} + +Future singInActionApp( + BuildContext context, { + String? emailAdress, + String? password, +}) async { + String? devUUID; + ApiCallResponse? loginCall; + + await Future.wait([ + Future(() async { + FFAppState().email = emailAdress!; + }), + Future(() async { + FFAppState().passwd = password!; + }), + ]); + if ((FFAppState().email != '') && + (FFAppState().passwd != '')) { + devUUID = await actions.getDevUUID(); + FFAppState().devUUID = devUUID!; + loginCall = await PhpGroup.loginCall.call( + email: FFAppState().email, + password: FFAppState().passwd, + uuid: FFAppState().devUUID, + type: FFAppState().device, + description: random_data.randomString( + 10, + 10, + true, + false, + false, + ), + ); + FFAppState().userUUID = PhpGroup.loginCall.userUUID( + (loginCall.jsonBody ?? ''), + )!; + if (PhpGroup.loginCall.error( + (loginCall.jsonBody ?? ''), + ) == + false) { + FFAppState().isLogged = true; + + context.goNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } else { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: PhpGroup.loginCall.msg( + (loginCall?.jsonBody ?? ''), + )!, + ), + ); + }, + ); + + FFAppState().email = ''; + FFAppState().passwd = ''; + FFAppState().update(() {}); + } + } else { + return; + } +} + +Future signUpActionApp( + BuildContext context, { + required String? name, + String? passwd, + required String? email, + String? device, +}) async { + ApiCallResponse? registerCall; + + if ((email != null && email != '') && + (passwd != null && passwd != '') && + (name != null && name != '')) { + registerCall = await PhpGroup.registerCall.call( + name: name, + password: passwd, + email: email, + token: random_data.randomString( + 36, + 36, + false, + false, + true, + ), + uuid: random_data.randomString( + 36, + 36, + false, + false, + true, + ), + tipo: device, + descricao: random_data.randomString( + 36, + 36, + true, + false, + false, + ), + ); + if (PhpGroup.registerCall.error( + (registerCall.jsonBody ?? ''), + ) == + false) { + return true; + } + + await showDialog( + context: context, + builder: (alertDialogContext) { + return AlertDialog( + title: const Text('ERROR2'), + content: const Text('ERROR2'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(alertDialogContext), + child: const Text('ERROR2 '), + ), + ], + ); + }, + ); + return false; + } else { + await showDialog( + context: context, + builder: (alertDialogContext) { + return AlertDialog( + title: const Text('ERROR1'), + content: const Text('ERROR1'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(alertDialogContext), + child: const Text('ERROR1 '), + ), + ], + ); + }, + ); + return false; + } +} + +Future forgotPasswdAction( + BuildContext context, { + required String? email, +}) async { + ApiCallResponse? forgotPasswd; + + forgotPasswd = await PhpGroup.forgotPasswordCall.call( + email: email, + ); + if (PhpGroup.forgotPasswordCall.error( + (forgotPasswd.jsonBody ?? ''), + ) == + false) { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + FFAppState().device, + ParamType.String, + ), + }.withoutNulls, + ); + } else { + return; + } +} + +Future cachingLoginActionApp(BuildContext context) async { + if (FFAppState().isLogged == true) { + context.pushNamed('homePage'); + } else { + if (isAndroid == true) { + FFAppState().device = 'Android'; + } else if (isiOS == true) { + FFAppState().device = 'iOS'; + } else { + FFAppState().device = 'Web'; + } + } +} diff --git a/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart index 8baf37ac..ea00bd17 100644 --- a/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart +++ b/lib/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart @@ -57,41 +57,59 @@ class _OptionSelectionModalWidgetState extends State @override Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Wrap( - spacing: 17.0, - runSpacing: 0.0, - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - direction: Axis.horizontal, - runAlignment: WrapAlignment.start, - verticalDirection: VerticalDirection.down, - clipBehavior: Clip.none, - children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0), - child: InkWell( + return InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + Navigator.pop(context); + }, + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Wrap( + spacing: 17.0, + runSpacing: 0.0, + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + direction: Axis.horizontal, + runAlignment: WrapAlignment.start, + verticalDirection: VerticalDirection.down, + clipBehavior: Clip.none, + children: [ + InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { Navigator.pop(context); + + context.pushNamed('fastPassPage'); }, child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -147,8 +165,8 @@ class _OptionSelectionModalWidgetState extends State alignment: const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'omxabblt' /* Agenda -Rápida */ + 'bmjlmhht' /* Agenda +Rapida */ , ), style: FlutterFlowTheme.of(context) @@ -173,10 +191,7 @@ Rápida */ ), ), ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0), - child: InkWell( + InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, @@ -191,10 +206,20 @@ Rápida */ height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -250,7 +275,7 @@ Rápida */ alignment: const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'vpy51li0' /* Agenda + 'ci8eyh2v' /* Agenda Provisória */ , ), @@ -276,10 +301,7 @@ Provisória */ ), ), ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 1.0), - child: InkWell( + InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, @@ -294,10 +316,20 @@ Provisória */ height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -353,7 +385,7 @@ Provisória */ alignment: const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - '8ad3hms9' /* Agenda + 'jj2b545b' /* Agenda Completa */ , ), @@ -379,11 +411,11 @@ Completa */ ), ), ), - ), - ], - ).animateOnPageLoad(animationsMap['wrapOnPageLoadAnimation']!), - ), - ], + ], + ).animateOnPageLoad(animationsMap['wrapOnPageLoadAnimation']!), + ), + ], + ), ); } } diff --git a/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart index a6b63538..b2f4c288 100644 --- a/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart +++ b/lib/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart @@ -1,4 +1,4 @@ -import '/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart'; +import '/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -130,7 +130,7 @@ class _VisitorNotFoundComponentWidgetState builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf(context), - child: const RegisiterVistorComponentWidget(), + child: const RegisiterVistorTemplateComponentWidget(), ); }, ).then((value) => safeSetState(() {})); diff --git a/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart b/lib/application_components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart similarity index 100% rename from lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart rename to lib/application_components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_model.dart diff --git a/lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart b/lib/application_components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart similarity index 100% rename from lib/application_components/templates_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart rename to lib/application_components/organism_components/arrow_linked_locals_component/arrow_linked_locals_component_widget.dart diff --git a/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart index d63fabf0..ec4c3b0a 100644 --- a/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart +++ b/lib/application_components/organism_components/local_profile_component/local_profile_component_widget.dart @@ -2,6 +2,7 @@ import '/application_components/organism_components/bottom_arrow_linked_locals_c import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/custom_functions.dart' as functions; +import '/flutter_flow/random_data_util.dart' as random_data; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; @@ -43,119 +44,107 @@ class _LocalProfileComponentWidgetState Widget build(BuildContext context) { context.watch(); - return Container( - height: 284.0, - decoration: const BoxDecoration(), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Stack( - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Material( - color: Colors.transparent, - elevation: 0.0, - child: Container( - width: double.infinity, - height: 119.0, - decoration: BoxDecoration( - color: const Color(0xFF1AAB5F), - border: Border.all( - color: const Color(0xFF1AAB5F), - ), - ), - ), + return Visibility( + visible: random_data.randomInteger(0, 10) != null, + child: Container( + decoration: const BoxDecoration(), + child: Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Material( + color: Colors.transparent, + elevation: 0.0, + child: Container( + width: double.infinity, + height: 119.0, + decoration: BoxDecoration( + color: const Color(0xFF1AAB5F), + border: Border.all( + color: const Color(0xFF1AAB5F), ), ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(24.0), - child: Container( - width: 200.0, - height: 200.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional(0.0, 0.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: const EdgeInsets.all(2.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - showModalBottomSheet( - isScrollControlled: true, - backgroundColor: const Color(0x00FFFFFF), - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const SizedBox( - height: double.infinity, - child: - BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - child: ClipRRect( - borderRadius: BorderRadius.circular(200.0), - child: Image.network( - valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: 300.0, - height: 200.0, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + showModalBottomSheet( + isScrollControlled: true, + backgroundColor: const Color(0x00FFFFFF), + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const SizedBox( + height: double.infinity, + child: + BottomArrowLinkedLocalsComponentWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(200.0), + child: Image.network( + valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + width: 80.0, + height: 80.0, + fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + errorBuilder: (context, error, stackTrace) => + Image.asset( + 'assets/images/error_image.svg', + width: 80.0, + height: 80.0, fit: BoxFit.cover, alignment: const Alignment(0.0, 0.0), - errorBuilder: (context, error, stackTrace) => - Image.asset( - 'assets/images/error_image.svg', - width: 300.0, - height: 200.0, - fit: BoxFit.cover, - alignment: const Alignment(0.0, 0.0), - ), ), ), ), ), ), ), - ), + Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + valueOrDefault( + functions.convertToUppercase(FFAppState().local), + 'NOME DO LOCAL', + ), + style: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).info, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + ], + ), + ] + .divide(const SizedBox(width: 20.0)) + .addToStart(const SizedBox(width: 20.0)) + .addToEnd(const SizedBox(width: 20.0)), ), - ], + ), ), - Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - valueOrDefault( - functions.convertToUppercase(FFAppState().local), - 'NOME DO LOCAL', - ), - style: FlutterFlowTheme.of(context).labelMedium.override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context).primaryText, - fontSize: 20.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), - ), - ), - ], - ), - ], + ), ), ); } diff --git a/lib/application_components/templates_components/menu_component/menu_component_model.dart b/lib/application_components/organism_components/menu_component/menu_component_model.dart similarity index 53% rename from lib/application_components/templates_components/menu_component/menu_component_model.dart rename to lib/application_components/organism_components/menu_component/menu_component_model.dart index 1fe72b77..3b68346f 100644 --- a/lib/application_components/templates_components/menu_component/menu_component_model.dart +++ b/lib/application_components/organism_components/menu_component/menu_component_model.dart @@ -1,3 +1,4 @@ +import '/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart'; import '/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart'; import '/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -34,4 +35,43 @@ class MenuComponentModel extends FlutterFlowModel { Future changeMenuStyle(BuildContext context) async { isGrid = !isGrid; } + + Future scheduleVisitOptAction(BuildContext context) async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const OptionSelectionModalWidget(), + ); + }, + ); + } + + Future registerVisitorOptAction(BuildContext context) async { + context.pushNamed( + 'registerVisitorPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } + + Future peopleOnThePropertyAction(BuildContext context) async { + context.pushNamed( + 'peopleOnThePropertyPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } } diff --git a/lib/application_components/templates_components/menu_component/menu_component_widget.dart b/lib/application_components/organism_components/menu_component/menu_component_widget.dart similarity index 65% rename from lib/application_components/templates_components/menu_component/menu_component_widget.dart rename to lib/application_components/organism_components/menu_component/menu_component_widget.dart index b89f8671..b885b196 100644 --- a/lib/application_components/templates_components/menu_component/menu_component_widget.dart +++ b/lib/application_components/organism_components/menu_component/menu_component_widget.dart @@ -50,6 +50,18 @@ class _MenuComponentWidgetState extends State { await _model.changeMenuStyle(context); setState(() {}); }, + registerVisitorOptAction: () async { + await _model.registerVisitorOptAction(context); + setState(() {}); + }, + scheduleVisitOptAction: () async { + await _model.scheduleVisitOptAction(context); + setState(() {}); + }, + peopleOnThePropertyOptAction: () async { + await _model.peopleOnThePropertyAction(context); + setState(() {}); + }, ), ); } else { @@ -58,10 +70,22 @@ class _MenuComponentWidgetState extends State { updateCallback: () => setState(() {}), updateOnChange: true, child: MenuStaggeredViewComponentWidget( - changeMenuStyle: () async { + changeMenuStyleAction: () async { await _model.changeMenuStyle(context); setState(() {}); }, + registerVisitorOptAction: () async { + await _model.registerVisitorOptAction(context); + setState(() {}); + }, + scheduleVisitOptAction: () async { + await _model.scheduleVisitOptAction(context); + setState(() {}); + }, + peopleOnThePropertyOptAction: () async { + await _model.peopleOnThePropertyAction(context); + setState(() {}); + }, ), ); } diff --git a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart index 798a0c96..75cd40af 100644 --- a/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart +++ b/lib/application_components/organism_components/menu_list_view_component/menu_list_view_component_widget.dart @@ -1,10 +1,8 @@ -import '/application_components/molecular_components/option_selection_modal/option_selection_modal_widget.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; import 'menu_list_view_component_model.dart'; export 'menu_list_view_component_model.dart'; @@ -12,9 +10,15 @@ class MenuListViewComponentWidget extends StatefulWidget { const MenuListViewComponentWidget({ super.key, required this.changeMenuStyle, + required this.registerVisitorOptAction, + required this.scheduleVisitOptAction, + required this.peopleOnThePropertyOptAction, }); final Future Function()? changeMenuStyle; + final Future Function()? registerVisitorOptAction; + final Future Function()? scheduleVisitOptAction; + final Future Function()? peopleOnThePropertyOptAction; @override State createState() => @@ -46,8 +50,6 @@ class _MenuListViewComponentWidgetState @override Widget build(BuildContext context) { - context.watch(); - return Wrap( spacing: 0.0, runSpacing: 0.0, @@ -62,42 +64,46 @@ class _MenuListViewComponentWidgetState padding: const EdgeInsetsDirectional.fromSTEB(5.0, 0.0, 5.0, 0.0), child: Container( width: double.infinity, - height: 106.0, + height: 125.0, decoration: const BoxDecoration(), child: ListView( - padding: EdgeInsets.zero, + padding: const EdgeInsets.fromLTRB( + 10.0, + 0, + 10.0, + 0, + ), scrollDirection: Axis.horizontal, children: [ Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const OptionSelectionModalWidget(), - ); - }, - ).then((value) => safeSetState(() {})); + await widget.scheduleVisitOptAction?.call(); }, child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -182,36 +188,34 @@ Visita */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), child: InkWell( splashColor: Colors.transparent, focusColor: Colors.transparent, hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - context.pushNamed( - 'registerVisitorPage', - queryParameters: { - 'userUUID': serializeParam( - FFAppState().userUUID, - ParamType.String, - ), - 'devUUID': serializeParam( - FFAppState().devUUID, - ParamType.String, - ), - }.withoutNulls, - ); + await widget.registerVisitorOptAction?.call(); }, child: Container( width: 100.0, - height: 0.0, + height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -296,16 +300,26 @@ Visitante */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -388,16 +402,26 @@ Condomínio */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -480,108 +504,26 @@ Pet */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), child: Container( width: 100.0, height: double.infinity, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Icon( - FFIcons.kvector3, - color: FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'xlp8dyn6' /* Agendar -Visita */ - , - ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), - child: Container( - width: 100.0, - height: double.infinity, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -664,98 +606,118 @@ de Acesso */ ), ), Padding( - padding: const EdgeInsetsDirectional.fromSTEB(10.0, 10.0, 0.0, 1.0), - child: Container( - width: 100.0, - height: double.infinity, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 10.0, 0.0, 20.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.peopleOnThePropertyOptAction?.call(); + }, + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, + ), ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Icon( - FFIcons.kfast, - color: FlutterFlowTheme.of(context) - .accent1, - size: 24.0, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + Icons.people, + color: FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), ), ), ), ), - ), - ], + ], + ), ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - '45gqx8e0' /* Agenda -Auto-Visita */ - , + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'rxnrtdau' /* Pessoas na +Propriedade */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Nunito'), + ), ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Nunito'), - ), ), - ), - ], + ], + ), ), - ), - ].divide(const SizedBox(height: 0.0)), + ].divide(const SizedBox(height: 0.0)), + ), ), ), ), ), - ], + ].divide(const SizedBox(width: 15.0)), ), ), ), diff --git a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart index 85226519..c85631c4 100644 --- a/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart +++ b/lib/application_components/organism_components/menu_staggered_view_component/menu_staggered_view_component_widget.dart @@ -10,10 +10,16 @@ export 'menu_staggered_view_component_model.dart'; class MenuStaggeredViewComponentWidget extends StatefulWidget { const MenuStaggeredViewComponentWidget({ super.key, - required this.changeMenuStyle, + required this.changeMenuStyleAction, + required this.registerVisitorOptAction, + required this.scheduleVisitOptAction, + required this.peopleOnThePropertyOptAction, }); - final Future Function()? changeMenuStyle; + final Future Function()? changeMenuStyleAction; + final Future Function()? registerVisitorOptAction; + final Future Function()? scheduleVisitOptAction; + final Future Function()? peopleOnThePropertyOptAction; @override State createState() => @@ -57,7 +63,7 @@ class _MenuStaggeredViewComponentWidgetState children: [ Container( width: double.infinity, - height: 430.0, + height: MediaQuery.sizeOf(context).height * 0.35, decoration: const BoxDecoration(), child: Padding( padding: const EdgeInsets.all(16.0), @@ -68,502 +74,39 @@ class _MenuStaggeredViewComponentWidgetState ), crossAxisSpacing: 10.0, mainAxisSpacing: 10.0, - itemCount: 7, + itemCount: 6, shrinkWrap: true, itemBuilder: (context, index) { return [ - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), + () => InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.scheduleVisitOptAction?.call(); + }, child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: + FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - FFIcons.kfast, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'jn7p6pj6' /* Agenda -Auto-Visita */ - , - ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), - ), - ), - ), - ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - FFIcons.kvector, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'yymmdtyv' /* Cadastrar -Visitante */ - , - ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), - ), - ), - ), - ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - FFIcons.khome, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'f2jbm9jz' /* Vincular -Condomínio */ - , - ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), - ), - ), - ), - ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), - ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - FFIcons.kpets, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), - ), - ), - ), - ), - ], - ), - ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'rs5a7h6m' /* Cadastrar -Pet */ - , - ), - style: FlutterFlowTheme.of(context) - .titleLarge - .override( - fontFamily: 'Nunito', - color: - FlutterFlowTheme.of(context) - .primaryText, - fontSize: 14.0, - letterSpacing: 0.0, - fontWeight: FontWeight.w500, - useGoogleFonts: - GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), - ), - ], - ), - ), - ].divide(const SizedBox(height: 0.0)), - ), - ), - ), - ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -624,7 +167,7 @@ Pet */ const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'if2zuaok' /* Agendar + 'ee33l0ms' /* Agendar Visita */ , ), @@ -652,34 +195,35 @@ Visita */ ), ), ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), + () => InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.registerVisitorOptAction?.call(); + }, child: Container( width: 100.0, height: 100.0, decoration: BoxDecoration( color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: + FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], borderRadius: BorderRadius.circular(24.0), shape: BoxShape.rectangle, border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, + color: FlutterFlowTheme.of(context).alternate, width: 0.5, ), ), @@ -716,7 +260,7 @@ Visita */ alignment: const AlignmentDirectional( 0.0, 0.0), child: Icon( - FFIcons.kvector3, + FFIcons.kvector, color: FlutterFlowTheme.of(context) .accent1, @@ -740,8 +284,8 @@ Visita */ const AlignmentDirectional(0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'r4mjqq6s' /* Agendar -Visita */ + 'ya37l3jt' /* Cadastrar + Visitante */ , ), style: FlutterFlowTheme.of(context) @@ -768,96 +312,412 @@ Visita */ ), ), ), - () => Padding( - padding: EdgeInsets.all(valueOrDefault( - () { - if (MediaQuery.sizeOf(context).width < - kBreakpointSmall) { - return 0.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointMedium) { - return 24.0; - } else if (MediaQuery.sizeOf(context).width < - kBreakpointLarge) { - return 24.0; - } else { - return 0.0; - } - }(), - 0.0, - )), - child: Container( - width: 100.0, - height: 100.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context).primaryBackground, - borderRadius: BorderRadius.circular(24.0), - shape: BoxShape.rectangle, - border: Border.all( - color: FlutterFlowTheme.of(context).customColor1, - width: 0.5, - ), + () => Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, ), - child: Padding( - padding: const EdgeInsets.all(4.0), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 8.0, 0.0, 0.0, 0.0), - child: Container( - width: 30.0, - height: 30.0, - decoration: BoxDecoration( - color: - FlutterFlowTheme.of(context) - .primaryBackground, - shape: BoxShape.circle, - ), - alignment: const AlignmentDirectional( - 0.0, 0.0), - child: Icon( - FFIcons.kvector2, - color: - FlutterFlowTheme.of(context) - .accent1, - size: 24.0, - ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + FFIcons.khome, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, ), ), ), ), - ], - ), + ), + ], ), - Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Align( + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'h8s3adu8' /* Vincular +Condomínio */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + () => Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( alignment: - const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'cilu7ief' /* QR Code + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + FFIcons.kpets, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'j6tfixen' /* Cadastrar +Pet */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + () => Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Icon( + FFIcons.kvector2, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + '9tli4i2x' /* QR Code de Acesso */ + , + ), + style: FlutterFlowTheme.of(context) + .titleLarge + .override( + fontFamily: 'Nunito', + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap() + .containsKey('Nunito'), + ), + ), + ), + ], + ), + ), + ].divide(const SizedBox(height: 0.0)), + ), + ), + ), + () => InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.peopleOnThePropertyOptAction?.call(); + }, + child: Container( + width: 100.0, + height: 100.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context).primaryBackground, + boxShadow: [ + BoxShadow( + blurRadius: 4.0, + color: + FlutterFlowTheme.of(context).customColor5, + offset: const Offset( + 0.0, + 2.0, + ), + ) + ], + borderRadius: BorderRadius.circular(24.0), + shape: BoxShape.rectangle, + border: Border.all( + color: FlutterFlowTheme.of(context).alternate, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 8.0, 0.0, 0.0, 0.0), + child: Container( + width: 30.0, + height: 30.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Icon( + Icons.people, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 24.0, + ), + ), + ), + ), + ), + ], + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: + const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'i22hecs8' /* Pessoas na +Propriedade */ , ), style: FlutterFlowTheme.of(context) @@ -914,7 +774,7 @@ de Acesso */ color: FlutterFlowTheme.of(context).primary, ), onPressed: () async { - await widget.changeMenuStyle?.call(); + await widget.changeMenuStyleAction?.call(); }, ), ), diff --git a/lib/application_components/templates_components/message_well_component/message_well_component_model.dart b/lib/application_components/organism_components/message_well_component/message_well_component_model.dart similarity index 100% rename from lib/application_components/templates_components/message_well_component/message_well_component_model.dart rename to lib/application_components/organism_components/message_well_component/message_well_component_model.dart diff --git a/lib/application_components/templates_components/message_well_component/message_well_component_widget.dart b/lib/application_components/organism_components/message_well_component/message_well_component_widget.dart similarity index 98% rename from lib/application_components/templates_components/message_well_component/message_well_component_widget.dart rename to lib/application_components/organism_components/message_well_component/message_well_component_widget.dart index 3109dce7..d8a5b8b8 100644 --- a/lib/application_components/templates_components/message_well_component/message_well_component_widget.dart +++ b/lib/application_components/organism_components/message_well_component/message_well_component_widget.dart @@ -84,7 +84,7 @@ class _MessageWellComponentWidgetState .override( fontFamily: FlutterFlowTheme.of(context).labelMediumFamily, - color: FlutterFlowTheme.of(context).secondaryText, + color: FlutterFlowTheme.of(context).customColor4, letterSpacing: 0.0, fontWeight: FontWeight.normal, useGoogleFonts: GoogleFonts.asMap().containsKey( diff --git a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart index df34ecea..1c6116c2 100644 --- a/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart +++ b/lib/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart @@ -1,5 +1,5 @@ import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart'; +import '/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart'; import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; @@ -206,7 +206,7 @@ class _ScheduleVisitDetailWidgetState extends State { MediaQuery.viewInsetsOf( context), child: - const VisitorDetailsModalWidget(), + const VisitorDetailsModalTemplateComponentWidget(), ); }, ).then((value) => @@ -921,7 +921,6 @@ class _ScheduleVisitDetailWidgetState extends State { await PhpGroup.postScheduleVisitCall.call( devUUID: FFAppState().devUUID, userUUID: FFAppState().userUUID, - cliUUID: FFAppState().cliUUID, atividade: 'putVisita', devDesc: widget.visitObsStr, idVisitante: widget.visitorStrList, @@ -932,6 +931,7 @@ class _ScheduleVisitDetailWidgetState extends State { functions.extractIdToStr(widget.visitResonStr!), idNAC: functions.extractIdToStr(widget.visitLevelStr!), obs: widget.visitObsStr, + cliID: FFAppState().cliUUID, ); if (PhpGroup.postScheduleVisitCall.error( (_model.postScheduleVisit?.jsonBody ?? ''), diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart index 883791c9..32e250ab 100644 --- a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart +++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_model.dart @@ -4,12 +4,10 @@ import 'view_visit_detail_widget.dart' show ViewVisitDetailWidget; import 'package:flutter/material.dart'; class ViewVisitDetailModel extends FlutterFlowModel { - /// Local state fields for this component. - - Color? statusColor; - /// State fields for stateful widgets in this component. + // Stores action output result for [Action Block - manageStatusColorAction] action in viewVisitDetail widget. + Color? visitStatusColor; // State field(s) for TextField widget. FocusNode? textFieldFocusNode1; TextEditingController? textController1; diff --git a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart index d48a2c31..6f765217 100644 --- a/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart +++ b/lib/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart @@ -1,9 +1,10 @@ import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart'; +import '/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart'; import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; +import '/actions/actions.dart' as action_blocks; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -26,8 +27,6 @@ class ViewVisitDetailWidget extends StatefulWidget { required this.visitorStrList, this.visitorJsonList, required this.visitIdStr, - required this.updateToggleIdx, - this.repeatVisitScheduleActionBlock, }); final String? visitorImgPath; @@ -41,8 +40,6 @@ class ViewVisitDetailWidget extends StatefulWidget { final String? visitorStrList; final List? visitorJsonList; final String? visitIdStr; - final Future Function()? updateToggleIdx; - final Future Function()? repeatVisitScheduleActionBlock; @override State createState() => _ViewVisitDetailWidgetState(); @@ -64,23 +61,14 @@ class _ViewVisitDetailWidgetState extends State { // On component load action. SchedulerBinding.instance.addPostFrameCallback((_) async { - if (widget.visitStatusStr == 'A') { - _model.statusColor = FlutterFlowTheme.of(context).primary; - setState(() {}); - } else if ((widget.visitStatusStr == 'C') || - (widget.visitStatusStr == 'F') || - (widget.visitStatusStr == 'B') || - (widget.visitStatusStr == 'I')) { - _model.statusColor = FlutterFlowTheme.of(context).error; - setState(() {}); - } else { - _model.statusColor = FlutterFlowTheme.of(context).warning; - setState(() {}); - } + _model.visitStatusColor = await action_blocks.manageStatusColorAction( + context, + visitStatusStr: widget.visitStatusStr, + ); }); - _model.textController1 ??= - TextEditingController(text: widget.visitorStrList); + _model.textController1 ??= TextEditingController( + text: widget.visitTempStr == 'null' ? '' : widget.visitTempStr); _model.textFieldFocusNode1 ??= FocusNode(); _model.textController2 ??= @@ -203,7 +191,8 @@ class _ViewVisitDetailWidgetState extends State { builder: (context) { return Padding( padding: MediaQuery.viewInsetsOf(context), - child: const VisitorDetailsModalWidget(), + child: + const VisitorDetailsModalTemplateComponentWidget(), ); }, ).then((value) => safeSetState(() {})); @@ -767,7 +756,10 @@ class _ViewVisitDetailWidgetState extends State { width: double.infinity, height: 35.0, decoration: BoxDecoration( - color: _model.statusColor, + color: valueOrDefault( + _model.visitStatusColor, + FlutterFlowTheme.of(context).primary, + ), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(0.0), bottomRight: Radius.circular(0.0), @@ -857,7 +849,6 @@ class _ViewVisitDetailWidgetState extends State { hoverColor: Colors.transparent, highlightColor: Colors.transparent, onTap: () async { - await widget.updateToggleIdx?.call(); Navigator.pop(context); context.pushNamed( diff --git a/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_model.dart b/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_model.dart new file mode 100644 index 00000000..4178de7c --- /dev/null +++ b/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_model.dart @@ -0,0 +1,26 @@ +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'forgot_password_template_component_widget.dart' + show ForgotPasswordTemplateComponentWidget; +import 'package:flutter/material.dart'; + +class ForgotPasswordTemplateComponentModel + extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // Stores action output result for [Backend Call - API (forgotPassword)] action in Button-Login widget. + ApiCallResponse? req; + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + } +} diff --git a/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart b/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart new file mode 100644 index 00000000..f63bb7a2 --- /dev/null +++ b/lib/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart @@ -0,0 +1,292 @@ +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'forgot_password_template_component_model.dart'; +export 'forgot_password_template_component_model.dart'; + +class ForgotPasswordTemplateComponentWidget extends StatefulWidget { + const ForgotPasswordTemplateComponentWidget({super.key}); + + @override + State createState() => + _ForgotPasswordTemplateComponentWidgetState(); +} + +class _ForgotPasswordTemplateComponentWidgetState + extends State { + late ForgotPasswordTemplateComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => ForgotPasswordTemplateComponentModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Align( + alignment: const AlignmentDirectional(0.0, 1.0), + child: Container( + width: double.infinity, + height: 300.0, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // This row exists for when the "app bar" is hidden on desktop, having a way back for the user can work well. + if (responsiveVisibility( + context: context, + phone: false, + tablet: false, + )) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 8.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + context.safePop(); + }, + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Padding( + padding: EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: Icon( + Icons.arrow_back_rounded, + color: Color(0xFF15161E), + size: 24.0, + ), + ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB(12.0, 0.0, 0.0, 0.0), + child: Text( + '', + style: + FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: const Color(0xFF15161E), + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'xxm3ajsy' /* ESQUECEU SUA SENHA? */, + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Outfit', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap().containsKey('Outfit'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), + child: Text( + FFLocalizations.of(context).getText( + 'wu2f7yzo' /* Não se preucupe nós vamos te a... */, + ), + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Plus Jakarta Sans'), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(16.0, 12.0, 16.0, 0.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model.emailAddressTextController, + focusNode: _model.emailAddressFocusNode, + autofillHints: const [AutofillHints.email], + obscureText: false, + decoration: InputDecoration( + labelText: FFLocalizations.of(context).getText( + 'mtz8l7ft' /* Email */, + ), + labelStyle: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + hintText: FFLocalizations.of(context).getText( + 'w7y5wlnv' /* digite o seu email..... */, + ), + hintStyle: + FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent1, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).accent3, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of(context).error, + width: 2.0, + ), + borderRadius: BorderRadius.circular(12.0), + ), + filled: true, + fillColor: FlutterFlowTheme.of(context).primaryBackground, + contentPadding: + const EdgeInsetsDirectional.fromSTEB(24.0, 24.0, 20.0, 24.0), + suffixIcon: Icon( + Icons.email, + color: FlutterFlowTheme.of(context).accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + maxLines: null, + keyboardType: TextInputType.emailAddress, + cursorColor: const Color(0xFF6F61EF), + validator: _model.emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 24.0, 0.0, 0.0), + child: FFButtonWidget( + onPressed: () async { + var shouldSetState = false; + _model.req = await PhpGroup.forgotPasswordCall.call( + email: _model.emailAddressTextController.text, + ); + shouldSetState = true; + if (PhpGroup.forgotPasswordCall.error( + (_model.req?.jsonBody ?? ''), + ) == + false) { + Navigator.pop(context); + } else { + if (shouldSetState) setState(() {}); + return; + } + + if (shouldSetState) setState(() {}); + }, + text: FFLocalizations.of(context).getText( + '74rnd5bu' /* Enviar */, + ), + options: FFButtonOptions( + width: 270.0, + height: 50.0, + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), + color: const Color(0xFF1AAB5F), + textStyle: FlutterFlowTheme.of(context).titleSmall.override( + fontFamily: 'Plus Jakarta Sans', + color: Colors.white, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + ), + showLoadingIndicator: false, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart b/lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_model.dart similarity index 89% rename from lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart rename to lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_model.dart index 3cf3c27f..a779051b 100644 --- a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_model.dart +++ b/lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_model.dart @@ -1,12 +1,12 @@ import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/form_field_controller.dart'; -import 'regisiter_vistor_component_widget.dart' - show RegisiterVistorComponentWidget; +import 'regisiter_vistor_template_component_widget.dart' + show RegisiterVistorTemplateComponentWidget; import 'package:flutter/material.dart'; -class RegisiterVistorComponentModel - extends FlutterFlowModel { +class RegisiterVistorTemplateComponentModel + extends FlutterFlowModel { /// State fields for stateful widgets in this component. bool isDataUploading = false; diff --git a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart b/lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart similarity index 98% rename from lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart rename to lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart index d8d2d7ea..51e666b1 100644 --- a/lib/application_components/templates_components/regisiter_vistor_component/regisiter_vistor_component_widget.dart +++ b/lib/application_components/templates_components/regisiter_vistor_template_component/regisiter_vistor_template_component_widget.dart @@ -10,20 +10,20 @@ import '/custom_code/actions/index.dart' as actions; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; -import 'regisiter_vistor_component_model.dart'; -export 'regisiter_vistor_component_model.dart'; +import 'regisiter_vistor_template_component_model.dart'; +export 'regisiter_vistor_template_component_model.dart'; -class RegisiterVistorComponentWidget extends StatefulWidget { - const RegisiterVistorComponentWidget({super.key}); +class RegisiterVistorTemplateComponentWidget extends StatefulWidget { + const RegisiterVistorTemplateComponentWidget({super.key}); @override - State createState() => - _RegisiterVistorComponentWidgetState(); + State createState() => + _RegisiterVistorTemplateComponentWidgetState(); } -class _RegisiterVistorComponentWidgetState - extends State { - late RegisiterVistorComponentModel _model; +class _RegisiterVistorTemplateComponentWidgetState + extends State { + late RegisiterVistorTemplateComponentModel _model; @override void setState(VoidCallback callback) { @@ -34,7 +34,8 @@ class _RegisiterVistorComponentWidgetState @override void initState() { super.initState(); - _model = createModel(context, () => RegisiterVistorComponentModel()); + _model = + createModel(context, () => RegisiterVistorTemplateComponentModel()); _model.textController1 ??= TextEditingController(); _model.textFieldFocusNode1 ??= FocusNode(); diff --git a/lib/application_pages/login_page/login_page_model.dart b/lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_model.dart similarity index 65% rename from lib/application_pages/login_page/login_page_model.dart rename to lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_model.dart index 92a3fd94..6ef3aefa 100644 --- a/lib/application_pages/login_page/login_page_model.dart +++ b/lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_model.dart @@ -1,12 +1,12 @@ -import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import 'login_page_widget.dart' show LoginPageWidget; +import 'sign_in_template_component_widget.dart' + show SignInTemplateComponentWidget; import 'package:flutter/material.dart'; -class LoginPageModel extends FlutterFlowModel { - /// State fields for stateful widgets in this page. +class SignInTemplateComponentModel + extends FlutterFlowModel { + /// State fields for stateful widgets in this component. - final unfocusNode = FocusNode(); // State field(s) for emailAddress widget. FocusNode? emailAddressFocusNode; TextEditingController? emailAddressTextController; @@ -16,8 +16,6 @@ class LoginPageModel extends FlutterFlowModel { TextEditingController? passwordTextController; late bool passwordVisibility; String? Function(BuildContext, String?)? passwordTextControllerValidator; - // Stores action output result for [Backend Call - API (login)] action in signInButtonLoginForm widget. - ApiCallResponse? smallDisplayApi; @override void initState(BuildContext context) { @@ -26,7 +24,6 @@ class LoginPageModel extends FlutterFlowModel { @override void dispose() { - unfocusNode.dispose(); emailAddressFocusNode?.dispose(); emailAddressTextController?.dispose(); diff --git a/lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart b/lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart new file mode 100644 index 00000000..6f5f0694 --- /dev/null +++ b/lib/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart @@ -0,0 +1,900 @@ +import '/application_components/templates_components/forgot_password_template_component/forgot_password_template_component_widget.dart'; +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'sign_in_template_component_model.dart'; +export 'sign_in_template_component_model.dart'; + +class SignInTemplateComponentWidget extends StatefulWidget { + const SignInTemplateComponentWidget({ + super.key, + required this.toggleOnBoardingPageAction, + }); + + final Future Function(String toggleValueSignInParam)? + toggleOnBoardingPageAction; + + @override + State createState() => + _SignInTemplateComponentWidgetState(); +} + +class _SignInTemplateComponentWidgetState + extends State with TickerProviderStateMixin { + late SignInTemplateComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SignInTemplateComponentModel()); + + _model.emailAddressTextController ??= TextEditingController(); + _model.emailAddressFocusNode ??= FocusNode(); + + _model.passwordTextController ??= TextEditingController(); + _model.passwordFocusNode ??= FocusNode(); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: const BoxDecoration(), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB(0.0, 35.0, 0.0, 35.0), + child: Container( + width: 548.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(0.0, 1.0), + child: Padding( + padding: const EdgeInsets.all(3.0), + child: Text( + FFLocalizations.of(context).getText( + '9hbdjxrz' /* VAMOS LA! ENTRE COM A SUA CONT... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/sr43ucngg4a4/Vector.png', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 34.0, 0.0, 34.0, 0.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: BorderRadius.circular(12.0), + shape: BoxShape.rectangle, + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailAddressTextController, + focusNode: + _model.emailAddressFocusNode, + autofocus: false, + textCapitalization: + TextCapitalization.none, + textInputAction: + TextInputAction.next, + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '1ltg0ylb' /* Email */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: + TextInputType.emailAddress, + validator: _model + .emailAddressTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: + _model.passwordTextController, + focusNode: _model.passwordFocusNode, + autofocus: false, + textInputAction: + TextInputAction.send, + obscureText: + !_model.passwordVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '2x19ce8k' /* Senha */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordVisibility = + !_model + .passwordVisibility, + ), + focusNode: FocusNode( + skipTraversal: true), + child: Icon( + _model.passwordVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordTextControllerValidator + .asValidator(context), + ), + ), + ), + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: ((_model.emailAddressTextController + .text == + '') && + (_model.passwordTextController + .text == + '')) + ? null + : () async { + await action_blocks + .singInActionApp( + context, + emailAdress: _model + .emailAddressTextController + .text, + password: _model + .passwordTextController + .text, + ); + setState(() {}); + }, + text: FFLocalizations.of( + context) + .getText( + 'k44tm7wo' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + color: + FlutterFlowTheme.of( + context) + .primary, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .info, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: + Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + disabledColor: + const Color(0x951AAB5F), + ), + showLoadingIndicator: false, + ), + ), + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignUp', + ); + }, + text: FFLocalizations.of( + context) + .getText( + '14u7ipws' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + color: + FlutterFlowTheme.of( + context) + .customColor1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: + Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB(0.0, 0.0, + 0.0, 16.0), + child: FFButtonWidget( + onPressed: () { + print( + 'signInButtonLoginForm pressed ...'); + }, + text: FFLocalizations.of( + context) + .getText( + '1x926nsn' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + color: + FlutterFlowTheme.of( + context) + .accent1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + Expanded( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB(0.0, 0.0, + 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'RegisterPage'); + }, + text: FFLocalizations.of( + context) + .getText( + 'jwvd4ai1' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + color: + FlutterFlowTheme.of( + context) + .customColor1, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: + 16.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors + .transparent, + width: 1.0, + ), + borderRadius: + BorderRadius + .circular(12.0), + ), + showLoadingIndicator: + false, + ), + ), + ), + ].divide(const SizedBox(width: 7.0)), + ); + } + }, + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: RichText( + textScaler: + MediaQuery.of(context).textScaler, + text: TextSpan( + children: [ + TextSpan( + text: + FFLocalizations.of(context) + .getText( + '05dx91ku' /* Você esqueceu a sua senha? */, + ), + style: TextStyle( + color: FlutterFlowTheme.of( + context) + .primaryText, + ), + ), + TextSpan( + text: + FFLocalizations.of(context) + .getText( + 'p5c6d54y' /* Recupere aqui */, + ), + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme + .of(context) + .primary, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.normal, + useGoogleFonts: + GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + mouseCursor: + SystemMouseCursors.click, + recognizer: + TapGestureRecognizer() + ..onTap = () async { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + Colors + .transparent, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + const ForgotPasswordTemplateComponentWidget(), + ); + }, + ).then((value) => + safeSetState( + () {})); + }, + ) + ], + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Text( + FFLocalizations.of(context).getText( + 'olf967cj' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: + FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_model.dart b/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_model.dart new file mode 100644 index 00000000..8c8d3913 --- /dev/null +++ b/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_model.dart @@ -0,0 +1,45 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'sign_up_template_component_widget.dart' + show SignUpTemplateComponentWidget; +import 'package:flutter/material.dart'; + +class SignUpTemplateComponentModel + extends FlutterFlowModel { + /// State fields for stateful widgets in this component. + + // State field(s) for nameRegisterForm widget. + FocusNode? nameRegisterFormFocusNode; + TextEditingController? nameRegisterFormTextController; + String? Function(BuildContext, String?)? + nameRegisterFormTextControllerValidator; + // State field(s) for emailRegisterForm widget. + FocusNode? emailRegisterFormFocusNode; + TextEditingController? emailRegisterFormTextController; + String? Function(BuildContext, String?)? + emailRegisterFormTextControllerValidator; + // State field(s) for passwordRegisterForm widget. + FocusNode? passwordRegisterFormFocusNode; + TextEditingController? passwordRegisterFormTextController; + late bool passwordRegisterFormVisibility; + String? Function(BuildContext, String?)? + passwordRegisterFormTextControllerValidator; + // Stores action output result for [Action Block - signUpActionApp] action in SignUpButtonRegisterForm widget. + bool? signUp; + + @override + void initState(BuildContext context) { + passwordRegisterFormVisibility = false; + } + + @override + void dispose() { + nameRegisterFormFocusNode?.dispose(); + nameRegisterFormTextController?.dispose(); + + emailRegisterFormFocusNode?.dispose(); + emailRegisterFormTextController?.dispose(); + + passwordRegisterFormFocusNode?.dispose(); + passwordRegisterFormTextController?.dispose(); + } +} diff --git a/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart b/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart new file mode 100644 index 00000000..b3c7d018 --- /dev/null +++ b/lib/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart @@ -0,0 +1,771 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import '/actions/actions.dart' as action_blocks; +import 'package:easy_debounce/easy_debounce.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'sign_up_template_component_model.dart'; +export 'sign_up_template_component_model.dart'; + +class SignUpTemplateComponentWidget extends StatefulWidget { + const SignUpTemplateComponentWidget({ + super.key, + required this.toggleOnBoardingPageAction, + }); + + final Future Function(String toggleValueSignUpParam)? + toggleOnBoardingPageAction; + + @override + State createState() => + _SignUpTemplateComponentWidgetState(); +} + +class _SignUpTemplateComponentWidgetState + extends State with TickerProviderStateMixin { + late SignUpTemplateComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SignUpTemplateComponentModel()); + + _model.nameRegisterFormTextController ??= TextEditingController(); + _model.nameRegisterFormFocusNode ??= FocusNode(); + _model.nameRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.emailRegisterFormTextController ??= TextEditingController(); + _model.emailRegisterFormFocusNode ??= FocusNode(); + _model.emailRegisterFormFocusNode!.addListener(() => setState(() {})); + _model.passwordRegisterFormTextController ??= TextEditingController(); + _model.passwordRegisterFormFocusNode ??= FocusNode(); + _model.passwordRegisterFormFocusNode!.addListener(() => setState(() {})); + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 6, + child: Container( + width: 100.0, + height: double.infinity, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + alignment: const AlignmentDirectional(0.0, -1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + width: 669.0, + height: 112.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + FFLocalizations.of(context).getText( + '49609olv' /* INSIRA SEU EMAIL E SENHA, VAMO... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Container( + width: 291.0, + height: 167.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/ug2zlyhca2sh/Frame_5.svg', + width: 603.0, + height: 155.0, + fit: BoxFit.contain, + ), + ), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .nameRegisterFormTextController, + focusNode: _model + .nameRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.nameRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [AutofillHints.name], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '3corpwhd' /* Nome */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: Icon( + Icons.person, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: TextInputType.name, + validator: _model + .nameRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .emailRegisterFormTextController, + focusNode: _model + .emailRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.emailRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.email + ], + obscureText: false, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '80wonb69' /* Email */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .primaryText, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .success, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: Icon( + Icons.email, + color: + FlutterFlowTheme.of(context) + .accent1, + size: 22.0, + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .customColor1, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + keyboardType: + TextInputType.emailAddress, + validator: _model + .emailRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: _model + .passwordRegisterFormTextController, + focusNode: _model + .passwordRegisterFormFocusNode, + onChanged: (_) => + EasyDebounce.debounce( + '_model.passwordRegisterFormTextController', + const Duration(milliseconds: 2000), + () => setState(() {}), + ), + autofocus: false, + autofillHints: const [ + AutofillHints.password + ], + obscureText: !_model + .passwordRegisterFormVisibility, + decoration: InputDecoration( + labelText: + FFLocalizations.of(context) + .getText( + '0firji8l' /* Senha */, + ), + labelStyle: FlutterFlowTheme.of( + context) + .labelLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: FlutterFlowTheme.of( + context) + .customColor1, + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFF1AAB5F), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: const BorderSide( + color: Color(0xFFFF5963), + width: 0.5, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + filled: true, + fillColor: + FlutterFlowTheme.of(context) + .primaryBackground, + suffixIcon: InkWell( + onTap: () => setState( + () => _model + .passwordRegisterFormVisibility = + !_model + .passwordRegisterFormVisibility, + ), + focusNode: FocusNode( + skipTraversal: true), + child: Icon( + _model.passwordRegisterFormVisibility + ? Icons + .visibility_outlined + : Icons + .visibility_off_outlined, + color: FlutterFlowTheme.of( + context) + .accent1, + size: 24.0, + ), + ), + ), + style: FlutterFlowTheme.of(context) + .bodyLarge + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + validator: _model + .passwordRegisterFormTextControllerValidator + .asValidator(context), + ), + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + var shouldSetState = false; + _model.signUp = await action_blocks + .signUpActionApp( + context, + name: _model + .nameRegisterFormTextController + .text, + passwd: _model + .passwordRegisterFormTextController + .text, + email: _model + .emailRegisterFormTextController + .text, + device: FFAppState().device, + ); + shouldSetState = true; + if (_model.signUp == true) { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignIn', + ); + } else { + if (shouldSetState) { + setState(() {}); + } + return; + } + + if (shouldSetState) { + setState(() {}); + } + }, + text: FFLocalizations.of(context) + .getText( + 'rnvdwzei' /* Cadastrar-se */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context) + .accent1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + + // You will have to add an action on this rich text to go to your login page. + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 12.0, 0.0, 12.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget + .toggleOnBoardingPageAction + ?.call( + 'SignIn', + ); + }, + child: RichText( + textScaler: MediaQuery.of(context) + .textScaler, + text: TextSpan( + children: [ + TextSpan( + text: FFLocalizations.of( + context) + .getText( + 'a9smhn5b' /* Você já tem uma conta? */, + ), + style: TextStyle( + color: FlutterFlowTheme.of( + context) + .primaryText, + ), + ), + TextSpan( + text: FFLocalizations.of( + context) + .getText( + '09xv5ctc' /* Clique aqui */, + ), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of( + context) + .primary, + fontSize: 14.0, + letterSpacing: 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + ) + ], + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + Text( + FFLocalizations.of(context).getText( + 'huygnka2' /* Termo de Uso */, + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + color: FlutterFlowTheme.of(context).secondaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ], + ), + ), + ), + ), + ), + ], + ); + } +} diff --git a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart b/lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_model.dart similarity index 81% rename from lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart rename to lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_model.dart index af6db9a6..f5e51c3f 100644 --- a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_model.dart +++ b/lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_model.dart @@ -1,10 +1,12 @@ import '/application_components/organism_components/schedule_visit_detail/schedule_visit_detail_widget.dart'; import '/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import 'visit_details_modal_widget.dart' show VisitDetailsModalWidget; +import 'visit_details_modal_template_component_widget.dart' + show VisitDetailsModalTemplateComponentWidget; import 'package:flutter/material.dart'; -class VisitDetailsModalModel extends FlutterFlowModel { +class VisitDetailsModalTemplateComponentModel + extends FlutterFlowModel { /// Local state fields for this component. Color statusColor = const Color(0xff000000); diff --git a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart b/lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart similarity index 82% rename from lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart rename to lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart index 1e2dca21..7fca9963 100644 --- a/lib/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart +++ b/lib/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart @@ -2,11 +2,11 @@ import '/application_components/organism_components/schedule_visit_detail/schedu import '/application_components/organism_components/view_visit_detail/view_visit_detail_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'package:flutter/material.dart'; -import 'visit_details_modal_model.dart'; -export 'visit_details_modal_model.dart'; +import 'visit_details_modal_template_component_model.dart'; +export 'visit_details_modal_template_component_model.dart'; -class VisitDetailsModalWidget extends StatefulWidget { - const VisitDetailsModalWidget({ +class VisitDetailsModalTemplateComponentWidget extends StatefulWidget { + const VisitDetailsModalTemplateComponentWidget({ super.key, this.visitStatusStr, this.visitStartDateStr, @@ -40,12 +40,13 @@ class VisitDetailsModalWidget extends StatefulWidget { final Future Function()? repeatVisitSchedule; @override - State createState() => - _VisitDetailsModalWidgetState(); + State createState() => + _VisitDetailsModalTemplateComponentWidgetState(); } -class _VisitDetailsModalWidgetState extends State { - late VisitDetailsModalModel _model; +class _VisitDetailsModalTemplateComponentWidgetState + extends State { + late VisitDetailsModalTemplateComponentModel _model; @override void setState(VoidCallback callback) { @@ -56,7 +57,8 @@ class _VisitDetailsModalWidgetState extends State { @override void initState() { super.initState(); - _model = createModel(context, () => VisitDetailsModalModel()); + _model = + createModel(context, () => VisitDetailsModalTemplateComponentModel()); } @override @@ -89,12 +91,6 @@ class _VisitDetailsModalWidgetState extends State { visitorStrList: widget.visitorStrList!, visitorJsonList: widget.visitorJsonList, visitIdStr: widget.visitIdStr!, - updateToggleIdx: () async { - await widget.updateToggleIdx?.call(); - }, - repeatVisitScheduleActionBlock: () async { - await widget.repeatVisitSchedule?.call(); - }, ), ); } else { diff --git a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart b/lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_model.dart similarity index 86% rename from lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart rename to lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_model.dart index 19e2c235..63da16d2 100644 --- a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_model.dart +++ b/lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_model.dart @@ -1,10 +1,11 @@ import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; -import 'visitor_search_component_widget.dart' show VisitorSearchComponentWidget; +import 'visitor_search_modal_template_component_widget.dart' + show VisitorSearchModalTemplateComponentWidget; import 'package:flutter/material.dart'; -class VisitorSearchComponentModel - extends FlutterFlowModel { +class VisitorSearchModalTemplateComponentModel + extends FlutterFlowModel { /// Local state fields for this component. List visitors = []; diff --git a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart b/lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart similarity index 91% rename from lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart rename to lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart index 15cd8948..6986bf32 100644 --- a/lib/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart +++ b/lib/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart @@ -1,18 +1,19 @@ import '/application_components/molecular_components/visitor_not_found_component/visitor_not_found_component_widget.dart'; -import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart'; +import '/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart'; import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; -import 'visitor_search_component_model.dart'; -export 'visitor_search_component_model.dart'; +import 'visitor_search_modal_template_component_model.dart'; +export 'visitor_search_modal_template_component_model.dart'; -class VisitorSearchComponentWidget extends StatefulWidget { - const VisitorSearchComponentWidget({ +class VisitorSearchModalTemplateComponentWidget extends StatefulWidget { + const VisitorSearchModalTemplateComponentWidget({ super.key, this.getVisitors, this.getDocs, @@ -22,13 +23,14 @@ class VisitorSearchComponentWidget extends StatefulWidget { final Future Function(List? docsParam)? getDocs; @override - State createState() => - _VisitorSearchComponentWidgetState(); + State createState() => + _VisitorSearchModalTemplateComponentWidgetState(); } -class _VisitorSearchComponentWidgetState - extends State with TickerProviderStateMixin { - late VisitorSearchComponentModel _model; +class _VisitorSearchModalTemplateComponentWidgetState + extends State + with TickerProviderStateMixin { + late VisitorSearchModalTemplateComponentModel _model; @override void setState(VoidCallback callback) { @@ -39,7 +41,8 @@ class _VisitorSearchComponentWidgetState @override void initState() { super.initState(); - _model = createModel(context, () => VisitorSearchComponentModel()); + _model = + createModel(context, () => VisitorSearchModalTemplateComponentModel()); _model.textController ??= TextEditingController(); _model.textFieldFocusNode ??= FocusNode(); @@ -292,7 +295,7 @@ class _VisitorSearchComponentWidgetState child: const SizedBox( height: 610.0, child: - VisitorDetailsModalWidget(), + VisitorDetailsModalTemplateComponentWidget(), ), ); }, @@ -325,8 +328,19 @@ class _VisitorSearchComponentWidgetState ClipRRect( borderRadius: BorderRadius.circular(40.0), - child: Image.asset( - 'assets/images/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + child: CachedNetworkImage( + fadeInDuration: + const Duration(milliseconds: 500), + fadeOutDuration: + const Duration(milliseconds: 500), + imageUrl: + valueOrDefault( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitorItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), width: 60.0, height: 60.0, fit: BoxFit.cover, @@ -501,8 +515,8 @@ class _VisitorSearchComponentWidgetState borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(0.0), bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(15.0), - topRight: Radius.circular(15.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(0.0), ), ), ), diff --git a/lib/application_components/templates_components/welcome_template_component/welcome_template_component_model.dart b/lib/application_components/templates_components/welcome_template_component/welcome_template_component_model.dart new file mode 100644 index 00000000..17ea3047 --- /dev/null +++ b/lib/application_components/templates_components/welcome_template_component/welcome_template_component_model.dart @@ -0,0 +1,13 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'welcome_template_component_widget.dart' + show WelcomeTemplateComponentWidget; +import 'package:flutter/material.dart'; + +class WelcomeTemplateComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart b/lib/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart new file mode 100644 index 00000000..46752f7d --- /dev/null +++ b/lib/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart @@ -0,0 +1,458 @@ +import '/flutter_flow/flutter_flow_animations.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'welcome_template_component_model.dart'; +export 'welcome_template_component_model.dart'; + +class WelcomeTemplateComponentWidget extends StatefulWidget { + const WelcomeTemplateComponentWidget({ + super.key, + required this.toggleOnboardingPageAction, + }); + + final Future Function(String toggleValueWelcomeParam)? + toggleOnboardingPageAction; + + @override + State createState() => + _WelcomeTemplateComponentWidgetState(); +} + +class _WelcomeTemplateComponentWidgetState + extends State + with TickerProviderStateMixin { + late WelcomeTemplateComponentModel _model; + + final animationsMap = {}; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => WelcomeTemplateComponentModel()); + + animationsMap.addAll({ + 'containerOnPageLoadAnimation': AnimationInfo( + trigger: AnimationTrigger.onPageLoad, + effectsBuilder: () => [ + VisibilityEffect(duration: 1.ms), + FadeEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: 0.0, + end: 1.0, + ), + MoveEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.0, 140.0), + end: const Offset(0.0, 0.0), + ), + ScaleEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(0.9, 0.9), + end: const Offset(1.0, 1.0), + ), + TiltEffect( + curve: Curves.easeInOut, + delay: 0.0.ms, + duration: 300.0.ms, + begin: const Offset(-0.349, 0), + end: const Offset(0, 0), + ), + ], + ), + }); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: SafeArea( + child: Container( + width: 648.0, + height: 208.0, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(14.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + FFLocalizations.of(context).getText( + 'dsc9tuc8' /* UMA EXPERIÊCIA COMPLETA */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context).accent1, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Text( + FFLocalizations.of(context).getText( + '5bgqn16z' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, + ), + textAlign: TextAlign.start, + style: FlutterFlowTheme.of(context) + .displaySmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 15.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w600, + useGoogleFonts: GoogleFonts.asMap() + .containsKey('Plus Jakarta Sans'), + ), + ), + ), + ], + ), + ), + ), + ), + ), + ), + Container( + width: 284.0, + height: 200.0, + decoration: const BoxDecoration(), + child: ClipRRect( + borderRadius: BorderRadius.circular(0.0), + child: SvgPicture.network( + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/lv1waa0etd3j/undraw_appreciate_it_re_yc8h_(1)_1.svg', + width: 603.0, + height: double.infinity, + fit: BoxFit.contain, + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(34.0), + child: Container( + width: double.infinity, + constraints: const BoxConstraints( + maxWidth: 570.0, + ), + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + blurRadius: 0.0, + color: Colors.transparent, + offset: Offset( + 0.0, + 0.0, + ), + ) + ], + borderRadius: BorderRadius.circular(12.0), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(32.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Builder( + builder: (context) { + if (MediaQuery.sizeOf(context).width < + kBreakpointSmall + ? true + : false) { + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnboardingPageAction + ?.call( + 'SignIn', + ); + }, + text: + FFLocalizations.of(context).getText( + 'dynet730' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of(context) + .info, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + await widget + .toggleOnboardingPageAction + ?.call( + 'SignUp', + ); + }, + text: + FFLocalizations.of(context).getText( + 'hha60cg7' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context) + .customColor1, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: 'Plus Jakarta Sans', + color: + FlutterFlowTheme.of(context) + .customColor3, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ], + ); + } else { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed( + 'LoginPage', + queryParameters: { + 'device': serializeParam( + '', + ParamType.String, + ), + }.withoutNulls, + ); + }, + text: FFLocalizations.of(context) + .getText( + 'zvtay8ee' /* Entrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 16.0), + child: FFButtonWidget( + onPressed: () async { + context.pushNamed('RegisterPage'); + }, + text: FFLocalizations.of(context) + .getText( + 'o6zob50a' /* Cadastrar */, + ), + options: FFButtonOptions( + width: double.infinity, + height: 44.0, + padding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), + color: FlutterFlowTheme.of(context) + .primary, + textStyle: FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .secondaryText, + fontSize: 16.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), + elevation: 3.0, + borderSide: const BorderSide( + color: Colors.transparent, + width: 1.0, + ), + borderRadius: + BorderRadius.circular(12.0), + ), + showLoadingIndicator: false, + ), + ), + ), + ].divide(const SizedBox(width: 7.0)), + ); + } + }, + ), + ], + ), + ), + ), + ).animateOnPageLoad( + animationsMap['containerOnPageLoadAnimation']!), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_model.dart b/lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_model.dart new file mode 100644 index 00000000..d0f79706 --- /dev/null +++ b/lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_model.dart @@ -0,0 +1,13 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'visitor_details_modal_template_component_widget.dart' + show VisitorDetailsModalTemplateComponentWidget; +import 'package:flutter/material.dart'; + +class VisitorDetailsModalTemplateComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart b/lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart similarity index 95% rename from lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart rename to lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart index bb280e11..5f29a6fe 100644 --- a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart +++ b/lib/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart @@ -2,19 +2,20 @@ import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'visitor_details_modal_model.dart'; -export 'visitor_details_modal_model.dart'; +import 'visitor_details_modal_template_component_model.dart'; +export 'visitor_details_modal_template_component_model.dart'; -class VisitorDetailsModalWidget extends StatefulWidget { - const VisitorDetailsModalWidget({super.key}); +class VisitorDetailsModalTemplateComponentWidget extends StatefulWidget { + const VisitorDetailsModalTemplateComponentWidget({super.key}); @override - State createState() => - _VisitorDetailsModalWidgetState(); + State createState() => + _VisitorDetailsModalTemplateComponentWidgetState(); } -class _VisitorDetailsModalWidgetState extends State { - late VisitorDetailsModalModel _model; +class _VisitorDetailsModalTemplateComponentWidgetState + extends State { + late VisitorDetailsModalTemplateComponentModel _model; @override void setState(VoidCallback callback) { @@ -25,7 +26,8 @@ class _VisitorDetailsModalWidgetState extends State { @override void initState() { super.initState(); - _model = createModel(context, () => VisitorDetailsModalModel()); + _model = + createModel(context, () => VisitorDetailsModalTemplateComponentModel()); } @override diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_model.dart b/lib/application_pages/fast_pass_page/fast_pass_page_model.dart new file mode 100644 index 00000000..2b4d9d53 --- /dev/null +++ b/lib/application_pages/fast_pass_page/fast_pass_page_model.dart @@ -0,0 +1,17 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'fast_pass_page_widget.dart' show FastPassPageWidget; +import 'package:flutter/material.dart'; + +class FastPassPageModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + unfocusNode.dispose(); + } +} diff --git a/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart b/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart new file mode 100644 index 00000000..5edf4ae4 --- /dev/null +++ b/lib/application_pages/fast_pass_page/fast_pass_page_widget.dart @@ -0,0 +1,44 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'package:flutter/material.dart'; +import 'fast_pass_page_model.dart'; +export 'fast_pass_page_model.dart'; + +class FastPassPageWidget extends StatefulWidget { + const FastPassPageWidget({super.key}); + + @override + State createState() => _FastPassPageWidgetState(); +} + +class _FastPassPageWidgetState extends State { + late FastPassPageModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => FastPassPageModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + ), + ); + } +} diff --git a/lib/application_pages/home_page/home_page_model.dart b/lib/application_pages/home_page/home_page_model.dart index ca2e9e8b..2a5a4f54 100644 --- a/lib/application_pages/home_page/home_page_model.dart +++ b/lib/application_pages/home_page/home_page_model.dart @@ -1,6 +1,6 @@ import '/application_components/organism_components/local_profile_component/local_profile_component_widget.dart'; -import '/application_components/templates_components/menu_component/menu_component_widget.dart'; -import '/application_components/templates_components/message_well_component/message_well_component_widget.dart'; +import '/application_components/organism_components/menu_component/menu_component_widget.dart'; +import '/application_components/organism_components/message_well_component/message_well_component_widget.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'home_page_widget.dart' show HomePageWidget; import 'package:flutter/material.dart'; diff --git a/lib/application_pages/home_page/home_page_widget.dart b/lib/application_pages/home_page/home_page_widget.dart index 592e11b6..a12835d8 100644 --- a/lib/application_pages/home_page/home_page_widget.dart +++ b/lib/application_pages/home_page/home_page_widget.dart @@ -1,7 +1,7 @@ import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import '/application_components/organism_components/local_profile_component/local_profile_component_widget.dart'; -import '/application_components/templates_components/menu_component/menu_component_widget.dart'; -import '/application_components/templates_components/message_well_component/message_well_component_widget.dart'; +import '/application_components/organism_components/menu_component/menu_component_widget.dart'; +import '/application_components/organism_components/message_well_component/message_well_component_widget.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; @@ -14,14 +14,7 @@ import 'home_page_model.dart'; export 'home_page_model.dart'; class HomePageWidget extends StatefulWidget { - const HomePageWidget({ - super.key, - required this.userUUID, - required this.devUUID, - }); - - final String? userUUID; - final String? devUUID; + const HomePageWidget({super.key}); @override State createState() => _HomePageWidgetState(); @@ -836,7 +829,16 @@ class _HomePageWidgetState extends State { FFAppState().isLogged = false; setState(() {}); - context.pushNamed('WelcomePage'); + context.goNamed( + 'onBoardingPage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.scale, + alignment: Alignment.bottomCenter, + ), + }, + ); }, text: FFLocalizations.of(context).getText( 'xx0db4wi' /* Sair */, @@ -844,7 +846,7 @@ class _HomePageWidgetState extends State { options: FFButtonOptions( height: 40.0, padding: const EdgeInsetsDirectional.fromSTEB( - 24.0, 0.0, 24.0, 0.0), + 0.0, 0.0, 0.0, 0.0), iconPadding: const EdgeInsetsDirectional.fromSTEB( 0.0, 0.0, 0.0, 0.0), color: const Color(0x00D70000), @@ -898,7 +900,7 @@ class _HomePageWidgetState extends State { Expanded( child: Container( width: 100.0, - height: 120.0, + height: 100.0, decoration: const BoxDecoration( color: Color(0xFF1AAB5F), ), @@ -907,8 +909,9 @@ class _HomePageWidgetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Align( - alignment: const AlignmentDirectional(0.0, 0.0), + alignment: const AlignmentDirectional(0.0, 1.0), child: Container( + height: 50.0, decoration: const BoxDecoration(), child: Align( alignment: const AlignmentDirectional(0.0, 0.0), @@ -932,7 +935,7 @@ class _HomePageWidgetState extends State { icon: const Icon( Icons.menu_rounded, color: Colors.white, - size: 34.0, + size: 28.0, ), onPressed: () async { scaffoldKey.currentState! @@ -999,10 +1002,30 @@ class _HomePageWidgetState extends State { ), ), ), - Container( - width: 100.0, - height: 100.0, - decoration: const BoxDecoration(), + Align( + alignment: const AlignmentDirectional(0.0, 1.0), + child: Container( + width: 100.0, + height: 50.0, + decoration: const BoxDecoration(), + child: Align( + alignment: const AlignmentDirectional(1.0, 1.0), + child: FlutterFlowIconButton( + borderRadius: 20.0, + borderWidth: 1.0, + buttonSize: 40.0, + icon: Icon( + Icons.notifications_sharp, + color: + FlutterFlowTheme.of(context).info, + size: 24.0, + ), + onPressed: () { + print('IconButton pressed ...'); + }, + ), + ), + ), ), ], ), diff --git a/lib/application_pages/on_boarding_page/on_boarding_page_model.dart b/lib/application_pages/on_boarding_page/on_boarding_page_model.dart new file mode 100644 index 00000000..4ac25c63 --- /dev/null +++ b/lib/application_pages/on_boarding_page/on_boarding_page_model.dart @@ -0,0 +1,48 @@ +import '/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart'; +import '/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart'; +import '/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'on_boarding_page_widget.dart' show OnBoardingPageWidget; +import 'package:flutter/material.dart'; + +class OnBoardingPageModel extends FlutterFlowModel { + /// Local state fields for this page. + + String toggleIdx = 'welcome'; + + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // Model for signInTemplateComponent component. + late SignInTemplateComponentModel signInTemplateComponentModel; + // Model for signUpTemplateComponent component. + late SignUpTemplateComponentModel signUpTemplateComponentModel; + // Model for welcomeTemplateComponent component. + late WelcomeTemplateComponentModel welcomeTemplateComponentModel; + + @override + void initState(BuildContext context) { + signInTemplateComponentModel = + createModel(context, () => SignInTemplateComponentModel()); + signUpTemplateComponentModel = + createModel(context, () => SignUpTemplateComponentModel()); + welcomeTemplateComponentModel = + createModel(context, () => WelcomeTemplateComponentModel()); + } + + @override + void dispose() { + unfocusNode.dispose(); + signInTemplateComponentModel.dispose(); + signUpTemplateComponentModel.dispose(); + welcomeTemplateComponentModel.dispose(); + } + + /// Action blocks. + Future toggleOnBoardingActionPage( + BuildContext context, { + required String? toggleValue, + }) async { + toggleIdx = toggleValue!; + } +} diff --git a/lib/application_pages/on_boarding_page/on_boarding_page_widget.dart b/lib/application_pages/on_boarding_page/on_boarding_page_widget.dart new file mode 100644 index 00000000..77148819 --- /dev/null +++ b/lib/application_pages/on_boarding_page/on_boarding_page_widget.dart @@ -0,0 +1,131 @@ +import '/application_components/templates_components/sign_in_template_component/sign_in_template_component_widget.dart'; +import '/application_components/templates_components/sign_up_template_component/sign_up_template_component_widget.dart'; +import '/application_components/templates_components/welcome_template_component/welcome_template_component_widget.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; +import 'package:provider/provider.dart'; +import 'on_boarding_page_model.dart'; +export 'on_boarding_page_model.dart'; + +class OnBoardingPageWidget extends StatefulWidget { + const OnBoardingPageWidget({super.key}); + + @override + State createState() => _OnBoardingPageWidgetState(); +} + +class _OnBoardingPageWidgetState extends State { + late OnBoardingPageModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => OnBoardingPageModel()); + + // On page load action. + SchedulerBinding.instance.addPostFrameCallback((_) async { + if (FFAppState().isLogged == true) { + context.pushNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + duration: Duration(milliseconds: 0), + ), + }, + ); + } else { + if (isAndroid == true) { + FFAppState().device = 'Android'; + setState(() {}); + } else if (isiOS == true) { + FFAppState().device = 'iOS'; + setState(() {}); + } else { + FFAppState().device = 'Web'; + setState(() {}); + } + } + }); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return GestureDetector( + onTap: () => _model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + body: SafeArea( + top: true, + child: Stack( + children: [ + if (_model.toggleIdx == 'SignIn') + wrapWithModel( + model: _model.signInTemplateComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: SignInTemplateComponentWidget( + toggleOnBoardingPageAction: (toggleValueSignInParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueSignInParam, + ); + setState(() {}); + }, + ), + ), + if (_model.toggleIdx == 'SignUp') + wrapWithModel( + model: _model.signUpTemplateComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: SignUpTemplateComponentWidget( + toggleOnBoardingPageAction: (toggleValueSignUpParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueSignUpParam, + ); + setState(() {}); + }, + ), + ), + if (_model.toggleIdx == 'welcome') + wrapWithModel( + model: _model.welcomeTemplateComponentModel, + updateCallback: () => setState(() {}), + updateOnChange: true, + child: WelcomeTemplateComponentWidget( + toggleOnboardingPageAction: + (toggleValueWelcomeParam) async { + await _model.toggleOnBoardingActionPage( + context, + toggleValue: toggleValueWelcomeParam, + ); + setState(() {}); + }, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/application_pages/people_on_the_property_page/people_on_the_property_page_model.dart b/lib/application_pages/people_on_the_property_page/people_on_the_property_page_model.dart new file mode 100644 index 00000000..28f33c72 --- /dev/null +++ b/lib/application_pages/people_on_the_property_page/people_on_the_property_page_model.dart @@ -0,0 +1,23 @@ +import '/flutter_flow/flutter_flow_data_table.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'people_on_the_property_page_widget.dart' + show PeopleOnThePropertyPageWidget; +import 'package:flutter/material.dart'; + +class PeopleOnThePropertyPageModel + extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // State field(s) for PaginatedDataTable widget. + final paginatedDataTableController = + FlutterFlowDataTableController(); + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + unfocusNode.dispose(); + } +} diff --git a/lib/application_pages/people_on_the_property_page/people_on_the_property_page_widget.dart b/lib/application_pages/people_on_the_property_page/people_on_the_property_page_widget.dart new file mode 100644 index 00000000..65489440 --- /dev/null +++ b/lib/application_pages/people_on_the_property_page/people_on_the_property_page_widget.dart @@ -0,0 +1,289 @@ +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_data_table.dart'; +import '/flutter_flow/flutter_flow_icon_button.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'people_on_the_property_page_model.dart'; +export 'people_on_the_property_page_model.dart'; + +class PeopleOnThePropertyPageWidget extends StatefulWidget { + const PeopleOnThePropertyPageWidget({super.key}); + + @override + State createState() => + _PeopleOnThePropertyPageWidgetState(); +} + +class _PeopleOnThePropertyPageWidgetState + extends State { + late PeopleOnThePropertyPageModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => PeopleOnThePropertyPageModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return GestureDetector( + onTap: () => _model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + appBar: AppBar( + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + automaticallyImplyLeading: false, + leading: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 60.0, + icon: Icon( + Icons.keyboard_arrow_left, + color: FlutterFlowTheme.of(context).primaryText, + size: 30.0, + ), + onPressed: () async { + context.pop(); + }, + ), + title: Text( + FFLocalizations.of(context).getText( + 'nsu13r5d' /* Pessoas na Propriedade */, + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 15.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + actions: const [], + centerTitle: true, + ), + body: SafeArea( + top: true, + child: FutureBuilder( + future: PhpGroup.getPessoasLocalCall.call( + cliID: FFAppState().cliUUID, + ownID: FFAppState().ownerUUID, + devUUID: FFAppState().devUUID, + userUUID: FFAppState().userUUID, + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme.of(context).primary, + size: 50.0, + ), + ), + ); + } + final columnGetPessoasLocalResponse = snapshot.data!; + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Builder( + builder: (context) { + final getPessoaLocal = PhpGroup.getPessoasLocalCall + .pessoas( + columnGetPessoasLocalResponse.jsonBody, + ) + ?.toList() ?? + []; + return FlutterFlowDataTable( + controller: _model.paginatedDataTableController, + data: getPessoaLocal, + columnsBuilder: (onSortChanged) => [ + DataColumn2( + label: DefaultTextStyle.merge( + softWrap: true, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + FFLocalizations.of(context).getText( + 'omjuk919' /* Foto */, + ), + textAlign: TextAlign.center, + style: FlutterFlowTheme.of(context) + .labelLarge + .override( + fontFamily: + FlutterFlowTheme.of(context) + .labelLargeFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .labelLargeFamily), + ), + ), + ], + ), + ), + ), + DataColumn2( + label: DefaultTextStyle.merge( + softWrap: true, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + FFLocalizations.of(context).getText( + 'fli7tpz6' /* Nome */, + ), + style: FlutterFlowTheme.of(context) + .labelLarge + .override( + fontFamily: + FlutterFlowTheme.of(context) + .labelLargeFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .labelLargeFamily), + ), + ), + ], + ), + ), + ), + ], + dataRowBuilder: (getPessoaLocalItem, + getPessoaLocalIndex, + selected, + onSelectChanged) => + DataRow( + color: MaterialStateProperty.all( + getPessoaLocalIndex % 2 == 0 + ? FlutterFlowTheme.of(context) + .primaryBackground + : FlutterFlowTheme.of(context) + .primaryBackground, + ), + cells: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + width: 100.0, + height: 100.0, + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration( + shape: BoxShape.circle, + ), + child: CachedNetworkImage( + fadeInDuration: + const Duration(milliseconds: 500), + fadeOutDuration: + const Duration(milliseconds: 500), + imageUrl: valueOrDefault( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=&tipo=E&Email=${getJsonField( + getPessoaLocalItem, + r'''$.USU_EMAIL''', + ).toString()}', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + fit: BoxFit.cover, + ), + ), + ), + ], + ), + Container( + width: 500.0, + height: 21.0, + decoration: const BoxDecoration(), + alignment: const AlignmentDirectional(-1.0, 0.0), + child: Text( + getJsonField( + getPessoaLocalItem, + r'''$.USU_NOME''', + ).toString(), + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ].map((c) => DataCell(c)).toList(), + ), + paginated: true, + selectable: false, + hidePaginator: false, + showFirstLastButtons: false, + width: MediaQuery.sizeOf(context).width * 1.0, + height: MediaQuery.sizeOf(context).height * 1.0, + headingRowHeight: 56.0, + dataRowHeight: 48.0, + columnSpacing: 20.0, + headingRowColor: + FlutterFlowTheme.of(context).primaryBackground, + borderRadius: BorderRadius.circular(0.0), + addHorizontalDivider: true, + addTopAndBottomDivider: true, + hideDefaultHorizontalDivider: false, + horizontalDividerColor: + FlutterFlowTheme.of(context).customColor5, + horizontalDividerThickness: 0.3, + addVerticalDivider: false, + ); + }, + ), + ), + ], + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart index bd438bfb..cb72f361 100644 --- a/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart +++ b/lib/application_pages/register_visitor_page/register_visitor_page_widget.dart @@ -14,14 +14,7 @@ import 'register_visitor_page_model.dart'; export 'register_visitor_page_model.dart'; class RegisterVisitorPageWidget extends StatefulWidget { - const RegisterVisitorPageWidget({ - super.key, - required this.userUUID, - required this.devUUID, - }); - - final String? userUUID; - final String? devUUID; + const RegisterVisitorPageWidget({super.key}); @override State createState() => diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart index e3316b73..e5ef085f 100644 --- a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart +++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_model.dart @@ -2,15 +2,12 @@ import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/form_field_controller.dart'; import 'schedule_complete_visit_page_widget.dart' show ScheduleCompleteVisitPageWidget; -import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; class ScheduleCompleteVisitPageModel extends FlutterFlowModel { /// Local state fields for this page. - bool toggleIdx = true; - List visitorJsonList = []; void addToVisitorJsonList(dynamic item) => visitorJsonList.add(item); void removeFromVisitorJsonList(dynamic item) => visitorJsonList.remove(item); @@ -26,10 +23,10 @@ class ScheduleCompleteVisitPageModel /// State fields for stateful widgets in this page. final unfocusNode = FocusNode(); - // State field(s) for Carousel widget. - CarouselController? carouselController; - - int carouselCurrentIndex = 1; + // State field(s) for TabBar widget. + TabController? tabBarController; + int get tabBarCurrentIndex => + tabBarController != null ? tabBarController!.index : 0; // State field(s) for TextField widget. FocusNode? textFieldFocusNode1; @@ -60,6 +57,7 @@ class ScheduleCompleteVisitPageModel @override void dispose() { unfocusNode.dispose(); + tabBarController?.dispose(); textFieldFocusNode1?.dispose(); textController1?.dispose(); @@ -69,4 +67,23 @@ class ScheduleCompleteVisitPageModel textFieldFocusNode3?.dispose(); textController3?.dispose(); } + + /// Action blocks. + Future getVisitorsActionPage( + BuildContext context, { + List? visitorsJsonList, + }) async { + visitorJsonList = visitorsJsonList!.toList().cast(); + } + + Future toggleCurrentSelectionHeader( + BuildContext context, { + required bool? toggleIndexValue, + }) async { + if (toggleIndexValue == true) { + return true; + } + + return false; + } } diff --git a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart index 52258ac8..a44e56d9 100644 --- a/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart +++ b/lib/application_pages/schedule_complete_visit_page/schedule_complete_visit_page_widget.dart @@ -1,8 +1,8 @@ import '/application_components/molecular_components/opt_modal/opt_modal_widget.dart'; import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/application_components/templates_components/visit_details_modal/visit_details_modal_widget.dart'; -import '/application_components/templates_components/visitor_details_modal/visitor_details_modal_widget.dart'; -import '/application_components/templates_components/visitor_search_component/visitor_search_component_widget.dart'; +import '/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart'; +import '/application_components/templates_components/visitor_search_modal_template_component/visitor_search_modal_template_component_widget.dart'; +import '/application_components/visitor_details_modal_template_component/visitor_details_modal_template_component_widget.dart'; import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_drop_down.dart'; import '/flutter_flow/flutter_flow_icon_button.dart'; @@ -11,8 +11,8 @@ import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; import '/flutter_flow/form_field_controller.dart'; import '/flutter_flow/custom_functions.dart' as functions; +import 'package:auto_size_text/auto_size_text.dart'; import 'package:cached_network_image/cached_network_image.dart'; -import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; @@ -49,7 +49,8 @@ class ScheduleCompleteVisitPageWidget extends StatefulWidget { } class _ScheduleCompleteVisitPageWidgetState - extends State { + extends State + with TickerProviderStateMixin { late ScheduleCompleteVisitPageModel _model; final scaffoldKey = GlobalKey(); @@ -82,16 +83,18 @@ class _ScheduleCompleteVisitPageWidgetState } }); - _model.textController1 ??= TextEditingController( - text: widget.visitStartDateStr != null && widget.visitStartDateStr != '' - ? widget.visitStartDateStr - : ''); + _model.tabBarController = TabController( + vsync: this, + length: 2, + initialIndex: 0, + )..addListener(() => setState(() {})); + _model.textController1 ??= TextEditingController(); _model.textFieldFocusNode1 ??= FocusNode(); _model.textController2 ??= TextEditingController(); _model.textFieldFocusNode2 ??= FocusNode(); - _model.switchValue = false; + _model.switchValue = true; _model.textController3 ??= TextEditingController(); _model.textFieldFocusNode3 ??= FocusNode(); } @@ -114,1478 +117,113 @@ class _ScheduleCompleteVisitPageWidgetState child: Scaffold( key: scaffoldKey, backgroundColor: FlutterFlowTheme.of(context).primaryBackground, - body: SingleChildScrollView( + appBar: AppBar( + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + automaticallyImplyLeading: false, + leading: FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 30.0, + borderWidth: 1.0, + buttonSize: 60.0, + icon: Icon( + Icons.keyboard_arrow_left, + color: FlutterFlowTheme.of(context).primaryText, + size: 30.0, + ), + onPressed: () async { + context.pop(); + }, + ), + title: Text( + FFLocalizations.of(context).getText( + '61lcxdgm' /* Agendar Visita */, + ), + style: FlutterFlowTheme.of(context).headlineMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 15.0, + letterSpacing: 0.0, + fontWeight: FontWeight.bold, + useGoogleFonts: GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + actions: const [], + centerTitle: true, + ), + body: SafeArea( + top: true, child: Column( - mainAxisSize: MainAxisSize.max, children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB(0.0, 30.0, 0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - _model.toggleIdx = true; - setState(() {}); - }, - child: Container( - width: 100.0, - height: 40.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(100.0), - topLeft: Radius.circular(0.0), - topRight: Radius.circular(100.0), - ), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'e4w9lbke' /* Criar Agendamento */, - ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: FlutterFlowTheme.of(context).info, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ), + Align( + alignment: const Alignment(0.0, 0), + child: TabBar( + labelColor: FlutterFlowTheme.of(context).primaryText, + unselectedLabelColor: + FlutterFlowTheme.of(context).primaryText, + labelStyle: FlutterFlowTheme.of(context).titleMedium.override( + fontFamily: + FlutterFlowTheme.of(context).titleMediumFamily, + fontSize: 13.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context).titleMediumFamily), + ), + unselectedLabelStyle: const TextStyle(), + indicatorColor: FlutterFlowTheme.of(context).primary, + padding: const EdgeInsets.all(4.0), + tabs: [ + Tab( + text: FFLocalizations.of(context).getText( + 'ueth1f4g' /* Cadastrar Visita */, ), ), - Expanded( - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - _model.toggleIdx = false; - setState(() {}); - }, - child: Container( - width: 100.0, - height: 40.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(100.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(100.0), - topRight: Radius.circular(0.0), - ), - ), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - '47bsumoy' /* Histórico de Visitas */, - ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: FlutterFlowTheme.of(context).info, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts.asMap() - .containsKey( - FlutterFlowTheme.of(context) - .bodyMediumFamily), - ), - ), - ), - ), + Tab( + text: FFLocalizations.of(context).getText( + 'k4uraqam' /* Histórico de Visitas */, ), ), ], + controller: _model.tabBarController, + onTap: (i) async { + [() async {}, () async {}][i](); + }, ), ), - Builder( - builder: (context) { - if (_model.toggleIdx == true) { - return Column( - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 0.0, 10.0, 0.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.center, + Expanded( + child: TabBarView( + controller: _model.tabBarController, + children: [ + SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( children: [ - Align( - alignment: const AlignmentDirectional(-1.0, -1.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 20.0, 0.0, 20.0), - child: Text( - FFLocalizations.of(context).getText( - '15ekd1ge' /* Agendar Visita */, - ), - style: FlutterFlowTheme.of(context) - .bodyLarge - .override( - fontFamily: 'Nunito', - fontSize: 21.0, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts.asMap() - .containsKey('Nunito'), - ), - ), + Container( + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context) + .primaryBackground, ), - ), - ], - ), - ), - Stack( - children: [ - Container( - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context) - .primaryBackground, - ), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Divider( - thickness: 0.5, - color: - FlutterFlowTheme.of(context).accent1, - ), - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 30.0), - child: Text( - FFLocalizations.of(context).getText( - 'qo0pg2at' /* Quais visitantes você deseja c... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Column( - mainAxisSize: MainAxisSize.max, - children: [ - if (_model.visitorJsonList.isNotEmpty) - Builder( - builder: (context) { - final visitorList = _model - .visitorJsonList - .map((e) => e) - .toList(); - return SizedBox( - width: double.infinity, - height: 180.0, - child: CarouselSlider.builder( - itemCount: visitorList.length, - itemBuilder: (context, - visitorListIndex, _) { - final visitorListItem = - visitorList[ - visitorListIndex]; - return Padding( - padding: - const EdgeInsetsDirectional - .fromSTEB( - 0.0, - 0.0, - 0.0, - 20.0), - child: InkWell( - splashColor: - Colors.transparent, - focusColor: - Colors.transparent, - hoverColor: - Colors.transparent, - highlightColor: - Colors.transparent, - onTap: () async { - await showModalBottomSheet( - isScrollControlled: - true, - backgroundColor: - Colors - .transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode - .canRequestFocus - ? FocusScope.of( - context) - .requestFocus(_model - .unfocusNode) - : FocusScope.of( - context) - .unfocus(), - child: Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - const VisitorDetailsModalWidget(), - ), - ); - }, - ).then((value) => - safeSetState( - () {})); - }, - onLongPress: () async { - _model.removeFromVisitorJsonList( - visitorListItem); - setState(() {}); - }, - child: ClipRRect( - borderRadius: - BorderRadius - .circular( - 8.0), - child: - CachedNetworkImage( - fadeInDuration: - const Duration( - milliseconds: - 500), - fadeOutDuration: - const Duration( - milliseconds: - 500), - imageUrl: - valueOrDefault< - String>( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitorListItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: 200.0, - height: 100.0, - fit: BoxFit.cover, - ), - ), - ), - ); - }, - carouselController: _model - .carouselController ??= - CarouselController(), - options: CarouselOptions( - initialPage: max( - 0, - min( - 1, - visitorList.length - - 1)), - viewportFraction: 0.5, - disableCenter: true, - enlargeCenterPage: true, - enlargeFactor: 0.25, - enableInfiniteScroll: true, - scrollDirection: - Axis.horizontal, - autoPlay: false, - onPageChanged: (index, _) => - _model.carouselCurrentIndex = - index, - ), - ), - ); - }, - ), - ], - ), - Stack( - children: [ - Align( - alignment: - const AlignmentDirectional(0.01, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 0.0, 0.0, 20.0), - child: FFButtonWidget( - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: - FlutterFlowTheme.of( - context) - .primaryBackground, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode - .canRequestFocus - ? FocusScope.of( - context) - .requestFocus(_model - .unfocusNode) - : FocusScope.of( - context) - .unfocus(), - child: Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - VisitorSearchComponentWidget( - getVisitors: - (visitorsParam) async { - _model.visitorJsonList = - visitorsParam! - .toList() - .cast< - dynamic>(); - setState(() {}); - }, - getDocs: - (docsParam) async { - _model.visitorStrList = - functions.strListToStr( - docsParam! - .toList()); - setState(() {}); - }, - ), - ), - ); - }, - ).then((value) => - safeSetState(() {})); - }, - text: '', - icon: Icon( - Icons.add, - color: - FlutterFlowTheme.of(context) - .primary, - size: 30.0, - ), - options: FFButtonOptions( - width: 300.0, - height: 80.0, - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 0.0, 0.0), - iconPadding: - const EdgeInsetsDirectional - .fromSTEB(14.0, 0.0, - 0.0, 20.0), - color: - FlutterFlowTheme.of(context) - .primaryBackground, - textStyle: - FlutterFlowTheme.of(context) - .titleSmall - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .titleSmallFamily, - color: FlutterFlowTheme - .of(context) - .primaryText, - fontSize: 16.0, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .titleSmallFamily), - ), - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .primary, - width: 1.0, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - ), - ), - ), - Align( - alignment: - const AlignmentDirectional(0.0, 0.0), - child: Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 0.0, 50.0, 0.0, 0.0), - child: Text( - FFLocalizations.of(context) - .getText( - 'i0jhuu3e' /* Clique para adicionar um visit... */, - ), - style: - FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - ], - ), - Divider( - thickness: 0.5, - color: - FlutterFlowTheme.of(context).accent1, - ), - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 0.0), - child: Text( - FFLocalizations.of(context).getText( - 'z4ry3tge' /* Qual o período de validade da ... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.bold, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Stack( - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 24.0, 50.0, 24.0, 0.0), - child: TextFormField( - controller: _model.textController1, - focusNode: - _model.textFieldFocusNode1, - autofocus: false, - obscureText: false, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '9mg9nv2j' /* Ínicio da Visita */, - ), - labelStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .labelMediumFamily), - ), - hintText: - FFLocalizations.of(context) - .getText( - 'y5s85khj' /* Quando a visitas se inicia? */, - ), - hintStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .labelMediumFamily), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .accent1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .primary, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - suffixIcon: Icon( - Icons.hourglass_top, - color: - FlutterFlowTheme.of(context) - .accent1, - ), - ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - textAlign: TextAlign.center, - validator: _model - .textController1Validator - .asValidator(context), - ), - ), - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 24.0, 50.0, 24.0, 0.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - final datePicked1Date = - await showDatePicker( - context: context, - initialDate: - getCurrentTimestamp, - firstDate: getCurrentTimestamp, - lastDate: DateTime(2050), - builder: (context, child) { - return wrapInMaterialDatePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .headlineLargeFamily, - fontSize: 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - - TimeOfDay? datePicked1Time; - if (datePicked1Date != null) { - datePicked1Time = - await showTimePicker( - context: context, - initialTime: - TimeOfDay.fromDateTime( - getCurrentTimestamp), - builder: (context, child) { - return wrapInMaterialTimePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: FlutterFlowTheme.of( - context) - .headlineLargeFamily, - fontSize: 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - } - - if (datePicked1Date != null && - datePicked1Time != null) { - safeSetState(() { - _model.datePicked1 = DateTime( - datePicked1Date.year, - datePicked1Date.month, - datePicked1Date.day, - datePicked1Time!.hour, - datePicked1Time.minute, - ); - }); - } - setState(() { - _model.textController1?.text = - dateTimeFormat( - 'd/M/y H:mm:ss', - _model.datePicked1, - locale: FFLocalizations.of( - context) - .languageCode, - ); - }); - }, - child: Container( - width: double.infinity, - height: 50.0, - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(8.0), - ), - ), - ), - ), - ], - ), - Stack( - children: [ - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 24.0, 50.0, 24.0, 0.0), - child: TextFormField( - controller: _model.textController2, - focusNode: - _model.textFieldFocusNode2, - autofocus: false, - obscureText: false, - decoration: InputDecoration( - labelText: - FFLocalizations.of(context) - .getText( - '4o0cbb70' /* Término da Visita */, - ), - labelStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .labelMediumFamily), - ), - hintText: - FFLocalizations.of(context) - .getText( - 'bhmgddc4' /* Quando a visita terminá? */, - ), - hintStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .labelMediumFamily), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .accent1, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .primary, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: FlutterFlowTheme.of( - context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(8.0), - ), - suffixIcon: Icon( - Icons.hourglass_bottom, - color: - FlutterFlowTheme.of(context) - .accent1, - ), - ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - textAlign: TextAlign.center, - validator: _model - .textController2Validator - .asValidator(context), - ), - ), - Padding( - padding: - const EdgeInsetsDirectional.fromSTEB( - 24.0, 50.0, 24.0, 20.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - final datePicked2Date = - await showDatePicker( - context: context, - initialDate: - getCurrentTimestamp, - firstDate: getCurrentTimestamp, - lastDate: DateTime(2050), - builder: (context, child) { - return wrapInMaterialDatePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .headlineLargeFamily, - fontSize: 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - - TimeOfDay? datePicked2Time; - if (datePicked2Date != null) { - datePicked2Time = - await showTimePicker( - context: context, - initialTime: - TimeOfDay.fromDateTime( - getCurrentTimestamp), - builder: (context, child) { - return wrapInMaterialTimePickerTheme( - context, - child!, - headerBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - headerForegroundColor: - FlutterFlowTheme.of( - context) - .info, - headerTextStyle: - FlutterFlowTheme.of( - context) - .headlineLarge - .override( - fontFamily: FlutterFlowTheme.of( - context) - .headlineLargeFamily, - fontSize: 32.0, - letterSpacing: - 0.0, - fontWeight: - FontWeight - .w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of(context) - .headlineLargeFamily), - ), - pickerBackgroundColor: - FlutterFlowTheme.of( - context) - .secondaryBackground, - pickerForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - selectedDateTimeBackgroundColor: - FlutterFlowTheme.of( - context) - .primary, - selectedDateTimeForegroundColor: - FlutterFlowTheme.of( - context) - .info, - actionButtonForegroundColor: - FlutterFlowTheme.of( - context) - .primaryText, - iconSize: 24.0, - ); - }, - ); - } - - if (datePicked2Date != null && - datePicked2Time != null) { - safeSetState(() { - _model.datePicked2 = DateTime( - datePicked2Date.year, - datePicked2Date.month, - datePicked2Date.day, - datePicked2Time!.hour, - datePicked2Time.minute, - ); - }); - } - setState(() { - _model.textController2?.text = - dateTimeFormat( - 'd/M/y H:mm:ss', - _model.datePicked2, - locale: FFLocalizations.of( - context) - .languageCode, - ); - }); - }, - child: Container( - width: double.infinity, - height: 50.0, - decoration: BoxDecoration( - borderRadius: - BorderRadius.circular(8.0), - ), - ), - ), - ), - ], - ), - Divider( - thickness: 0.5, - color: - FlutterFlowTheme.of(context).accent1, - ), - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 30.0), - child: Text( - FFLocalizations.of(context).getText( - 'p81uol2v' /* Quais são os motivos da visita... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 30.0, 0.0, 30.0, 0.0), - child: Row( + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Column( mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.end, children: [ - Expanded( + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), child: Padding( padding: const EdgeInsetsDirectional .fromSTEB( - 0.0, 20.0, 0.0, 0.0), - child: FutureBuilder< - ApiCallResponse>( - future: - PhpGroup.getDadosCall.call( - devUUID: FFAppState().devUUID, - userUUID: - FFAppState().userUUID, - cliUUID: FFAppState().cliUUID, - atividade: 'getDados', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme - .of(context) - .primary, - size: 50.0, - ), - ), - ); - } - final dropDownGetDadosResponse = - snapshot.data!; - return FlutterFlowDropDown< - String>( - controller: _model - .dropDownValueController1 ??= - FormFieldController< - String>( - _model.dropDownValue1 ??= - '', - ), - options: List.from( - PhpGroup.getDadosCall - .reasonsJsonList( - dropDownGetDadosResponse - .jsonBody, - )! - .map((e) => - e.toString()) - .toList()), - optionLabels: PhpGroup - .getDadosCall - .reasonsMotDescStrList( - dropDownGetDadosResponse - .jsonBody, - )!, - onChanged: (val) => - setState(() => _model - .dropDownValue1 = - val), - width: 300.0, - height: 56.0, - textStyle: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'x1ij847i' /* Escolha um motivo aqui */, - ), - icon: Icon( - Icons - .keyboard_arrow_down_rounded, - color: - FlutterFlowTheme.of( - context) - .accent1, - size: 24.0, - ), - fillColor: - FlutterFlowTheme.of( - context) - .primaryBackground, - elevation: 2.0, - borderColor: - FlutterFlowTheme.of( - context) - .accent1, - borderWidth: 0.5, - borderRadius: 10.0, - margin: - const EdgeInsetsDirectional - .fromSTEB(16.0, 4.0, - 16.0, 4.0), - hidesUnderline: true, - isOverButton: true, - isSearchable: false, - isMultiSelect: false, - ); - }, - ), - ), - ), - ], - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 30.0, 0.0, 30.0, 0.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.end, - children: [ - Expanded( - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 20.0, 0.0, 20.0), - child: FutureBuilder< - ApiCallResponse>( - future: - PhpGroup.getDadosCall.call( - devUUID: FFAppState().devUUID, - userUUID: - FFAppState().userUUID, - cliUUID: FFAppState().cliUUID, - atividade: 'getDados', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme - .of(context) - .primary, - size: 50.0, - ), - ), - ); - } - final dropDownGetDadosResponse = - snapshot.data!; - return FlutterFlowDropDown< - String>( - controller: _model - .dropDownValueController2 ??= - FormFieldController< - String>( - _model.dropDownValue2 ??= - '', - ), - options: List.from( - PhpGroup.getDadosCall - .levelJsonList( - dropDownGetDadosResponse - .jsonBody, - )! - .map((e) => - e.toString()) - .toList()), - optionLabels: PhpGroup - .getDadosCall - .levelNACDescricaoStrList( - dropDownGetDadosResponse - .jsonBody, - )!, - onChanged: (val) => - setState(() => _model - .dropDownValue2 = - val), - width: 300.0, - height: 56.0, - textStyle: FlutterFlowTheme - .of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - hintText: - FFLocalizations.of( - context) - .getText( - 'kmgv5j7x' /* Escolha um nível de acesso aqu... */, - ), - icon: Icon( - Icons - .keyboard_arrow_down_rounded, - color: - FlutterFlowTheme.of( - context) - .accent1, - size: 24.0, - ), - fillColor: - FlutterFlowTheme.of( - context) - .primaryBackground, - elevation: 2.0, - borderColor: - FlutterFlowTheme.of( - context) - .accent1, - borderWidth: 0.5, - borderRadius: 10.0, - margin: - const EdgeInsetsDirectional - .fromSTEB(16.0, 4.0, - 16.0, 4.0), - hidesUnderline: true, - isOverButton: true, - isSearchable: false, - isMultiSelect: false, - ); - }, - ), - ), - ), - ], - ), - ), - Divider( - thickness: 0.5, - color: - FlutterFlowTheme.of(context).accent1, - ), - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 30.0), - child: Text( - FFLocalizations.of(context).getText( - 'mddp33o0' /* Visita se encerra após o prime... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 30.0, 0.0, 30.0, 20.0), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.center, - crossAxisAlignment: - CrossAxisAlignment.center, - children: [ - Flexible( - child: Padding( - padding: const EdgeInsetsDirectional - .fromSTEB( - 0.0, 0.0, 130.0, 0.0), + 20.0, 30.0, 0.0, 30.0), child: Text( FFLocalizations.of(context) .getText( - '68j9gw4h' /* Visita única */, + 'u0jocx7e' /* Quais visitantes você deseja c... */, ), textAlign: TextAlign.start, style: @@ -1597,6 +235,8 @@ class _ScheduleCompleteVisitPageWidgetState context) .bodyMediumFamily, letterSpacing: 0.0, + fontWeight: + FontWeight.bold, useGoogleFonts: GoogleFonts .asMap() .containsKey( @@ -1607,698 +247,426 @@ class _ScheduleCompleteVisitPageWidgetState ), ), ), - Switch.adaptive( - value: _model.switchValue!, - onChanged: (newValue) async { - setState(() => _model - .switchValue = newValue); - }, - activeTrackColor: - FlutterFlowTheme.of(context) - .primary, - inactiveTrackColor: - FlutterFlowTheme.of(context) - .primaryText, - inactiveThumbColor: - FlutterFlowTheme.of(context) - .alternate, + if (_model.visitorJsonList.isNotEmpty) + Builder( + builder: (context) { + final visitorListView = _model + .visitorJsonList + .map((e) => e) + .toList(); + return ListView.separated( + padding: const EdgeInsets.fromLTRB( + 0, + 0, + 0, + 20.0, + ), + shrinkWrap: true, + scrollDirection: + Axis.vertical, + itemCount: + visitorListView.length, + separatorBuilder: (_, __) => + const SizedBox(height: 5.0), + itemBuilder: (context, + visitorListViewIndex) { + final visitorListViewItem = + visitorListView[ + visitorListViewIndex]; + return InkWell( + splashColor: + Colors.transparent, + focusColor: + Colors.transparent, + hoverColor: + Colors.transparent, + highlightColor: + Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + Colors + .transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of( + context) + .requestFocus( + _model + .unfocusNode) + : FocusScope.of( + context) + .unfocus(), + child: Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + const VisitorDetailsModalTemplateComponentWidget(), + ), + ); + }, + ).then((value) => + safeSetState( + () {})); + }, + onLongPress: () async { + _model.removeFromVisitorJsonList( + visitorListViewItem); + setState(() {}); + }, + child: Container( + width: 100.0, + height: 70.0, + decoration: + BoxDecoration( + color: FlutterFlowTheme + .of(context) + .secondaryBackground, + ), + child: Row( + mainAxisSize: + MainAxisSize.max, + children: [ + Container( + width: 50.0, + height: 50.0, + clipBehavior: Clip + .antiAlias, + decoration: + const BoxDecoration( + shape: BoxShape + .circle, + ), + child: + CachedNetworkImage( + fadeInDuration: + const Duration( + milliseconds: + 500), + fadeOutDuration: + const Duration( + milliseconds: + 500), + imageUrl: + valueOrDefault< + String>( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitorListViewItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + fit: BoxFit + .cover, + ), + ), + Column( + mainAxisSize: + MainAxisSize + .max, + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Text( + getJsonField( + visitorListViewItem, + r'''$.VTE_NOME''', + ).toString(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + Text( + getJsonField( + visitorListViewItem, + r'''$.VTE_TIPO''', + ).toString(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ], + ), + ] + .divide(const SizedBox( + width: 30.0)) + .addToStart( + const SizedBox( + width: + 30.0)), + ), + ), + ); + }, + ); + }, + ), + Stack( + children: [ + Align( + alignment: const AlignmentDirectional( + 0.01, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 0.0, 20.0), + child: FFButtonWidget( + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: + true, + backgroundColor: + FlutterFlowTheme.of( + context) + .primaryBackground, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of( + context) + .requestFocus( + _model + .unfocusNode) + : FocusScope.of( + context) + .unfocus(), + child: Padding( + padding: MediaQuery + .viewInsetsOf( + context), + child: + VisitorSearchModalTemplateComponentWidget( + getVisitors: + (visitorsParam) async { + _model.visitorJsonList = + visitorsParam! + .toList() + .cast< + dynamic>(); + setState( + () {}); + }, + getDocs: + (docsParam) async { + _model.visitorStrList = + functions.strListToStr( + docsParam! + .toList()); + setState( + () {}); + }, + ), + ), + ); + }, + ).then((value) => + safeSetState(() {})); + }, + text: '', + icon: Icon( + Icons.add, + color: + FlutterFlowTheme.of( + context) + .primary, + size: 30.0, + ), + options: FFButtonOptions( + width: MediaQuery.sizeOf( + context) + .width * + 0.8, + height: 80.0, + padding: + const EdgeInsetsDirectional + .fromSTEB( + 0.0, + 0.0, + 0.0, + 0.0), + iconPadding: + const EdgeInsetsDirectional + .fromSTEB( + 14.0, + 0.0, + 0.0, + 20.0), + color: FlutterFlowTheme + .of(context) + .primaryBackground, + textStyle: + FlutterFlowTheme.of( + context) + .titleSmall + .override( + fontFamily: FlutterFlowTheme.of( + context) + .titleSmallFamily, + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 16.0, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .titleSmallFamily), + ), + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .accent4, + width: 1.0, + ), + borderRadius: + BorderRadius.circular( + 8.0), + ), + ), + ), + ), + Align( + alignment: const AlignmentDirectional( + 0.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 50.0, 0.0, 0.0), + child: Container( + width: MediaQuery.sizeOf( + context) + .width * + 0.8, + height: 20.0, + decoration: const BoxDecoration(), + child: Align( + alignment: + const AlignmentDirectional( + 0.0, 0.0), + child: AutoSizeText( + FFLocalizations.of( + context) + .getText( + 'r8soavtz' /* Clique para adicionar um visit... */, + ), + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + color: FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + ), + ], ), ], ), - ), - Divider( - thickness: 0.5, - color: - FlutterFlowTheme.of(context).accent1, - ), - Align( - alignment: - const AlignmentDirectional(-1.0, 0.0), - child: Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 20.0, 30.0, 0.0, 30.0), - child: Text( - FFLocalizations.of(context).getText( - '9rudpkq7' /* Você tem alguma observação sob... */, - ), - textAlign: TextAlign.start, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - fontWeight: FontWeight.w600, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ), - ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 24.0, 0.0, 24.0, 20.0), - child: SizedBox( - width: double.infinity, - child: TextFormField( - controller: _model.textController3, - focusNode: _model.textFieldFocusNode3, - autofocus: false, - textInputAction: TextInputAction.next, - obscureText: false, - decoration: InputDecoration( - labelText: + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 24.0, 0.0, 24.0), + child: Text( FFLocalizations.of(context) .getText( - '4rgpxrfe' /* Observações da Visita */, - ), - labelStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( + '98evnbbe' /* Qual o período de validade da ... */, + ), + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( context) - .labelMediumFamily), - ), - hintText: - FFLocalizations.of(context) - .getText( - '7knytis2' /* Escreva as suas observações aq... */, - ), - hintStyle: - FlutterFlowTheme.of(context) - .labelMedium - .override( - fontFamily: - FlutterFlowTheme.of( - context) - .labelMediumFamily, - color: - FlutterFlowTheme.of( - context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .labelMediumFamily), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide( - color: - FlutterFlowTheme.of(context) - .accent1, - width: 0.5, + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: + FontWeight.bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), ), - borderRadius: - BorderRadius.circular(10.0), - ), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: - FlutterFlowTheme.of(context) - .primary, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(10.0), - ), - errorBorder: OutlineInputBorder( - borderSide: BorderSide( - color: - FlutterFlowTheme.of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(10.0), - ), - focusedErrorBorder: - OutlineInputBorder( - borderSide: BorderSide( - color: - FlutterFlowTheme.of(context) - .error, - width: 0.5, - ), - borderRadius: - BorderRadius.circular(10.0), - ), - suffixIcon: Icon( - Icons.format_color_text, - color: - FlutterFlowTheme.of(context) - .accent1, ), ), - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - color: - FlutterFlowTheme.of(context) - .primaryText, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - textAlign: TextAlign.start, - maxLines: null, - validator: _model - .textController3Validator - .asValidator(context), - ), - ), - ), - Container( - width: 100.0, - height: 54.0, - decoration: const BoxDecoration(), - ), - ], - ), - ), - ), - ], - ), - InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - if ((_model.textController1.text != '') && - (_model.textController2.text != '') && - (_model.dropDownValue1 != null && - _model.dropDownValue1 != '') && - (_model.dropDownValue2 != null && - _model.dropDownValue2 != '')) { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: VisitDetailsModalWidget( - visitStartDateStr: - _model.textController1.text, - visitEndDateStr: - _model.textController2.text, - visitReasonStr: _model.dropDownValue1, - visitLevelStr: _model.dropDownValue2, - visitTempStr: _model.switchValue == true - ? 'Sim' - : 'Não', - visitObsStr: - _model.textController3.text, - visitorStrList: _model.visitorStrList, - visitorJsonList: _model.visitorJsonList, - updateToggleIdx: () async {}, - repeatVisitSchedule: () async {}, - ), - ), - ); - }, - ).then((value) => safeSetState(() {})); - } else { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf(context), - child: const ThrowExceptionWidget( - msg: 'Campos obrigatórios imcompletos.', - ), - ), - ); - }, - ).then((value) => safeSetState(() {})); - } - }, - child: Container( - width: double.infinity, - height: 40.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primary, - borderRadius: const BorderRadius.only( - bottomLeft: Radius.circular(0.0), - bottomRight: Radius.circular(0.0), - topLeft: Radius.circular(0.0), - topRight: Radius.circular(0.0), - ), - ), - alignment: const AlignmentDirectional(0.0, 1.0), - child: Align( - alignment: const AlignmentDirectional(0.0, 0.0), - child: Icon( - Icons.save_alt, - color: FlutterFlowTheme.of(context).info, - size: 24.0, - ), - ), - ), - ), - ], - ); - } else { - return Container( - width: double.infinity, - height: 900.0, - decoration: BoxDecoration( - color: FlutterFlowTheme.of(context).primaryBackground, - ), - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - FlutterFlowIconButton( - borderColor: Colors.transparent, - borderRadius: 20.0, - borderWidth: 1.0, - buttonSize: 40.0, - icon: Icon( - Icons.settings_sharp, - color: FlutterFlowTheme.of(context).primary, - size: 24.0, - ), - onPressed: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus( - _model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: Padding( - padding: - MediaQuery.viewInsetsOf(context), - child: const OptModalWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - ), - ], - ), - Expanded( - child: Padding( - padding: const EdgeInsets.all(14.0), - child: FutureBuilder( - future: PhpGroup.getVisitsCall.call( - devUUID: FFAppState().devUUID, - userUUID: FFAppState().userUUID, - cliID: FFAppState().cliUUID, - atividade: 'getVisitas', - ), - builder: (context, snapshot) { - // Customize what your widget looks like when it's loading. - if (!snapshot.hasData) { - return Center( - child: SizedBox( - width: 50.0, - height: 50.0, - child: SpinKitCircle( - color: FlutterFlowTheme.of(context) - .primary, - size: 50.0, - ), - ), - ); - } - final gridViewGetVisitsResponse = - snapshot.data!; - return Builder( - builder: (context) { - final visitHistory = - (PhpGroup.getVisitsCall - .visitasList( - gridViewGetVisitsResponse - .jsonBody, - ) - ?.toList() ?? - []) - .take(10) - .toList(); - return GridView.builder( - padding: EdgeInsets.zero, - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - crossAxisSpacing: 10.0, - mainAxisSpacing: 10.0, - childAspectRatio: 1.0, - ), - scrollDirection: Axis.vertical, - itemCount: visitHistory.length, - itemBuilder: - (context, visitHistoryIndex) { - final visitHistoryItem = - visitHistory[visitHistoryIndex]; - return Container( - width: double.infinity, - height: double.infinity, - decoration: const BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: - Radius.circular(50.0), - bottomRight: - Radius.circular(50.0), - topLeft: Radius.circular(25.0), - topRight: Radius.circular(25.0), - ), - shape: BoxShape.rectangle, - ), - child: Stack( - children: [ - Container( - width: double.infinity, - height: double.infinity, - decoration: BoxDecoration( - color: - valueOrDefault( - () { - if (functions.jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"A\"') { - return FlutterFlowTheme - .of(context) - .success; - } else if (functions - .jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"C\"') { - return FlutterFlowTheme - .of(context) - .error; - } else if (functions - .jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"I\"') { - return FlutterFlowTheme - .of(context) - .warning; - } else { - return FlutterFlowTheme - .of(context) - .primary; - } - }(), - FlutterFlowTheme.of( - context) - .primary, - ), - borderRadius: - const BorderRadius.only( - bottomLeft: - Radius.circular(10.0), - bottomRight: - Radius.circular(10.0), - topLeft: - Radius.circular(25.0), - topRight: - Radius.circular(25.0), - ), - shape: BoxShape.rectangle, - ), - ), - InkWell( - splashColor: - Colors.transparent, - focusColor: - Colors.transparent, - hoverColor: - Colors.transparent, - highlightColor: - Colors.transparent, - onTap: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: - Colors.transparent, - enableDrag: false, - useSafeArea: true, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode - .canRequestFocus - ? FocusScope.of( - context) - .requestFocus( - _model - .unfocusNode) - : FocusScope.of( - context) - .unfocus(), - child: Padding( - padding: MediaQuery - .viewInsetsOf( - context), - child: - VisitDetailsModalWidget( - visitStatusStr: - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS ''', - ).toString(), - visitStartDateStr: - getJsonField( - visitHistoryItem, - r'''$.VAW_DTINICIO''', - ).toString(), - visitEndDateStr: - getJsonField( - visitHistoryItem, - r'''$.VAW_DTFIM''', - ).toString(), - visitReasonStr: - getJsonField( - visitHistoryItem, - r'''$.MOT_DESCRICAO''', - ).toString(), - visitLevelStr: - getJsonField( - visitHistoryItem, - r'''$.NAC_DESCRICAO''', - ).toString(), - visitTempStr: - getJsonField( - visitHistoryItem, - r'''$.VTE_UNICA ''', - ).toString(), - visitObsStr: - getJsonField( - visitHistoryItem, - r'''$.VAW_OBS''', - ).toString(), - visitorImgPath: - valueOrDefault< - String>( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - visitorStrList: - getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString(), - visitIdStr: - getJsonField( - visitHistoryItem, - r'''$.VAW_ID''', - ).toString(), - visitorJsonList: PhpGroup - .getVisitsCall - .visitasList( - gridViewGetVisitsResponse - .jsonBody, - ), - updateToggleIdx: - () async { - _model.toggleIdx = - true; - setState(() {}); - }, - repeatVisitSchedule: - () async {}, - ), - ), - ); - }, - ).then((value) => - safeSetState(() {})); - }, - child: ClipRRect( - borderRadius: - const BorderRadius.only( - bottomLeft: - Radius.circular(25.0), - bottomRight: - Radius.circular(25.0), - topLeft: - Radius.circular(25.0), - topRight: - Radius.circular(25.0), - ), - child: CachedNetworkImage( - fadeInDuration: const Duration( - milliseconds: 500), - fadeOutDuration: const Duration( - milliseconds: 500), - imageUrl: valueOrDefault< - String>( - 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( - visitHistoryItem, - r'''$.VTE_DOCUMENTO''', - ).toString()}&tipo=E', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - width: double.infinity, - height: double.infinity, - fit: BoxFit.cover, - ), - ), - ), - Align( - alignment: - const AlignmentDirectional( - 0.0, -1.0), - child: Container( - width: 200.0, - height: 20.0, - decoration: BoxDecoration( - color: - valueOrDefault( - () { - if (functions.jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"A\"') { - return FlutterFlowTheme - .of(context) - .success; - } else if (functions - .jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"C\"') { - return FlutterFlowTheme - .of(context) - .error; - } else if (functions - .jsonToStr( - getJsonField( - visitHistoryItem, - r'''$.VAW_STATUS''', - )) == - '\"I\"') { - return FlutterFlowTheme - .of(context) - .warning; - } else { - return FlutterFlowTheme - .of(context) - .primary; - } - }(), - FlutterFlowTheme.of( - context) - .primary, - ), - borderRadius: - const BorderRadius.only( - bottomLeft: - Radius.circular( - 0.0), - bottomRight: - Radius.circular( - 0.0), - topLeft: - Radius.circular( - 25.0), - topRight: - Radius.circular( - 25.0), - ), - ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 0.0, 0.0, 0.0), + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: Align( alignment: const AlignmentDirectional( 0.0, 0.0), child: Text( - getJsonField( - visitHistoryItem, - r'''$.VTE_NOME''', - ).toString(), - textAlign: - TextAlign.center, + FFLocalizations.of( + context) + .getText( + 'qygj6ra5' /* Inicio da Visita */, + ), style: FlutterFlowTheme.of( context) @@ -2307,10 +675,7 @@ class _ScheduleCompleteVisitPageWidgetState fontFamily: FlutterFlowTheme.of( context) .bodyMediumFamily, - color: FlutterFlowTheme.of( - context) - .info, - fontSize: 12.0, + fontSize: 14.0, letterSpacing: 0.0, useGoogleFonts: GoogleFonts @@ -2322,22 +687,2123 @@ class _ScheduleCompleteVisitPageWidgetState ), ), ), + ), + Expanded( + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: SizedBox( + height: double.infinity, + child: Stack( + children: [ + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 10.0, + 0.0, + 24.0, + 0.0), + child: TextFormField( + controller: _model + .textController1, + focusNode: _model + .textFieldFocusNode1, + autofocus: false, + obscureText: false, + decoration: + InputDecoration( + isDense: true, + labelStyle: + FlutterFlowTheme.of( + context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).labelMediumFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + '53cbwqh9' /* Quando você inicia a visita? */, + ), + hintStyle: + FlutterFlowTheme.of( + context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).labelMediumFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily), + lineHeight: + 1.0, + ), + enabledBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .accent4, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .primary, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + suffixIcon: Icon( + Icons + .date_range, + color: FlutterFlowTheme.of( + context) + .accent1, + ), + ), + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + lineHeight: + 1.0, + ), + textAlign: TextAlign + .center, + validator: _model + .textController1Validator + .asValidator( + context), + ), + ), + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 10.0, + 0.0, + 24.0, + 0.0), + child: InkWell( + splashColor: Colors + .transparent, + focusColor: Colors + .transparent, + hoverColor: Colors + .transparent, + highlightColor: + Colors + .transparent, + onTap: () async { + final datePicked1Date = + await showDatePicker( + context: + context, + initialDate: + getCurrentTimestamp, + firstDate: + getCurrentTimestamp, + lastDate: + DateTime( + 2050), + builder: + (context, + child) { + return wrapInMaterialDatePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of(context) + .info, + headerTextStyle: FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of(context).headlineLargeFamily, + fontSize: + 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of(context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of(context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + iconSize: + 24.0, + ); + }, + ); + + TimeOfDay? + datePicked1Time; + if (datePicked1Date != + null) { + datePicked1Time = + await showTimePicker( + context: + context, + initialTime: TimeOfDay + .fromDateTime( + getCurrentTimestamp), + builder: + (context, + child) { + return wrapInMaterialTimePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of(context) + .info, + headerTextStyle: FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of(context).headlineLargeFamily, + fontSize: + 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of(context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of(context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + iconSize: + 24.0, + ); + }, + ); + } + + if (datePicked1Date != + null && + datePicked1Time != + null) { + safeSetState( + () { + _model.datePicked1 = + DateTime( + datePicked1Date + .year, + datePicked1Date + .month, + datePicked1Date + .day, + datePicked1Time! + .hour, + datePicked1Time + .minute, + ); + }); + } + setState(() { + _model.textController1 + ?.text = + dateTimeFormat( + 'd/M/y H:mm:ss', + _model + .datePicked1, + locale: FFLocalizations.of( + context) + .languageCode, + ); + }); + }, + child: Container( + width: double + .infinity, + height: 55.0, + decoration: + BoxDecoration( + borderRadius: + BorderRadius + .circular( + 8.0), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 0.0, 0.0, 0.0), + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: Align( + alignment: + const AlignmentDirectional( + 0.0, 0.0), + child: Text( + FFLocalizations.of( + context) + .getText( + 'p4ws3t66' /* Fim da Visita */, + ), + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + fontSize: 14.0, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + Expanded( + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: SizedBox( + height: double.infinity, + child: Stack( + children: [ + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 10.0, + 0.0, + 24.0, + 0.0), + child: TextFormField( + controller: _model + .textController2, + focusNode: _model + .textFieldFocusNode2, + autofocus: false, + obscureText: false, + decoration: + InputDecoration( + isDense: true, + labelStyle: + FlutterFlowTheme.of( + context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).labelMediumFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + 'xpgc5e8d' /* Quando a visita terminá? */, + ), + hintStyle: + FlutterFlowTheme.of( + context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).labelMediumFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).labelMediumFamily), + lineHeight: + 1.0, + ), + enabledBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .accent4, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .primary, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: + BorderSide( + color: FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius + .circular( + 8.0), + ), + suffixIcon: Icon( + Icons + .date_range, + color: FlutterFlowTheme.of( + context) + .accent1, + ), + ), + style: FlutterFlowTheme + .of(context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + lineHeight: + 1.0, + ), + textAlign: TextAlign + .center, + validator: _model + .textController2Validator + .asValidator( + context), + ), + ), + Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 10.0, + 0.0, + 24.0, + 0.0), + child: InkWell( + splashColor: Colors + .transparent, + focusColor: Colors + .transparent, + hoverColor: Colors + .transparent, + highlightColor: + Colors + .transparent, + onTap: () async { + final datePicked2Date = + await showDatePicker( + context: + context, + initialDate: + getCurrentTimestamp, + firstDate: + getCurrentTimestamp, + lastDate: + DateTime( + 2050), + builder: + (context, + child) { + return wrapInMaterialDatePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of(context) + .info, + headerTextStyle: FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of(context).headlineLargeFamily, + fontSize: + 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of(context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of(context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + iconSize: + 24.0, + ); + }, + ); + + TimeOfDay? + datePicked2Time; + if (datePicked2Date != + null) { + datePicked2Time = + await showTimePicker( + context: + context, + initialTime: TimeOfDay + .fromDateTime( + getCurrentTimestamp), + builder: + (context, + child) { + return wrapInMaterialTimePickerTheme( + context, + child!, + headerBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + headerForegroundColor: + FlutterFlowTheme.of(context) + .info, + headerTextStyle: FlutterFlowTheme.of( + context) + .headlineLarge + .override( + fontFamily: + FlutterFlowTheme.of(context).headlineLargeFamily, + fontSize: + 32.0, + letterSpacing: + 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).headlineLargeFamily), + ), + pickerBackgroundColor: + FlutterFlowTheme.of(context) + .secondaryBackground, + pickerForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + selectedDateTimeBackgroundColor: + FlutterFlowTheme.of(context) + .primary, + selectedDateTimeForegroundColor: + FlutterFlowTheme.of(context) + .info, + actionButtonForegroundColor: + FlutterFlowTheme.of(context) + .primaryText, + iconSize: + 24.0, + ); + }, + ); + } + + if (datePicked2Date != + null && + datePicked2Time != + null) { + safeSetState( + () { + _model.datePicked2 = + DateTime( + datePicked2Date + .year, + datePicked2Date + .month, + datePicked2Date + .day, + datePicked2Time! + .hour, + datePicked2Time + .minute, + ); + }); + } + setState(() { + _model.textController2 + ?.text = + dateTimeFormat( + 'd/M/y H:mm:ss', + _model + .datePicked2, + locale: FFLocalizations.of( + context) + .languageCode, + ); + }); + }, + child: Container( + width: double + .infinity, + height: 39.0, + decoration: + BoxDecoration( + borderRadius: + BorderRadius + .circular( + 8.0), + ), + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ].divide(const SizedBox(height: 10.0)), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 24.0, 0.0, 24.0), + child: Text( + FFLocalizations.of(context) + .getText( + '0meymh6u' /* Quais são os motivos da visita... */, + ), + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: + FontWeight.bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 0.0, 0.0, 0.0), + child: Container( + width: 100.0, + height: 42.0, + decoration: const BoxDecoration(), + child: Align( + alignment: + const AlignmentDirectional( + 0.0, 0.0), + child: Text( + FFLocalizations.of( + context) + .getText( + '2f68zi9t' /* Motivo da Visita */, + ), + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + fontSize: 14.0, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 24.0, 0.0), + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: FutureBuilder< + ApiCallResponse>( + future: PhpGroup + .getDadosCall + .call( + devUUID: FFAppState() + .devUUID, + userUUID: FFAppState() + .userUUID, + cliUUID: FFAppState() + .cliUUID, + atividade: 'getDados', + ), + builder: + (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: + SpinKitCircle( + color: FlutterFlowTheme.of( + context) + .primary, + size: 50.0, + ), + ), + ); + } + final dropDownGetDadosResponse = + snapshot.data!; + return FlutterFlowDropDown< + String>( + controller: _model + .dropDownValueController1 ??= + FormFieldController< + String>( + _model.dropDownValue1 ??= + '', + ), + options: List< + String>.from( + PhpGroup + .getDadosCall + .reasonsJsonList( + dropDownGetDadosResponse + .jsonBody, + )! + .map((e) => e + .toString()) + .toList()), + optionLabels: PhpGroup + .getDadosCall + .reasonsMotDescStrList( + dropDownGetDadosResponse + .jsonBody, + )!, + onChanged: (val) => + setState(() => + _model.dropDownValue1 = + val), + width: + double.infinity, + height: + double.infinity, + textStyle: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + '6p3e0bzr' /* Escolha um motivo aqui */, + ), + icon: Icon( + Icons + .keyboard_arrow_down_rounded, + color: FlutterFlowTheme + .of(context) + .accent1, + size: 24.0, + ), + elevation: 2.0, + borderColor: + FlutterFlowTheme.of( + context) + .accent4, + borderWidth: 0.5, + borderRadius: 10.0, + margin: + const EdgeInsetsDirectional + .fromSTEB( + 16.0, + 0.0, + 16.0, + 0.0), + hidesUnderline: true, + isOverButton: true, + isSearchable: false, + isMultiSelect: false, + ); + }, + ), + ), + ), + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 0.0, 0.0, 0.0), + child: Container( + width: 100.0, + height: 42.0, + decoration: const BoxDecoration(), + child: Align( + alignment: + const AlignmentDirectional( + 0.0, 0.0), + child: Text( + FFLocalizations.of( + context) + .getText( + 'il4di4ln' /* Nível de Acesso */, + ), + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + fontSize: 14.0, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 0.0, 0.0, 24.0, 0.0), + child: Container( + width: 100.0, + height: 40.0, + decoration: const BoxDecoration(), + child: FutureBuilder< + ApiCallResponse>( + future: PhpGroup + .getDadosCall + .call( + devUUID: FFAppState() + .devUUID, + userUUID: FFAppState() + .userUUID, + cliUUID: FFAppState() + .cliUUID, + atividade: 'getDados', + ), + builder: + (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: + SpinKitCircle( + color: FlutterFlowTheme.of( + context) + .primary, + size: 50.0, + ), + ), + ); + } + final dropDownGetDadosResponse = + snapshot.data!; + return FlutterFlowDropDown< + String>( + controller: _model + .dropDownValueController2 ??= + FormFieldController< + String>( + _model.dropDownValue2 ??= + '', + ), + options: List< + String>.from( + PhpGroup + .getDadosCall + .levelJsonList( + dropDownGetDadosResponse + .jsonBody, + )! + .map((e) => e + .toString()) + .toList()), + optionLabels: PhpGroup + .getDadosCall + .levelNACDescricaoStrList( + dropDownGetDadosResponse + .jsonBody, + )!, + onChanged: (val) => + setState(() => + _model.dropDownValue2 = + val), + width: + double.infinity, + height: + double.infinity, + textStyle: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + hintText: + FFLocalizations.of( + context) + .getText( + '2wun8p6c' /* Escolha um nível de acesso aqu... */, + ), + icon: Icon( + Icons + .keyboard_arrow_down_rounded, + color: FlutterFlowTheme + .of(context) + .accent1, + size: 24.0, + ), + elevation: 2.0, + borderColor: + FlutterFlowTheme.of( + context) + .accent4, + borderWidth: 0.5, + borderRadius: 10.0, + margin: + const EdgeInsetsDirectional + .fromSTEB( + 16.0, + 0.0, + 16.0, + 0.0), + hidesUnderline: true, + isOverButton: true, + isSearchable: false, + isMultiSelect: false, + ); + }, + ), + ), + ), + ), + ], + ), + ].divide(const SizedBox(height: 10.0)), + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 24.0, 0.0, 24.0), + child: Text( + FFLocalizations.of(context) + .getText( + '8rk26eg1' /* Visita se encerra após o prime... */, + ), + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: + FontWeight.bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 30.0, 0.0, 30.0, 20.0), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment.center, + crossAxisAlignment: + CrossAxisAlignment.center, + children: [ + Flexible( + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB(0.0, 0.0, + 130.0, 0.0), + child: Text( + FFLocalizations.of( + context) + .getText( + 'lgv0q5ht' /* Visita única */, + ), + textAlign: + TextAlign.start, + style: + FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + Switch.adaptive( + value: _model.switchValue!, + onChanged: (newValue) async { + setState(() => + _model.switchValue = + newValue); + }, + activeColor: + FlutterFlowTheme.of( + context) + .success, + activeTrackColor: + FlutterFlowTheme.of( + context) + .customColor4, + inactiveTrackColor: + FlutterFlowTheme.of( + context) + .customColor4, + inactiveThumbColor: + FlutterFlowTheme.of( + context) + .error, + ), ], ), - ); - }, - ); - }, - ); - }, + ), + ], + ), + Column( + mainAxisSize: MainAxisSize.max, + children: [ + Align( + alignment: + const AlignmentDirectional(-1.0, 0.0), + child: Padding( + padding: const EdgeInsetsDirectional + .fromSTEB( + 20.0, 0.0, 0.0, 24.0), + child: Text( + FFLocalizations.of(context) + .getText( + 'eftcs67c' /* Você tem alguma observação sob... */, + ), + textAlign: TextAlign.start, + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + letterSpacing: 0.0, + fontWeight: + FontWeight.w600, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + ), + ), + ), + Padding( + padding: + const EdgeInsetsDirectional.fromSTEB( + 24.0, 0.0, 24.0, 0.0), + child: SizedBox( + width: double.infinity, + child: TextFormField( + controller: + _model.textController3, + focusNode: + _model.textFieldFocusNode3, + autofocus: false, + textInputAction: + TextInputAction.next, + obscureText: false, + decoration: InputDecoration( + isDense: true, + labelText: FFLocalizations.of( + context) + .getText( + 't0q2vuup' /* Observações da Visita */, + ), + labelStyle: FlutterFlowTheme + .of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + hintText: FFLocalizations.of( + context) + .getText( + 'w18iztdm' /* Escreva as suas observações aq... */, + ), + hintStyle: FlutterFlowTheme + .of(context) + .labelMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .labelMediumFamily, + color: + FlutterFlowTheme.of( + context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .labelMediumFamily), + ), + enabledBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .accent4, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 10.0), + ), + focusedBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .primary, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 10.0), + ), + errorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 10.0), + ), + focusedErrorBorder: + OutlineInputBorder( + borderSide: BorderSide( + color: + FlutterFlowTheme.of( + context) + .error, + width: 0.5, + ), + borderRadius: + BorderRadius.circular( + 10.0), + ), + suffixIcon: Icon( + Icons.text_fields, + color: FlutterFlowTheme.of( + context) + .accent1, + ), + ), + style: + FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of( + context) + .bodyMediumFamily, + color: FlutterFlowTheme + .of(context) + .primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of( + context) + .bodyMediumFamily), + ), + textAlign: TextAlign.start, + maxLines: null, + validator: _model + .textController3Validator + .asValidator(context), + ), + ), + ), + ], + ), + Container( + width: 100.0, + height: 54.0, + decoration: const BoxDecoration(), + ), + ], + ), + ), + ), + ], + ), + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + if ((_model.textController1.text != '') && + (_model.textController2.text != '') && + (_model.dropDownValue1 != null && + _model.dropDownValue1 != '') && + (_model.dropDownValue2 != null && + _model.dropDownValue2 != '')) { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: + MediaQuery.viewInsetsOf(context), + child: + VisitDetailsModalTemplateComponentWidget( + visitStartDateStr: + _model.textController1.text, + visitEndDateStr: + _model.textController2.text, + visitReasonStr: _model.dropDownValue1, + visitLevelStr: _model.dropDownValue2, + visitTempStr: + _model.switchValue == true + ? 'Sim' + : 'Não', + visitObsStr: + _model.textController3.text, + visitorStrList: _model.visitorStrList, + visitorJsonList: + _model.visitorJsonList, + updateToggleIdx: () async {}, + repeatVisitSchedule: () async {}, + ), + ), + ); + }, + ).then((value) => safeSetState(() {})); + } else { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: + MediaQuery.viewInsetsOf(context), + child: const ThrowExceptionWidget( + msg: + 'Campos obrigatórios imcompletos.', + ), + ), + ); + }, + ).then((value) => safeSetState(() {})); + } + }, + child: Container( + width: MediaQuery.sizeOf(context).width * 0.5, + height: 40.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: BorderRadius.circular(10.0), + ), + alignment: const AlignmentDirectional(0.0, 1.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Icon( + Icons.save_alt, + color: FlutterFlowTheme.of(context).info, + size: 24.0, + ), ), ), ), - ], + ].addToEnd(const SizedBox(height: 30.0)), ), - ); - } - }, + ), + Container( + width: double.infinity, + height: 900.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 20.0, + borderWidth: 1.0, + buttonSize: 40.0, + icon: Icon( + Icons.settings_sharp, + color: FlutterFlowTheme.of(context).primary, + size: 24.0, + ), + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus( + _model.unfocusNode) + : FocusScope.of(context) + .unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf( + context), + child: const OptModalWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + ), + ], + ), + FutureBuilder( + future: PhpGroup.getVisitsCall.call( + devUUID: FFAppState().devUUID, + userUUID: FFAppState().userUUID, + cliID: FFAppState().cliUUID, + atividade: 'getVisitas', + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme.of(context) + .primary, + size: 50.0, + ), + ), + ); + } + final wrapGetVisitsResponse = snapshot.data!; + return Builder( + builder: (context) { + final visitaWrap = PhpGroup.getVisitsCall + .visitasList( + wrapGetVisitsResponse.jsonBody, + ) + ?.toList() ?? + []; + return Wrap( + spacing: 2.0, + runSpacing: 1.0, + alignment: WrapAlignment.start, + crossAxisAlignment: + WrapCrossAlignment.start, + direction: Axis.horizontal, + runAlignment: WrapAlignment.start, + verticalDirection: VerticalDirection.down, + clipBehavior: Clip.none, + children: List.generate(visitaWrap.length, + (visitaWrapIndex) { + final visitaWrapItem = + visitaWrap[visitaWrapIndex]; + return InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: + Colors.transparent, + enableDrag: false, + useSafeArea: true, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode + .canRequestFocus + ? FocusScope.of(context) + .requestFocus(_model + .unfocusNode) + : FocusScope.of(context) + .unfocus(), + child: Padding( + padding: + MediaQuery.viewInsetsOf( + context), + child: + VisitDetailsModalTemplateComponentWidget( + visitStatusStr: + getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + ).toString(), + visitStartDateStr: + getJsonField( + visitaWrapItem, + r'''$.VAW_DTINICIO''', + ).toString(), + visitEndDateStr: + getJsonField( + visitaWrapItem, + r'''$.VAW_DTFIM''', + ).toString(), + visitReasonStr: + getJsonField( + visitaWrapItem, + r'''$.MOT_DESCRICAO''', + ).toString(), + visitLevelStr: + getJsonField( + visitaWrapItem, + r'''$.NAC_DESCRICAO''', + ).toString(), + visitTempStr: + getJsonField( + visitaWrapItem, + r'''$.VTE_UNICA''', + ).toString(), + visitObsStr: getJsonField( + visitaWrapItem, + r'''$.VAW_OBS''', + ).toString(), + visitorImgPath: + valueOrDefault< + String>( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitaWrapItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + visitorStrList: + getJsonField( + visitaWrapItem, + r'''$.VTE_DOCUMENTO''', + ).toString(), + visitIdStr: getJsonField( + visitaWrapItem, + r'''$.VAW_ID''', + ).toString(), + visitorJsonList: PhpGroup + .getVisitsCall + .visitasList( + wrapGetVisitsResponse + .jsonBody, + ), + updateToggleIdx: + () async {}, + repeatVisitSchedule: + () async {}, + ), + ), + ); + }, + ).then( + (value) => safeSetState(() {})); + }, + child: Card( + clipBehavior: + Clip.antiAliasWithSaveLayer, + color: FlutterFlowTheme.of(context) + .secondaryBackground, + elevation: 5.0, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(8.0), + ), + child: Container( + width: 350.0, + height: 115.0, + decoration: BoxDecoration( + color: + FlutterFlowTheme.of(context) + .secondaryBackground, + ), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Expanded( + child: Container( + width: 100.0, + height: 100.0, + decoration: + const BoxDecoration(), + child: Column( + mainAxisSize: + MainAxisSize.max, + children: [ + Row( + mainAxisSize: + MainAxisSize + .max, + children: [ + Text( + FFLocalizations.of( + context) + .getText( + 'i46frqyi' /* Visitante: */, + ), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + Align( + alignment: + const AlignmentDirectional( + -1.0, + -1.0), + child: Text( + getJsonField( + visitaWrapItem, + r'''$.VTE_NOME''', + ).toString(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ), + ].addToStart( + const SizedBox( + width: + 10.0)), + ), + Row( + mainAxisSize: + MainAxisSize + .max, + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Text( + FFLocalizations.of( + context) + .getText( + '73b1kj59' /* Início em: */, + ), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + Text( + getJsonField( + visitaWrapItem, + r'''$.VAW_DTINICIO''', + ).toString(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ].addToStart( + const SizedBox( + width: + 10.0)), + ), + Row( + mainAxisSize: + MainAxisSize + .max, + mainAxisAlignment: + MainAxisAlignment + .start, + children: [ + Text( + FFLocalizations.of( + context) + .getText( + 'klzzrfbn' /* Fim em: */, + ), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + fontWeight: + FontWeight + .bold, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + Text( + getJsonField( + visitaWrapItem, + r'''$.VAW_DTFIM''', + ).toString(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + fontSize: + 12.5, + letterSpacing: + 0.0, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ].addToStart( + const SizedBox( + width: + 10.0)), + ), + Align( + alignment: + const AlignmentDirectional( + -1.0, 0.0), + child: Padding( + padding: + const EdgeInsetsDirectional + .fromSTEB( + 10.0, + 0.0, + 0.0, + 0.0), + child: Container( + width: 200.0, + height: 27.0, + decoration: + BoxDecoration( + color: + valueOrDefault< + Color>( + () { + if (functions.jsonToStr( + getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FlutterFlowTheme.of(context) + .success; + } else if (functions.jsonToStr( + getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') { + return FlutterFlowTheme.of(context) + .error; + } else if (functions + .jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"') { + return FlutterFlowTheme.of(context) + .warning; + } else { + return FlutterFlowTheme.of(context) + .primary; + } + }(), + FlutterFlowTheme.of( + context) + .primary, + ), + borderRadius: + BorderRadius + .circular( + 5.0), + ), + child: Align( + alignment: + const AlignmentDirectional( + 0.0, + 0.0), + child: Text( + () { + if (functions + .jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FFLocalizations.of(context) + .getVariableText( + ptText: + 'Ativo', + enText: + 'Active', + ); + } else if ((functions.jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"F\"') || + (functions.jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') || + (functions.jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"B\"') || + (functions.jsonToStr(getJsonField( + visitaWrapItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"')) { + return FFLocalizations.of(context) + .getVariableText( + ptText: + 'Cancelado', + enText: + 'Canceled', + ); + } else { + return FFLocalizations.of(context) + .getVariableText( + ptText: + 'Pendente', + enText: + 'Pending', + ); + } + }(), + style: FlutterFlowTheme.of( + context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + color: + FlutterFlowTheme.of(context).info, + letterSpacing: + 0.0, + useGoogleFonts: + GoogleFonts.asMap().containsKey(FlutterFlowTheme.of(context).bodyMediumFamily), + ), + ), + ), + ), + ), + ), + ].divide(const SizedBox( + height: 3.0)), + ), + ), + ), + ClipRRect( + borderRadius: + BorderRadius.circular( + 0.0), + child: CachedNetworkImage( + fadeInDuration: const Duration( + milliseconds: 500), + fadeOutDuration: const Duration( + milliseconds: 500), + imageUrl: valueOrDefault< + String>( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitaWrapItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + fit: BoxFit.cover, + ), + ), + ], + ), + ), + ), + ); + }), + ); + }, + ); + }, + ), + ], + ), + ), + ), + ], + ), ), ], ), diff --git a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart index 90e61b98..f9c25f93 100644 --- a/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart +++ b/lib/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart @@ -3,6 +3,8 @@ import '/application_components/organism_components/bottom_arrow_linked_locals_c import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/flutter_flow_widgets.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:provider/provider.dart'; @@ -189,93 +191,92 @@ class _ScheduleProvisionalVisitPageWidgetState ), ), ), - Padding( - padding: const EdgeInsetsDirectional.fromSTEB( - 25.0, 0.0, 25.0, 0.0), - child: InkWell( - splashColor: Colors.transparent, - focusColor: Colors.transparent, - hoverColor: Colors.transparent, - highlightColor: Colors.transparent, - onTap: () async { - await showModalBottomSheet( - isScrollControlled: true, - backgroundColor: Colors.transparent, - enableDrag: false, - context: context, - builder: (context) { - return GestureDetector( - onTap: () => _model - .unfocusNode.canRequestFocus - ? FocusScope.of(context) - .requestFocus( - _model.unfocusNode) - : FocusScope.of(context) - .unfocus(), - child: Padding( - padding: MediaQuery.viewInsetsOf( - context), - child: - const BottomArrowLinkedLocalsComponentWidget(), - ), - ); - }, - ).then((value) => safeSetState(() {})); - }, - child: Container( - width: double.infinity, - height: 51.0, - decoration: BoxDecoration( + Stack( + children: [ + FFButtonWidget( + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => _model + .unfocusNode.canRequestFocus + ? FocusScope.of(context) + .requestFocus( + _model.unfocusNode) + : FocusScope.of(context) + .unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf( + context), + child: + const BottomArrowLinkedLocalsComponentWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + text: FFAppState().local, + options: FFButtonOptions( + width: 320.0, + height: 51.0, + padding: const EdgeInsetsDirectional.fromSTEB( + 24.0, 0.0, 24.0, 0.0), + iconPadding: + const EdgeInsetsDirectional.fromSTEB( + 0.0, 0.0, 0.0, 0.0), color: FlutterFlowTheme.of(context) - .secondaryBackground, - borderRadius: BorderRadius.circular(24.0), - border: Border.all( + .primaryBackground, + textStyle: FlutterFlowTheme.of(context) + .titleSmall + .override( + fontFamily: + FlutterFlowTheme.of(context) + .titleSmallFamily, + color: FlutterFlowTheme.of(context) + .primaryText, + fontSize: 14.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .titleSmallFamily), + ), + borderSide: BorderSide( color: FlutterFlowTheme.of(context) .primaryText, width: 0.3, ), - ), - child: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Container( - width: 35.0, - height: 35.0, - clipBehavior: Clip.antiAlias, - decoration: const BoxDecoration( - shape: BoxShape.circle, - ), - child: Image.network( - valueOrDefault( - 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', - 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', - ), - fit: BoxFit.cover, - ), - ), - Text( - FFAppState().local, - style: FlutterFlowTheme.of(context) - .bodyMedium - .override( - fontFamily: - FlutterFlowTheme.of(context) - .bodyMediumFamily, - letterSpacing: 0.0, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - FlutterFlowTheme.of( - context) - .bodyMediumFamily), - ), - ), - ], + borderRadius: BorderRadius.circular(24.0), ), ), - ), + Padding( + padding: const EdgeInsetsDirectional.fromSTEB( + 20.0, 10.0, 0.0, 0.0), + child: Container( + width: 35.0, + height: 35.0, + clipBehavior: Clip.antiAlias, + decoration: const BoxDecoration( + shape: BoxShape.circle, + ), + child: CachedNetworkImage( + fadeInDuration: + const Duration(milliseconds: 100), + fadeOutDuration: + const Duration(milliseconds: 100), + imageUrl: valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + fit: BoxFit.cover, + ), + ), + ), + ], ), ].addToEnd(const SizedBox(height: 20.0)), ), diff --git a/lib/backend/api_requests/api_calls.dart b/lib/backend/api_requests/api_calls.dart index 33deadb3..2e3593d1 100644 --- a/lib/backend/api_requests/api_calls.dart +++ b/lib/backend/api_requests/api_calls.dart @@ -21,6 +21,7 @@ class PhpGroup { static PostScheduleVisitorCall postScheduleVisitorCall = PostScheduleVisitorCall(); static PostScheduleVisitCall postScheduleVisitCall = PostScheduleVisitCall(); + static DebugCallCall debugCallCall = DebugCallCall(); static GetScheduleVisitCall getScheduleVisitCall = GetScheduleVisitCall(); static GetDadosCall getDadosCall = GetDadosCall(); static GetVisitorByDocCall getVisitorByDocCall = GetVisitorByDocCall(); @@ -29,7 +30,7 @@ class PhpGroup { PostProvVisitSchedulingCall(); static GetVisitsCall getVisitsCall = GetVisitsCall(); static DeleteVisitCall deleteVisitCall = DeleteVisitCall(); - static DebugCall debugCall = DebugCall(); + static GetPessoasLocalCall getPessoasLocalCall = GetPessoasLocalCall(); } class LoginCall { @@ -341,7 +342,7 @@ class PostScheduleVisitCall { Future call({ String? devUUID = '', String? userUUID = '', - String? cliUUID = '', + String? cliID = '', String? atividade = '', String? devDesc = '', String? idVisitante = '', @@ -364,7 +365,64 @@ class PostScheduleVisitCall { params: { 'devUUID': devUUID, 'userUUID': userUUID, - 'cliID': cliUUID, + 'cliID': cliID, + 'atividade': atividade, + 'idVisitante': idVisitante, + 'dtInicio': dtInicio, + 'dtFim': dtFim, + 'unica': unica, + 'idMotivo': idMotivo, + 'idNAC': idNAC, + 'obs': obs, + 'DevDesc': devDesc, + }, + bodyType: BodyType.X_WWW_FORM_URL_ENCODED, + returnBody: true, + encodeBodyUtf8: false, + decodeUtf8: false, + cache: false, + alwaysAllowBody: false, + ); + } + + bool? error(dynamic response) => castToType(getJsonField( + response, + r'''$.error''', + )); + String? errorMsg(dynamic response) => castToType(getJsonField( + response, + r'''$.error_msg''', + )); +} + +class DebugCallCall { + Future call({ + String? devUUID = '', + String? userUUID = '', + String? cliID = '', + String? atividade = '', + String? devDesc = '', + String? idVisitante = '', + String? dtInicio = '', + String? dtFim = '', + String? unica = '', + int? idMotivo, + int? idNAC, + String? obs = '', + }) async { + final baseUrl = PhpGroup.getBaseUrl(); + + return ApiManager.instance.makeApiCall( + callName: 'debugCall', + apiUrl: '$baseUrl/jonh.php', + callType: ApiCallType.POST, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'devUUID': devUUID, + 'userUUID': userUUID, + 'cliID': cliID, 'atividade': atividade, 'DevDesc': devDesc, 'idVisitante': idVisitante, @@ -1363,17 +1421,29 @@ class DeleteVisitCall { )); } -class DebugCall { - Future call() async { +class GetPessoasLocalCall { + Future call({ + String? cliID = '', + String? ownID = '', + String? devUUID = '', + String? userUUID = '', + }) async { final baseUrl = PhpGroup.getBaseUrl(); return ApiManager.instance.makeApiCall( - callName: 'debug', - apiUrl: '$baseUrl/jonh.php', + callName: 'getPessoasLocal', + apiUrl: '$baseUrl/getPessoasLocal.php', callType: ApiCallType.POST, - headers: {}, - params: {}, - bodyType: BodyType.JSON, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + params: { + 'cliID': cliID, + 'ownID': ownID, + 'devUUID': devUUID, + 'userUUID': userUUID, + }, + bodyType: BodyType.X_WWW_FORM_URL_ENCODED, returnBody: true, encodeBodyUtf8: false, decodeUtf8: false, @@ -1381,6 +1451,34 @@ class DebugCall { alwaysAllowBody: false, ); } + + bool? error(dynamic response) => castToType(getJsonField( + response, + r'''$.error''', + )); + List? pessoas(dynamic response) => getJsonField( + response, + r'''$.pessoas''', + true, + ) as List?; + List? usuEmail(dynamic response) => (getJsonField( + response, + r'''$.pessoas[:].USU_EMAIL''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); + List? usuNome(dynamic response) => (getJsonField( + response, + r'''$.pessoas[:].USU_NOME''', + true, + ) as List?) + ?.withoutNulls + .map((x) => castToType(x)) + .withoutNulls + .toList(); } /// End PHP Group Code diff --git a/lib/backend/push_notifications/push_notifications_handler.dart b/lib/backend/push_notifications/push_notifications_handler.dart index 8aec8b70..5381ff15 100644 --- a/lib/backend/push_notifications/push_notifications_handler.dart +++ b/lib/backend/push_notifications/push_notifications_handler.dart @@ -110,20 +110,10 @@ final parametersBuilderMap = }, ), 'ForgotPasswordPage': ParameterData.none(), - 'homePage': (data) async => ParameterData( - allParams: { - 'userUUID': getParameter(data, 'userUUID'), - 'devUUID': getParameter(data, 'devUUID'), - }, - ), + 'homePage': ParameterData.none(), 'RegisterPage': ParameterData.none(), 'WelcomePage': ParameterData.none(), - 'registerVisitorPage': (data) async => ParameterData( - allParams: { - 'userUUID': getParameter(data, 'userUUID'), - 'devUUID': getParameter(data, 'devUUID'), - }, - ), + 'registerVisitorPage': ParameterData.none(), 'scheduleCompleteVisitPage': (data) async => ParameterData( allParams: { 'visitorStrList': getParameter(data, 'visitorStrList'), @@ -136,6 +126,10 @@ final parametersBuilderMap = }, ), 'scheduleProvisionalVisitPage': ParameterData.none(), + 'onBoardingPage': ParameterData.none(), + 'fastPassPage': ParameterData.none(), + 'test': ParameterData.none(), + 'peopleOnThePropertyPage': ParameterData.none(), }; Map getInitialParameterData(Map data) { diff --git a/lib/backend/schema/structs/device_struct.dart b/lib/backend/schema/structs/device_struct.dart new file mode 100644 index 00000000..03db22f3 --- /dev/null +++ b/lib/backend/schema/structs/device_struct.dart @@ -0,0 +1,110 @@ +// ignore_for_file: unnecessary_getters_setters + +import '/backend/schema/util/schema_util.dart'; + +import 'index.dart'; +import '/flutter_flow/flutter_flow_util.dart'; + +class DeviceStruct extends BaseStruct { + DeviceStruct({ + String? devUUID, + String? version, + String? description, + }) : _devUUID = devUUID, + _version = version, + _description = description; + + // "devUUID" field. + String? _devUUID; + String get devUUID => _devUUID ?? ''; + set devUUID(String? val) => _devUUID = val; + bool hasDevUUID() => _devUUID != null; + + // "version" field. + String? _version; + String get version => _version ?? ''; + set version(String? val) => _version = val; + bool hasVersion() => _version != null; + + // "description" field. + String? _description; + String get description => _description ?? ''; + set description(String? val) => _description = val; + bool hasDescription() => _description != null; + + static DeviceStruct fromMap(Map data) => DeviceStruct( + devUUID: data['devUUID'] as String?, + version: data['version'] as String?, + description: data['description'] as String?, + ); + + static DeviceStruct? maybeFromMap(dynamic data) => + data is Map ? DeviceStruct.fromMap(data.cast()) : null; + + Map toMap() => { + 'devUUID': _devUUID, + 'version': _version, + 'description': _description, + }.withoutNulls; + + @override + Map toSerializableMap() => { + 'devUUID': serializeParam( + _devUUID, + ParamType.String, + ), + 'version': serializeParam( + _version, + ParamType.String, + ), + 'description': serializeParam( + _description, + ParamType.String, + ), + }.withoutNulls; + + static DeviceStruct fromSerializableMap(Map data) => + DeviceStruct( + devUUID: deserializeParam( + data['devUUID'], + ParamType.String, + false, + ), + version: deserializeParam( + data['version'], + ParamType.String, + false, + ), + description: deserializeParam( + data['description'], + ParamType.String, + false, + ), + ); + + @override + String toString() => 'DeviceStruct(${toMap()})'; + + @override + bool operator ==(Object other) { + return other is DeviceStruct && + devUUID == other.devUUID && + version == other.version && + description == other.description; + } + + @override + int get hashCode => + const ListEquality().hash([devUUID, version, description]); +} + +DeviceStruct createDeviceStruct({ + String? devUUID, + String? version, + String? description, +}) => + DeviceStruct( + devUUID: devUUID, + version: version, + description: description, + ); diff --git a/lib/backend/schema/structs/index.dart b/lib/backend/schema/structs/index.dart index bc8583f6..0c01c05d 100644 --- a/lib/backend/schema/structs/index.dart +++ b/lib/backend/schema/structs/index.dart @@ -1,3 +1,4 @@ export '/backend/schema/util/schema_util.dart'; export 'action_struct.dart'; +export 'device_struct.dart'; diff --git a/lib/custom_code/actions/get_dev_u_u_i_d.dart b/lib/custom_code/actions/get_dev_u_u_i_d.dart new file mode 100644 index 00000000..6d4843e7 --- /dev/null +++ b/lib/custom_code/actions/get_dev_u_u_i_d.dart @@ -0,0 +1,28 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom action code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; + +Future getDevUUID() async { + var deviceInfo = DeviceInfoPlugin(); + if (Platform.isIOS) { + // import 'dart:io' + var iosDeviceInfo = await deviceInfo.iosInfo; + return iosDeviceInfo.identifierForVendor; // unique ID on iOS + } else if (Platform.isAndroid) { + var androidDeviceInfo = await deviceInfo.androidInfo; + print(AndroidDeviceInfo); + return androidDeviceInfo.serialNumber; // unique ID on Android + } +} diff --git a/lib/custom_code/actions/index.dart b/lib/custom_code/actions/index.dart index 91a5451a..2110f043 100644 --- a/lib/custom_code/actions/index.dart +++ b/lib/custom_code/actions/index.dart @@ -1,2 +1,3 @@ export 'convert_image_file_to_base64.dart' show convertImageFileToBase64; export 'convert_to_upload_file.dart' show convertToUploadFile; +export 'get_dev_u_u_i_d.dart' show getDevUUID; diff --git a/lib/custom_code/widgets/image_cropper.dart b/lib/custom_code/widgets/image_cropper.dart new file mode 100644 index 00000000..459c718b --- /dev/null +++ b/lib/custom_code/widgets/image_cropper.dart @@ -0,0 +1,179 @@ +// Automatic FlutterFlow imports +import '/backend/schema/structs/index.dart'; +import '/backend/schema/enums/enums.dart'; +import '/actions/actions.dart' as action_blocks; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'index.dart'; // Imports other custom widgets +import '/custom_code/actions/index.dart'; // Imports custom actions +import '/flutter_flow/custom_functions.dart'; // Imports custom functions +import 'package:flutter/material.dart'; +// Begin custom widget code +// DO NOT REMOVE OR MODIFY THE CODE ABOVE! + +import 'package:crop_your_image/crop_your_image.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '/backend/firebase_storage/storage.dart'; + +class ImageCropper extends StatefulWidget { + const ImageCropper({ + super.key, + this.width, + this.height, + this.imageFile, + this.callBackAction, + this.currentUserId, + }); + + final double? width; + final double? height; + final FFUploadedFile? imageFile; + final Future Function(String? url)? callBackAction; + final String? currentUserId; + + @override + State createState() => _ImageCropperState(); +} + +class _ImageCropperState extends State { + bool loading = false; + final _crop_controller = CropController(); + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: widget.width ?? double.infinity, + height: (widget.height ?? 555) - 80, + child: Center( + child: Crop( + image: Uint8List.fromList(widget.imageFile!.bytes!), + controller: _crop_controller, + onCropped: (image) async { + final path = _getStoragePath(_firebasePathPrefix(), + widget.imageFile!.name!, false, 0); + uploadData(path, image).then((value) { + print('image cropped'); + widget.callBackAction!.call(value!); + loading = false; + }); + // add error handling here + }, + + aspectRatio: 1 / 1, + initialSize: 0.5, + // initialArea: Rect.fromLTWH(240, 212, 800, 600),\ + //initialAreaBuilder: (rect) => Rect.fromLTRB(rect.left + 80, rect.top + 80, rect.right - 80, rect.bottom - 80), + withCircleUi: true, + baseColor: Color.fromARGB(255, 0, 3, 22), + maskColor: Colors.white.withAlpha(100), + radius: 20, + + onMoved: (newRect) { + // do something with current cropping area. + }, + onStatusChanged: (status) { + // do something with current CropStatus + }, + cornerDotBuilder: (size, edgeAlignment) => + const DotControl(color: Colors.white), + interactive: true, + // fixArea: true, + ))), + Padding( + padding: EdgeInsetsDirectional.fromSTEB(8, 5, 8, 5), + child: ElevatedButton( + onPressed: () async { + if (!loading) { + setState(() { + loading = true; + }); + print('Button pressed ...'); + _crop_controller.crop(); + + //widget.loading = true; + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + FlutterFlowTheme.of(context).primaryColor, + ), + padding: MaterialStateProperty.all( + EdgeInsets.zero, + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(100), + side: BorderSide.none, + ), + ), + ), + child: Container( + width: 250, + height: 50, + alignment: Alignment.center, + child: loading + ? CircularProgressIndicator( + valueColor: + AlwaysStoppedAnimation(Colors.white), + ) + : Text( + 'Crop', + style: FlutterFlowTheme.of(context) + .subtitle2 + .override( + fontFamily: 'Lexend', + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.normal, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .subtitle2Family), + ), + ), + ), + )), + ]), + Positioned( + top: 4, + right: 4, + child: IconButton( + icon: Icon(Icons.close), + onPressed: () => Navigator.pop(context), + )) + ], + ); + } + + String _getStoragePath( + String? pathPrefix, + String filePath, + bool isVideo, [ + int? index, + ]) { + pathPrefix ??= _firebasePathPrefix(); + pathPrefix = _removeTrailingSlash(pathPrefix); + final timestamp = DateTime.now().microsecondsSinceEpoch; + final prefix = 'cropped-'; + // Workaround fixed by https://github.com/flutter/plugins/pull/3685 + // (not yet in stable). + final ext = isVideo ? 'mp4' : filePath.split('.').last; + final indexStr = index != null ? '_$index' : ''; + return '$pathPrefix/$prefix$timestamp$indexStr.$ext'; + } + + String? _removeTrailingSlash(String? path) => + path != null && path.endsWith('/') + ? path.substring(0, path.length - 1) + : path; + + String _firebasePathPrefix() => 'users/${widget.currentUserId}/uploads'; +} +// Set your widget name, define your parameter, and then add the +// boilerplate code using the green button on the right! diff --git a/lib/custom_code/widgets/index.dart b/lib/custom_code/widgets/index.dart new file mode 100644 index 00000000..ec35fd3e --- /dev/null +++ b/lib/custom_code/widgets/index.dart @@ -0,0 +1 @@ +export 'image_cropper.dart' show ImageCropper; diff --git a/lib/flutter_flow/flutter_flow_button_tabbar.dart b/lib/flutter_flow/flutter_flow_button_tabbar.dart new file mode 100644 index 00000000..66b374b4 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_button_tabbar.dart @@ -0,0 +1,854 @@ +import 'dart:math' as math; +import 'dart:ui' show lerpDouble; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart' show DragStartBehavior; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +const double _kTabHeight = 46.0; + +typedef _LayoutCallback = void Function( + List xOffsets, TextDirection textDirection, double width); + +class _TabLabelBarRenderer extends RenderFlex { + _TabLabelBarRenderer({ + required super.direction, + required super.mainAxisSize, + required super.mainAxisAlignment, + required super.crossAxisAlignment, + required TextDirection super.textDirection, + required super.verticalDirection, + required this.onPerformLayout, + }); + + _LayoutCallback onPerformLayout; + + @override + void performLayout() { + super.performLayout(); + // xOffsets will contain childCount+1 values, giving the offsets of the + // leading edge of the first tab as the first value, of the leading edge of + // the each subsequent tab as each subsequent value, and of the trailing + // edge of the last tab as the last value. + RenderBox? child = firstChild; + final List xOffsets = []; + while (child != null) { + final FlexParentData childParentData = + child.parentData! as FlexParentData; + xOffsets.add(childParentData.offset.dx); + assert(child.parentData == childParentData); + child = childParentData.nextSibling; + } + assert(textDirection != null); + switch (textDirection!) { + case TextDirection.rtl: + xOffsets.insert(0, size.width); + break; + case TextDirection.ltr: + xOffsets.add(size.width); + break; + } + onPerformLayout(xOffsets, textDirection!, size.width); + } +} + +// This class and its renderer class only exist to report the widths of the tabs +// upon layout. The tab widths are only used at paint time (see _IndicatorPainter) +// or in response to input. +class _TabLabelBar extends Flex { + const _TabLabelBar({ + required super.children, + required this.onPerformLayout, + }) : super( + direction: Axis.horizontal, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + verticalDirection: VerticalDirection.down, + ); + + final _LayoutCallback onPerformLayout; + + @override + RenderFlex createRenderObject(BuildContext context) { + return _TabLabelBarRenderer( + direction: direction, + mainAxisAlignment: mainAxisAlignment, + mainAxisSize: mainAxisSize, + crossAxisAlignment: crossAxisAlignment, + textDirection: getEffectiveTextDirection(context)!, + verticalDirection: verticalDirection, + onPerformLayout: onPerformLayout, + ); + } + + @override + void updateRenderObject( + BuildContext context, _TabLabelBarRenderer renderObject) { + super.updateRenderObject(context, renderObject); + renderObject.onPerformLayout = onPerformLayout; + } +} + +class _IndicatorPainter extends CustomPainter { + _IndicatorPainter({ + required this.controller, + required this.tabKeys, + required _IndicatorPainter? old, + }) : super(repaint: controller.animation) { + if (old != null) { + saveTabOffsets(old._currentTabOffsets, old._currentTextDirection); + } + } + + final TabController controller; + + final List tabKeys; + + // _currentTabOffsets and _currentTextDirection are set each time TabBar + // layout is completed. These values can be null when TabBar contains no + // tabs, since there are nothing to lay out. + List? _currentTabOffsets; + TextDirection? _currentTextDirection; + + BoxPainter? _painter; + bool _needsPaint = false; + void markNeedsPaint() { + _needsPaint = true; + } + + void dispose() { + _painter?.dispose(); + } + + void saveTabOffsets(List? tabOffsets, TextDirection? textDirection) { + _currentTabOffsets = tabOffsets; + _currentTextDirection = textDirection; + } + + // _currentTabOffsets[index] is the offset of the start edge of the tab at index, and + // _currentTabOffsets[_currentTabOffsets.length] is the end edge of the last tab. + int get maxTabIndex => _currentTabOffsets!.length - 2; + + double centerOf(int tabIndex) { + assert(_currentTabOffsets != null); + assert(_currentTabOffsets!.isNotEmpty); + assert(tabIndex >= 0); + assert(tabIndex <= maxTabIndex); + return (_currentTabOffsets![tabIndex] + _currentTabOffsets![tabIndex + 1]) / + 2.0; + } + + @override + void paint(Canvas canvas, Size size) { + _needsPaint = false; + } + + @override + bool shouldRepaint(_IndicatorPainter old) { + return _needsPaint || + controller != old.controller || + tabKeys.length != old.tabKeys.length || + (!listEquals(_currentTabOffsets, old._currentTabOffsets)) || + _currentTextDirection != old._currentTextDirection; + } +} + +// This class, and TabBarScrollController, only exist to handle the case +// where a scrollable TabBar has a non-zero initialIndex. In that case we can +// only compute the scroll position's initial scroll offset (the "correct" +// pixels value) after the TabBar viewport width and scroll limits are known. + +class _TabBarScrollPosition extends ScrollPositionWithSingleContext { + _TabBarScrollPosition({ + required super.physics, + required super.context, + required super.oldPosition, + required this.tabBar, + }) : super( + initialPixels: null, + ); + + final _FlutterFlowButtonTabBarState tabBar; + + bool _viewportDimensionWasNonZero = false; + + // Position should be adjusted at least once. + bool _needsPixelsCorrection = true; + + @override + bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) { + bool result = true; + if (!_viewportDimensionWasNonZero) { + _viewportDimensionWasNonZero = viewportDimension != 0.0; + } + // If the viewport never had a non-zero dimension, we just want to jump + // to the initial scroll position to avoid strange scrolling effects in + // release mode: In release mode, the viewport temporarily may have a + // dimension of zero before the actual dimension is calculated. In that + // scenario, setting the actual dimension would cause a strange scroll + // effect without this guard because the super call below would starts a + // ballistic scroll activity. + if (!_viewportDimensionWasNonZero || _needsPixelsCorrection) { + _needsPixelsCorrection = false; + correctPixels(tabBar._initialScrollOffset( + viewportDimension, minScrollExtent, maxScrollExtent)); + result = false; + } + return super.applyContentDimensions(minScrollExtent, maxScrollExtent) && + result; + } + + void markNeedsPixelsCorrection() { + _needsPixelsCorrection = true; + } +} + +// This class, and TabBarScrollPosition, only exist to handle the case +// where a scrollable TabBar has a non-zero initialIndex. +class _TabBarScrollController extends ScrollController { + _TabBarScrollController(this.tabBar); + + final _FlutterFlowButtonTabBarState tabBar; + + @override + ScrollPosition createScrollPosition(ScrollPhysics physics, + ScrollContext context, ScrollPosition? oldPosition) { + return _TabBarScrollPosition( + physics: physics, + context: context, + oldPosition: oldPosition, + tabBar: tabBar, + ); + } +} + +/// A Flutterflow Design widget that displays a horizontal row of tabs. +class FlutterFlowButtonTabBar extends StatefulWidget + implements PreferredSizeWidget { + /// The [tabs] argument must not be null and its length must match the [controller]'s + /// [TabController.length]. + /// + /// If a [TabController] is not provided, then there must be a + /// [DefaultTabController] ancestor. + /// + const FlutterFlowButtonTabBar({ + super.key, + required this.tabs, + this.controller, + this.isScrollable = false, + this.useToggleButtonStyle = false, + this.dragStartBehavior = DragStartBehavior.start, + this.onTap, + this.backgroundColor, + this.unselectedBackgroundColor, + this.decoration, + this.unselectedDecoration, + this.labelStyle, + this.unselectedLabelStyle, + this.labelColor, + this.unselectedLabelColor, + this.borderWidth = 0, + this.borderColor = Colors.transparent, + this.unselectedBorderColor = Colors.transparent, + this.physics = const BouncingScrollPhysics(), + this.labelPadding = const EdgeInsets.symmetric(horizontal: 4), + this.buttonMargin = const EdgeInsets.all(4), + this.padding = EdgeInsets.zero, + this.borderRadius = 8.0, + this.elevation = 0, + }); + + /// Typically a list of two or more [Tab] widgets. + /// + /// The length of this list must match the [controller]'s [TabController.length] + /// and the length of the [TabBarView.children] list. + final List tabs; + + /// This widget's selection and animation state. + /// + /// If [TabController] is not provided, then the value of [DefaultTabController.of] + /// will be used. + final TabController? controller; + + /// Whether this tab bar can be scrolled horizontally. + /// + /// If [isScrollable] is true, then each tab is as wide as needed for its label + /// and the entire [FlutterFlowButtonTabBar] is scrollable. Otherwise each tab gets an equal + /// share of the available space. + final bool isScrollable; + + /// Whether the tab buttons should be styled as toggle buttons. + final bool useToggleButtonStyle; + + /// The background [Color] of the button on its selected state. + final Color? backgroundColor; + + /// The background [Color] of the button on its unselected state. + final Color? unselectedBackgroundColor; + + /// The [BoxDecoration] of the button on its selected state. + /// + /// If [BoxDecoration] is not provided, [backgroundColor] is used. + final BoxDecoration? decoration; + + /// The [BoxDecoration] of the button on its unselected state. + /// + /// If [BoxDecoration] is not provided, [unselectedBackgroundColor] is used. + final BoxDecoration? unselectedDecoration; + + /// The [TextStyle] of the button's [Text] on its selected state. The color provided + /// on the TextStyle will be used for the [Icon]'s color. + final TextStyle? labelStyle; + + /// The color of selected tab labels. + final Color? labelColor; + + /// The color of unselected tab labels. + final Color? unselectedLabelColor; + + /// The [TextStyle] of the button's [Text] on its unselected state. The color provided + /// on the TextStyle will be used for the [Icon]'s color. + final TextStyle? unselectedLabelStyle; + + /// The with of solid [Border] for each button. If no value is provided, the border + /// is not drawn. + final double borderWidth; + + /// The [Color] of solid [Border] for each button. + final Color? borderColor; + + /// The [Color] of solid [Border] for each button. If no value is provided, the value of + /// [this.borderColor] is used. + final Color? unselectedBorderColor; + + /// The [EdgeInsets] used for the [Padding] of the buttons' content. + /// + /// The default value is [EdgeInsets.symmetric(horizontal: 4)]. + final EdgeInsetsGeometry labelPadding; + + /// The [EdgeInsets] used for the [Margin] of the buttons. + /// + /// The default value is [EdgeInsets.all(4)]. + final EdgeInsetsGeometry buttonMargin; + + /// The amount of space by which to inset the tab bar. + final EdgeInsetsGeometry? padding; + + /// The value of the [BorderRadius.circular] applied to each button. + final double borderRadius; + + /// The value of the [elevation] applied to each button. + final double elevation; + + final DragStartBehavior dragStartBehavior; + + final ValueChanged? onTap; + + final ScrollPhysics? physics; + + /// A size whose height depends on if the tabs have both icons and text. + /// + /// [AppBar] uses this size to compute its own preferred size. + @override + Size get preferredSize { + double maxHeight = _kTabHeight; + for (final Widget item in tabs) { + if (item is PreferredSizeWidget) { + final double itemHeight = item.preferredSize.height; + maxHeight = math.max(itemHeight, maxHeight); + } + } + return Size.fromHeight( + maxHeight + labelPadding.vertical + buttonMargin.vertical); + } + + @override + State createState() => + _FlutterFlowButtonTabBarState(); +} + +class _FlutterFlowButtonTabBarState extends State + with TickerProviderStateMixin { + ScrollController? _scrollController; + TabController? _controller; + _IndicatorPainter? _indicatorPainter; + late AnimationController _animationController; + int _currentIndex = 0; + int _prevIndex = -1; + + late double _tabStripWidth; + late List _tabKeys; + + final GlobalKey _tabsParentKey = GlobalKey(); + + bool _debugHasScheduledValidTabsCountCheck = false; + + @override + void initState() { + super.initState(); + // If indicatorSize is TabIndicatorSize.label, _tabKeys[i] is used to find + // the width of tab widget i. See _IndicatorPainter.indicatorRect(). + _tabKeys = widget.tabs.map((tab) => GlobalKey()).toList(); + + /// The animation duration is 2/3 of the tab scroll animation duration in + /// Material design (kTabScrollDuration). + _animationController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 200)); + + // so the buttons start in their "final" state (color) + _animationController + ..value = 1.0 + ..addListener(() { + if (mounted) { + setState(() {}); + } + }); + } + + // If the TabBar is rebuilt with a new tab controller, the caller should + // dispose the old one. In that case the old controller's animation will be + // null and should not be accessed. + bool get _controllerIsValid => _controller?.animation != null; + + void _updateTabController() { + final TabController? newController = + widget.controller ?? DefaultTabController.maybeOf(context); + assert(() { + if (newController == null) { + throw FlutterError( + 'No TabController for ${widget.runtimeType}.\n' + 'When creating a ${widget.runtimeType}, you must either provide an explicit ' + 'TabController using the "controller" property, or you must ensure that there ' + 'is a DefaultTabController above the ${widget.runtimeType}.\n' + 'In this case, there was neither an explicit controller nor a default controller.', + ); + } + return true; + }()); + + if (newController == _controller) { + return; + } + + if (_controllerIsValid) { + _controller!.animation!.removeListener(_handleTabControllerAnimationTick); + _controller!.removeListener(_handleTabControllerTick); + } + _controller = newController; + if (_controller != null) { + _controller!.animation!.addListener(_handleTabControllerAnimationTick); + _controller!.addListener(_handleTabControllerTick); + _currentIndex = _controller!.index; + } + } + + void _initIndicatorPainter() { + _indicatorPainter = !_controllerIsValid + ? null + : _IndicatorPainter( + controller: _controller!, + tabKeys: _tabKeys, + old: _indicatorPainter, + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + assert(debugCheckHasMaterial(context)); + _updateTabController(); + _initIndicatorPainter(); + } + + @override + void didUpdateWidget(FlutterFlowButtonTabBar oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.controller != oldWidget.controller) { + _updateTabController(); + _initIndicatorPainter(); + // Adjust scroll position. + if (_scrollController != null) { + final ScrollPosition position = _scrollController!.position; + if (position is _TabBarScrollPosition) { + position.markNeedsPixelsCorrection(); + } + } + } + + if (widget.tabs.length > _tabKeys.length) { + final int delta = widget.tabs.length - _tabKeys.length; + _tabKeys.addAll(List.generate(delta, (int n) => GlobalKey())); + } else if (widget.tabs.length < _tabKeys.length) { + _tabKeys.removeRange(widget.tabs.length, _tabKeys.length); + } + } + + @override + void dispose() { + _indicatorPainter!.dispose(); + if (_controllerIsValid) { + _controller!.animation!.removeListener(_handleTabControllerAnimationTick); + _controller!.removeListener(_handleTabControllerTick); + } + _controller = null; + // We don't own the _controller Animation, so it's not disposed here. + super.dispose(); + } + + int get maxTabIndex => _indicatorPainter!.maxTabIndex; + + double _tabScrollOffset( + int index, double viewportWidth, double minExtent, double maxExtent) { + if (!widget.isScrollable) { + return 0.0; + } + double tabCenter = _indicatorPainter!.centerOf(index); + double paddingStart; + switch (Directionality.of(context)) { + case TextDirection.rtl: + paddingStart = widget.padding?.resolve(TextDirection.rtl).right ?? 0; + tabCenter = _tabStripWidth - tabCenter; + break; + case TextDirection.ltr: + paddingStart = widget.padding?.resolve(TextDirection.ltr).left ?? 0; + break; + } + + return clampDouble( + tabCenter + paddingStart - viewportWidth / 2.0, minExtent, maxExtent); + } + + double _tabCenteredScrollOffset(int index) { + final ScrollPosition position = _scrollController!.position; + return _tabScrollOffset(index, position.viewportDimension, + position.minScrollExtent, position.maxScrollExtent); + } + + double _initialScrollOffset( + double viewportWidth, double minExtent, double maxExtent) { + return _tabScrollOffset(_currentIndex, viewportWidth, minExtent, maxExtent); + } + + void _scrollToCurrentIndex() { + final double offset = _tabCenteredScrollOffset(_currentIndex); + _scrollController! + .animateTo(offset, duration: kTabScrollDuration, curve: Curves.ease); + } + + void _scrollToControllerValue() { + final double? leadingPosition = + _currentIndex > 0 ? _tabCenteredScrollOffset(_currentIndex - 1) : null; + final double middlePosition = _tabCenteredScrollOffset(_currentIndex); + final double? trailingPosition = _currentIndex < maxTabIndex + ? _tabCenteredScrollOffset(_currentIndex + 1) + : null; + + final double index = _controller!.index.toDouble(); + final double value = _controller!.animation!.value; + final double offset; + if (value == index - 1.0) { + offset = leadingPosition ?? middlePosition; + } else if (value == index + 1.0) { + offset = trailingPosition ?? middlePosition; + } else if (value == index) { + offset = middlePosition; + } else if (value < index) { + offset = leadingPosition == null + ? middlePosition + : lerpDouble(middlePosition, leadingPosition, index - value)!; + } else { + offset = trailingPosition == null + ? middlePosition + : lerpDouble(middlePosition, trailingPosition, value - index)!; + } + + _scrollController!.jumpTo(offset); + } + + void _handleTabControllerAnimationTick() { + assert(mounted); + if (!_controller!.indexIsChanging && widget.isScrollable) { + // Sync the TabBar's scroll position with the TabBarView's PageView. + _currentIndex = _controller!.index; + _scrollToControllerValue(); + } + } + + void _handleTabControllerTick() { + if (_controller!.index != _currentIndex) { + _prevIndex = _currentIndex; + _currentIndex = _controller!.index; + _triggerAnimation(); + if (widget.isScrollable) { + _scrollToCurrentIndex(); + } + } + setState(() { + // Rebuild the tabs after a (potentially animated) index change + // has completed. + }); + } + + void _triggerAnimation() { + // reset the animation so it's ready to go + _animationController + ..reset() + ..forward(); + } + + // Called each time layout completes. + void _saveTabOffsets( + List tabOffsets, TextDirection textDirection, double width) { + _tabStripWidth = width; + _indicatorPainter?.saveTabOffsets(tabOffsets, textDirection); + } + + void _handleTap(int index) { + assert(index >= 0 && index < widget.tabs.length); + _controller?.animateTo(index); + widget.onTap?.call(index); + } + + Widget _buildStyledTab(Widget child, int index) { + final TabBarTheme tabBarTheme = TabBarTheme.of(context); + + final double animationValue; + if (index == _currentIndex) { + animationValue = _animationController.value; + } else if (index == _prevIndex) { + animationValue = 1 - _animationController.value; + } else { + animationValue = 0; + } + + final TextStyle? textStyle = TextStyle.lerp( + (widget.unselectedLabelStyle ?? + tabBarTheme.labelStyle ?? + DefaultTextStyle.of(context).style) + .copyWith( + color: widget.unselectedLabelColor, + ), + (widget.labelStyle ?? + tabBarTheme.labelStyle ?? + DefaultTextStyle.of(context).style) + .copyWith( + color: widget.labelColor, + ), + animationValue); + + final Color? textColor = Color.lerp( + widget.unselectedLabelColor, widget.labelColor, animationValue); + + final Color? borderColor = Color.lerp( + widget.unselectedBorderColor, widget.borderColor, animationValue); + + BoxDecoration? boxDecoration = BoxDecoration.lerp( + BoxDecoration( + color: widget.unselectedDecoration?.color ?? + widget.unselectedBackgroundColor ?? + Colors.transparent, + boxShadow: widget.unselectedDecoration?.boxShadow, + gradient: widget.unselectedDecoration?.gradient, + borderRadius: widget.useToggleButtonStyle + ? null + : BorderRadius.circular(widget.borderRadius), + ), + BoxDecoration( + color: widget.decoration?.color ?? + widget.backgroundColor ?? + Colors.transparent, + boxShadow: widget.decoration?.boxShadow, + gradient: widget.decoration?.gradient, + borderRadius: widget.useToggleButtonStyle + ? null + : BorderRadius.circular(widget.borderRadius), + ), + animationValue); + + if (widget.useToggleButtonStyle && + widget.borderWidth > 0 && + boxDecoration != null) { + if (index == 0) { + boxDecoration = boxDecoration.copyWith( + border: Border( + right: BorderSide( + color: widget.unselectedBorderColor ?? Colors.transparent, + width: widget.borderWidth / 2, + ), + ), + ); + } else if (index == widget.tabs.length - 1) { + boxDecoration = boxDecoration.copyWith( + border: Border( + left: BorderSide( + color: widget.unselectedBorderColor ?? Colors.transparent, + width: widget.borderWidth / 2, + ), + ), + ); + } else { + boxDecoration = boxDecoration.copyWith( + border: Border.symmetric( + vertical: BorderSide( + color: widget.unselectedBorderColor ?? Colors.transparent, + width: widget.borderWidth / 2, + ), + ), + ); + } + } + + return Padding( + key: _tabKeys[index], + // padding for the buttons + padding: + widget.useToggleButtonStyle ? EdgeInsets.zero : widget.buttonMargin, + child: TextButton( + onPressed: () => _handleTap(index), + style: ButtonStyle( + elevation: MaterialStateProperty.all( + widget.useToggleButtonStyle ? 0 : widget.elevation), + + /// give a pretty small minimum size + minimumSize: MaterialStateProperty.all(const Size(10, 10)), + padding: MaterialStateProperty.all(EdgeInsets.zero), + textStyle: MaterialStateProperty.all(textStyle), + foregroundColor: MaterialStateProperty.all(textColor), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + shape: MaterialStateProperty.all( + widget.useToggleButtonStyle + ? const RoundedRectangleBorder( + side: BorderSide.none, + borderRadius: BorderRadius.zero, + ) + : RoundedRectangleBorder( + side: (widget.borderWidth == 0) + ? BorderSide.none + : BorderSide( + color: borderColor ?? Colors.transparent, + width: widget.borderWidth, + ), + borderRadius: BorderRadius.circular(widget.borderRadius), + ), + ), + ), + child: Ink( + decoration: boxDecoration, + child: Container( + padding: widget.labelPadding, + alignment: Alignment.center, + child: child, + ), + ), + ), + ); + } + + bool _debugScheduleCheckHasValidTabsCount() { + if (_debugHasScheduledValidTabsCountCheck) { + return true; + } + WidgetsBinding.instance.addPostFrameCallback((Duration duration) { + _debugHasScheduledValidTabsCountCheck = false; + if (!mounted) { + return; + } + assert(() { + if (_controller!.length != widget.tabs.length) { + throw FlutterError( + "Controller's length property (${_controller!.length}) does not match the " + "number of tabs (${widget.tabs.length}) present in TabBar's tabs property.", + ); + } + return true; + }()); + }); + _debugHasScheduledValidTabsCountCheck = true; + return true; + } + + @override + Widget build(BuildContext context) { + assert(_debugScheduleCheckHasValidTabsCount()); + + if (_controller!.length == 0) { + return Container( + height: _kTabHeight + + widget.labelPadding.vertical + + widget.buttonMargin.vertical, + ); + } + + final List wrappedTabs = + List.generate(widget.tabs.length, (int index) { + return _buildStyledTab(widget.tabs[index], index); + }); + + final int tabCount = widget.tabs.length; + // Add the tap handler to each tab. If the tab bar is not scrollable, + // then give all of the tabs equal flexibility so that they each occupy + // the same share of the tab bar's overall width. + + for (int index = 0; index < tabCount; index += 1) { + if (!widget.isScrollable) { + wrappedTabs[index] = Expanded(child: wrappedTabs[index]); + } + } + + Widget tabBar = AnimatedBuilder( + animation: _animationController, + key: _tabsParentKey, + builder: (context, child) { + Widget tabBarTemp = _TabLabelBar( + onPerformLayout: _saveTabOffsets, + children: wrappedTabs, + ); + + if (widget.useToggleButtonStyle) { + tabBarTemp = Material( + shape: widget.useToggleButtonStyle + ? RoundedRectangleBorder( + side: (widget.borderWidth == 0) + ? BorderSide.none + : BorderSide( + color: widget.borderColor ?? Colors.transparent, + width: widget.borderWidth, + style: BorderStyle.solid, + ), + borderRadius: BorderRadius.circular(widget.borderRadius), + ) + : null, + elevation: widget.useToggleButtonStyle ? widget.elevation : 0, + clipBehavior: Clip.antiAliasWithSaveLayer, + child: tabBarTemp, + ); + } + return CustomPaint( + painter: _indicatorPainter, + child: tabBarTemp, + ); + }, + ); + + if (widget.isScrollable) { + _scrollController ??= _TabBarScrollController(this); + tabBar = SingleChildScrollView( + dragStartBehavior: widget.dragStartBehavior, + scrollDirection: Axis.horizontal, + controller: _scrollController, + padding: widget.padding, + physics: widget.physics, + child: tabBar, + ); + } else if (widget.padding != null) { + tabBar = Padding( + padding: widget.padding!, + child: tabBar, + ); + } + + return tabBar; + } +} diff --git a/lib/flutter_flow/flutter_flow_data_table.dart b/lib/flutter_flow/flutter_flow_data_table.dart new file mode 100644 index 00000000..55272241 --- /dev/null +++ b/lib/flutter_flow/flutter_flow_data_table.dart @@ -0,0 +1,341 @@ +import 'dart:math' as math; + +import 'package:data_table_2/data_table_2.dart'; +import 'package:flutter/material.dart'; + +export 'package:data_table_2/data_table_2.dart' show DataColumn2; + +const _kDataTableHorizontalMargin = 48.0; +const kDefaultColumnSpacing = 56.0; +const _kMinRowsPerPage = 5; + +typedef ColumnsBuilder = List Function(void Function(int, bool)); +typedef DataRowBuilder = DataRow? Function( + T, int, bool, void Function(bool?)?); + +class FlutterFlowDataTableController extends DataTableSource { + FlutterFlowDataTableController({ + List? initialData, + int? numRows, + PaginatorController? paginatorController, + bool selectable = false, + }) { + data = initialData?.toList() ?? []; + numRows = numRows; + this.paginatorController = paginatorController ?? PaginatorController(); + _selectable = selectable; + } + + DataRowBuilder? _dataRowBuilder; + late PaginatorController paginatorController; + List data = []; + int? _numRows; + List get selectedData => + selectedRows.where((i) => i < data.length).map(data.elementAt).toList(); + + bool _selectable = false; + final Set selectedRows = {}; + + int rowsPerPage = defaultRowsPerPage; + int? sortColumnIndex; + bool sortAscending = true; + + void init({ + DataRowBuilder? dataRowBuilder, + bool? selectable, + List? initialData, + int? initialNumRows, + }) { + _dataRowBuilder = dataRowBuilder ?? _dataRowBuilder; + _selectable = selectable ?? _selectable; + data = initialData?.toList() ?? data; + _numRows = initialNumRows; + } + + void updateData({ + List? data, + int? numRows, + bool notify = true, + }) { + this.data = data?.toList() ?? this.data; + _numRows = numRows ?? _numRows; + if (notify) { + notifyListeners(); + } + } + + void updateSort({ + required int columnIndex, + required bool ascending, + Function(int, bool)? onSortChanged, + }) { + sortColumnIndex = columnIndex; + sortAscending = ascending; + if (onSortChanged != null) { + onSortChanged(columnIndex, ascending); + } + notifyListeners(); + } + + @override + DataRow? getRow(int index) { + final row = data.elementAtOrNull(index); + return _dataRowBuilder != null && row != null + ? _dataRowBuilder!( + row, + index, + selectedRows.contains(index), + _selectable + ? (selected) { + if (selected == null) { + return; + } + selected + ? selectedRows.add(index) + : selectedRows.remove(index); + notifyListeners(); + } + : null, + ) + : null; + } + + @override + bool get isRowCountApproximate => false; + + @override + int get rowCount => _numRows ?? data.length; + + @override + int get selectedRowCount => selectedRows.length; +} + +class FlutterFlowDataTable extends StatefulWidget { + const FlutterFlowDataTable({ + super.key, + required this.controller, + required this.data, + this.numRows, + required this.columnsBuilder, + required this.dataRowBuilder, + this.emptyBuilder, + this.onPageChanged, + this.onSortChanged, + this.onRowsPerPageChanged, + this.paginated = true, + this.selectable = false, + this.hidePaginator = false, + this.showFirstLastButtons = false, + this.width, + this.height, + this.minWidth, + this.headingRowHeight = 56, + this.dataRowHeight = kMinInteractiveDimension, + this.columnSpacing = kDefaultColumnSpacing, + this.headingRowColor, + this.sortIconColor, + this.borderRadius, + this.addHorizontalDivider = true, + this.addTopAndBottomDivider = false, + this.hideDefaultHorizontalDivider = false, + this.addVerticalDivider = false, + this.horizontalDividerColor, + this.horizontalDividerThickness, + this.verticalDividerColor, + this.verticalDividerThickness, + this.checkboxUnselectedFillColor, + this.checkboxSelectedFillColor, + this.checkboxUnselectedBorderColor, + this.checkboxSelectedBorderColor, + this.checkboxCheckColor, + }); + + final FlutterFlowDataTableController controller; + final List data; + final int? numRows; + final ColumnsBuilder columnsBuilder; + final DataRowBuilder dataRowBuilder; + final Widget? Function()? emptyBuilder; + // Callback functions + final Function(int)? onPageChanged; + final Function(int, bool)? onSortChanged; + final Function(int)? onRowsPerPageChanged; + // Functionality options + final bool paginated; + final bool selectable; + final bool showFirstLastButtons; + final bool hidePaginator; + // Size and shape options + final double? width; + final double? height; + final double? minWidth; + final double headingRowHeight; + final double dataRowHeight; + final double columnSpacing; + // Table style options + final Color? headingRowColor; + final Color? sortIconColor; + final BorderRadius? borderRadius; + final bool addHorizontalDivider; + final bool addTopAndBottomDivider; + final bool hideDefaultHorizontalDivider; + final Color? horizontalDividerColor; + final double? horizontalDividerThickness; + final bool addVerticalDivider; + final Color? verticalDividerColor; + final double? verticalDividerThickness; + // Checkbox style options + final Color? checkboxUnselectedFillColor; + final Color? checkboxSelectedFillColor; + final Color? checkboxUnselectedBorderColor; + final Color? checkboxSelectedBorderColor; + final Color? checkboxCheckColor; + + @override + State> createState() => + _FlutterFlowDataTableState(); +} + +class _FlutterFlowDataTableState extends State> { + FlutterFlowDataTableController get controller => widget.controller; + int get rowCount => controller.rowCount; + + int get initialRowsPerPage => + rowCount > _kMinRowsPerPage ? defaultRowsPerPage : _kMinRowsPerPage; + + @override + void initState() { + super.initState(); + dataTableShowLogs = false; // Disables noisy DataTable2 debug statements. + controller.init( + dataRowBuilder: widget.dataRowBuilder, + selectable: widget.selectable, + initialData: widget.data, + initialNumRows: widget.numRows, + ); + // ignore: cascade_invocations + controller.addListener(() => setState(() {})); + } + + @override + void didUpdateWidget(FlutterFlowDataTable oldWidget) { + super.didUpdateWidget(oldWidget); + controller.updateData( + data: widget.data, + numRows: widget.numRows, + notify: true, + ); + } + + @override + Widget build(BuildContext context) { + final columns = widget.columnsBuilder( + (index, ascending) { + controller.updateSort( + columnIndex: index, + ascending: ascending, + onSortChanged: widget.onSortChanged, + ); + setState(() {}); + }, + ); + + final checkboxThemeData = CheckboxThemeData( + checkColor: MaterialStateProperty.all( + widget.checkboxCheckColor ?? Colors.black54, + ), + fillColor: MaterialStateProperty.resolveWith( + (states) => states.contains(MaterialState.selected) + ? widget.checkboxSelectedFillColor ?? Colors.white.withOpacity(0.01) + : widget.checkboxUnselectedFillColor ?? + Colors.white.withOpacity(0.01), + ), + side: MaterialStateBorderSide.resolveWith( + (states) => BorderSide( + width: 2.0, + color: states.contains(MaterialState.selected) + ? widget.checkboxSelectedBorderColor ?? Colors.black54 + : widget.checkboxUnselectedBorderColor ?? Colors.black54, + ), + ), + overlayColor: MaterialStateProperty.all(Colors.transparent), + ); + + final horizontalBorder = widget.addHorizontalDivider + ? BorderSide( + color: widget.horizontalDividerColor ?? Colors.transparent, + width: widget.horizontalDividerThickness ?? 1.0, + ) + : BorderSide.none; + + return ClipRRect( + borderRadius: widget.borderRadius ?? BorderRadius.zero, + child: SizedBox( + width: widget.width, + height: widget.height, + child: Theme( + data: Theme.of(context).copyWith( + iconTheme: widget.sortIconColor != null + ? IconThemeData(color: widget.sortIconColor) + : null, + ), + child: PaginatedDataTable2( + source: controller, + controller: + widget.paginated ? controller.paginatorController : null, + rowsPerPage: widget.paginated ? initialRowsPerPage : rowCount, + availableRowsPerPage: const [5, 10, 25, 50, 100], + onPageChanged: widget.onPageChanged != null + ? (index) => widget.onPageChanged!(index) + : null, + columnSpacing: widget.columnSpacing, + onRowsPerPageChanged: widget.paginated + ? (value) { + controller.rowsPerPage = value ?? initialRowsPerPage; + if (widget.onRowsPerPageChanged != null) { + widget.onRowsPerPageChanged!(controller.rowsPerPage); + } + } + : null, + columns: columns, + empty: widget.emptyBuilder != null ? widget.emptyBuilder!() : null, + sortColumnIndex: controller.sortColumnIndex, + sortAscending: controller.sortAscending, + showCheckboxColumn: widget.selectable, + datarowCheckboxTheme: checkboxThemeData, + headingCheckboxTheme: checkboxThemeData, + hidePaginator: !widget.paginated || widget.hidePaginator, + wrapInCard: false, + renderEmptyRowsInTheEnd: false, + border: TableBorder( + horizontalInside: horizontalBorder, + verticalInside: widget.addVerticalDivider + ? BorderSide( + color: widget.verticalDividerColor ?? Colors.transparent, + width: widget.verticalDividerThickness ?? 1.0, + ) + : BorderSide.none, + bottom: widget.addTopAndBottomDivider + ? horizontalBorder + : BorderSide.none, + ), + dividerThickness: widget.hideDefaultHorizontalDivider ? 0.0 : null, + headingRowColor: MaterialStateProperty.all(widget.headingRowColor), + headingRowHeight: widget.headingRowHeight, + dataRowHeight: widget.dataRowHeight, + showFirstLastButtons: widget.showFirstLastButtons, + minWidth: math.max(widget.minWidth ?? 0, _getColumnsWidth(columns)), + ), + ), + ), + ); + } + + // Return the total fixed width of all columns that have a specified width, + // plus one to make the data table scrollable if there is insufficient space. + double _getColumnsWidth(List columns) => + columns.where((c) => c is DataColumn2 && c.fixedWidth != null).fold( + ((widget.selectable ? 2 : 1) * _kDataTableHorizontalMargin) + 1, + (sum, col) => sum + (col as DataColumn2).fixedWidth!, + ); +} diff --git a/lib/flutter_flow/flutter_flow_theme.dart b/lib/flutter_flow/flutter_flow_theme.dart index e782c9ed..7429aca2 100644 --- a/lib/flutter_flow/flutter_flow_theme.dart +++ b/lib/flutter_flow/flutter_flow_theme.dart @@ -66,6 +66,8 @@ abstract class FlutterFlowTheme { late Color customColor1; late Color customColor2; late Color customColor3; + late Color customColor4; + late Color customColor5; @Deprecated('Use displaySmallFamily instead') String get title1Family => displaySmallFamily; @@ -164,7 +166,7 @@ class LightModeTheme extends FlutterFlowTheme { late Color accent1 = const Color(0xFF1AAB5F); late Color accent2 = const Color(0x4D000000); late Color accent3 = const Color(0xFFFFFFFF); - late Color accent4 = const Color(0xFFFFFFFF); + late Color accent4 = const Color(0xFF1AAB5F); late Color success = const Color(0xFF1AAB5F); late Color warning = const Color(0xFFF3C344); late Color error = const Color(0xFFD70000); @@ -173,6 +175,8 @@ class LightModeTheme extends FlutterFlowTheme { late Color customColor1 = const Color(0xFF000000); late Color customColor2 = const Color(0xFF1AAB5F); late Color customColor3 = const Color(0xFFFFFFFF); + late Color customColor4 = const Color(0xFFCFCFCF); + late Color customColor5 = const Color(0xFF979595); } abstract class Typography { @@ -569,6 +573,8 @@ class DarkModeTheme extends FlutterFlowTheme { late Color customColor1 = const Color(0xFFFFFFFF); late Color customColor2 = const Color(0xFFFFFFFF); late Color customColor3 = const Color(0xFF1AAB5F); + late Color customColor4 = const Color(0xFF232323); + late Color customColor5 = const Color(0xFF232323); } extension TextStyleHelper on TextStyle { diff --git a/lib/flutter_flow/flutter_flow_util.dart b/lib/flutter_flow/flutter_flow_util.dart index f48a21ef..20a3e9bf 100644 --- a/lib/flutter_flow/flutter_flow_util.dart +++ b/lib/flutter_flow/flutter_flow_util.dart @@ -14,6 +14,7 @@ import 'package:url_launcher/url_launcher.dart'; import '../main.dart'; +export 'keep_alive_wrapper.dart'; export 'lat_lng.dart'; export 'place.dart'; export 'uploaded_file.dart'; diff --git a/lib/flutter_flow/internationalization.dart b/lib/flutter_flow/internationalization.dart index b5c2dc8d..f6d595a6 100644 --- a/lib/flutter_flow/internationalization.dart +++ b/lib/flutter_flow/internationalization.dart @@ -107,43 +107,43 @@ Locale createLocale(String language) => language.contains('_') final kTranslationsMap = >>[ // LoginPage { - 'uem0mca5': { + '0113wf5c': { 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', }, - '90ls8ppo': { + 'f2go5a71': { 'pt': 'Email', 'en': 'Email', }, - 'rvlumyaw': { + 'paon3y0v': { 'pt': 'Senha', 'en': 'Password', }, - '2d3903lt': { + 'wmbzwstw': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'zj6pyujp': { + 'j8567afe': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - 'iqhyif1d': { + 'y3wd9q18': { 'pt': 'Entrar', 'en': 'Sign-In', }, - '5x5bp2u1': { + 'j6ufb6sq': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - '1fqjz9q7': { + 'h85112qs': { 'pt': 'Você esqueceu a sua senha?', 'en': 'Have you forgotten your password?', }, - '7miyd406': { + 'di48hdaj': { 'pt': ' Recupere aqui', 'en': 'recover here', }, - '63xv5ewj': { + 'gx2fp6zq': { 'pt': 'Termo de Uso', 'en': 'Terms of use', }, @@ -154,25 +154,25 @@ final kTranslationsMap = >>[ }, // ForgotPasswordPage { - 'lpduiuif': { + 'gfvplb0h': { 'pt': 'ESQUECEU SUA SENHA?', 'en': 'FORGOT YOUR PASSWORD?', }, - '8t05j98w': { + 'azssgpdi': { 'pt': 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', 'en': 'Don\'t worry, we will help you, enter the email registered in the application and click send.', }, - '4gcoci7a': { + '0o139961': { 'pt': 'Email', 'en': 'Email', }, - 'a7p2iikz': { + 'aanw1fp3': { 'pt': 'digite o seu email.....', 'en': 'enter your email.....', }, - 'z9ghb8dz': { + 'e7hdgc4q': { 'pt': 'Enviar', 'en': 'To send', }, @@ -234,39 +234,39 @@ final kTranslationsMap = >>[ }, // RegisterPage { - 'oxy0n1p4': { + '2d8uulm3': { 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', }, - 'w0y3fz89': { + '8kjhi406': { 'pt': 'Nome', 'en': 'Name', }, - '4bfdpd0o': { + 'ro4zkkxp': { 'pt': 'Email', 'en': 'Email', }, - 'v0iobs5a': { + 'j5yny8ee': { 'pt': '', 'en': '', }, - 'byjglkpk': { + 'lzgobioa': { 'pt': 'Senha', 'en': 'Password', }, - 'w9vrsnmf': { + 'c7sfyeh8': { 'pt': 'Cadastrar-se', 'en': 'Sign-Up', }, - 'zep60lcd': { + 'jglpa1tr': { 'pt': 'Você já tem uma conta? ', 'en': 'You already have an account?', }, - 'tl8k1ld9': { + 'hfcm0td9': { 'pt': 'Clique aqui', 'en': 'Click here', }, - 'dbtzii7i': { + 'c3kno4t9': { 'pt': 'Termo de Uso', 'en': '', }, @@ -277,27 +277,27 @@ final kTranslationsMap = >>[ }, // WelcomePage { - '3pl41wkq': { + 'xflxvs9y': { 'pt': 'UMA EXPERIÊCIA COMPLETA', 'en': 'A COMPLETE EXPERIENCE', }, - '13nhoxpg': { + '5a86wzd1': { 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', 'en': 'WITH COMFORT WHEREVER YOU ARE.', }, - 'zt5uc5g5': { + '65nuva6j': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'jteakpo0': { + '9u6oaw01': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, - 'qoc86gvo': { + 'd1qem43w': { 'pt': 'Entrar', 'en': 'Sign-In', }, - 'p5tgmj0c': { + 'bhowzv2u': { 'pt': 'Cadastrar', 'en': 'Sign-Up', }, @@ -371,86 +371,114 @@ final kTranslationsMap = >>[ }, // scheduleCompleteVisitPage { - 'e4w9lbke': { - 'pt': 'Criar Agendamento', - 'en': 'Create Schedule', - }, - '47bsumoy': { - 'pt': 'Histórico de Visitas', - 'en': 'Visit History', - }, - '15ekd1ge': { + '61lcxdgm': { 'pt': 'Agendar Visita', 'en': 'Schedule Visit', }, - 'qo0pg2at': { + 'ueth1f4g': { + 'pt': 'Cadastrar Visita', + 'en': 'Register Visit', + }, + 'u0jocx7e': { 'pt': 'Quais visitantes você deseja cadastrar?', 'en': 'Which visitors do you want to register?', }, - 'i0jhuu3e': { + 'r8soavtz': { 'pt': 'Clique para adicionar um visitante', - 'en': 'Click to add photo for visitor', + 'en': 'Click to add a visitor', }, - 'z4ry3tge': { + '98evnbbe': { 'pt': 'Qual o período de validade da visita?', 'en': 'Visit Validity Period', }, - '9mg9nv2j': { - 'pt': 'Ínicio da Visita', - 'en': 'Start of the Visit', + 'qygj6ra5': { + 'pt': 'Inicio da Visita', + 'en': 'Start of Visit', }, - 'y5s85khj': { - 'pt': 'Quando a visitas se inicia?', - 'en': 'When does the visit start?', - }, - '4o0cbb70': { - 'pt': 'Término da Visita', + 'bv2edxku': { + 'pt': '', 'en': 'End of Visit', }, - 'bhmgddc4': { + '53cbwqh9': { + 'pt': 'Quando você inicia a visita?', + 'en': 'When do you start the visit?', + }, + 'p4ws3t66': { + 'pt': 'Fim da Visita', + 'en': 'End of Visit', + }, + 'yw6d2jj8': { + 'pt': '', + 'en': 'End of Visit', + }, + 'xpgc5e8d': { 'pt': 'Quando a visita terminá?', 'en': 'When will the visit end?', }, - 'p81uol2v': { + '0meymh6u': { 'pt': 'Quais são os motivos da visita?', 'en': 'What are the reasons for the visit?', }, - 'x1ij847i': { + '2f68zi9t': { + 'pt': 'Motivo da Visita', + 'en': 'End of Visit', + }, + '6p3e0bzr': { 'pt': 'Escolha um motivo aqui', 'en': 'Choose a reason here', }, - 'ejyyypuz': { + 'taxe2jy2': { 'pt': 'Search for an item...', 'en': '', }, - 'kmgv5j7x': { + 'il4di4ln': { + 'pt': 'Nível de Acesso', + 'en': 'End of Visit', + }, + '2wun8p6c': { 'pt': 'Escolha um nível de acesso aqui', 'en': 'Choose an access level here', }, - 'izwi0ya7': { + 'stweh7pd': { 'pt': 'Search for an item...', 'en': '', }, - 'mddp33o0': { + '8rk26eg1': { 'pt': 'Visita se encerra após o primeiro acesso?', 'en': 'Does the visit end after the first access?', }, - '68j9gw4h': { + 'lgv0q5ht': { 'pt': 'Visita única', 'en': 'Single visit', }, - '9rudpkq7': { + 'eftcs67c': { 'pt': 'Você tem alguma observação sobre está visita?', 'en': 'Do you have any observations about this visit?', }, - '4rgpxrfe': { + 't0q2vuup': { 'pt': 'Observações da Visita', 'en': 'Visit Observations', }, - '7knytis2': { + 'w18iztdm': { 'pt': 'Escreva as suas observações aqui', 'en': 'Write your observations here', }, + 'k4uraqam': { + 'pt': 'Histórico de Visitas', + 'en': 'Visit History', + }, + 'i46frqyi': { + 'pt': 'Visitante: ', + 'en': 'Visitor:', + }, + '73b1kj59': { + 'pt': 'Início em: ', + 'en': 'Beginning in:', + }, + 'klzzrfbn': { + 'pt': 'Fim em: ', + 'en': 'End in:', + }, 'v3mpyspm': { 'pt': 'scheduleVisit', 'en': '', @@ -511,7 +539,47 @@ final kTranslationsMap = >>[ 'en': '', }, }, - // visitorDetailsModal + // onBoardingPage + { + '6exl3e75': { + 'pt': 'Home', + 'en': '', + }, + }, + // fastPassPage + { + 'koh6s96f': { + 'pt': 'Home', + 'en': '', + }, + }, + // test + { + 'ah1ah1j6': { + 'pt': 'Home', + 'en': '', + }, + }, + // peopleOnThePropertyPage + { + 'omjuk919': { + 'pt': 'Foto', + 'en': 'Photo', + }, + 'fli7tpz6': { + 'pt': 'Nome', + 'en': 'Name', + }, + 'nsu13r5d': { + 'pt': 'Pessoas na Propriedade', + 'en': 'People on the Property', + }, + 'qv3fubdf': { + 'pt': 'Home', + 'en': '', + }, + }, + // visitorDetailsModalTemplateComponent { 'kqzf7nx2': { 'pt': 'Nome do Visitante', @@ -537,7 +605,7 @@ final kTranslationsMap = >>[ 'en': 'ERROR', }, }, - // regisiterVistorComponent + // regisiterVistorTemplateComponent { 'wnhkedzt': { 'pt': 'Cadastrar Visitante', @@ -596,7 +664,7 @@ final kTranslationsMap = >>[ 'en': 'Register', }, }, - // visitorSearchComponent + // visitorSearchModalTemplateComponent { 'cjlpru1m': { 'pt': 'Procure pelo documento do visitante ', @@ -728,15 +796,15 @@ final kTranslationsMap = >>[ }, // optionSelectionModal { - 'omxabblt': { - 'pt': 'Agenda \nRápida', - 'en': 'Schedule \nQuick', + 'bmjlmhht': { + 'pt': 'Agenda\nRapida', + 'en': 'Schedule \nVisit', }, - 'vpy51li0': { + 'ci8eyh2v': { 'pt': 'Agenda\nProvisória', 'en': 'Schedule\nProvisional', }, - '8ad3hms9': { + 'jj2b545b': { 'pt': 'Agenda\nCompleta', 'en': 'Schedule\nComplete', }, @@ -759,49 +827,41 @@ final kTranslationsMap = >>[ 'pt': 'Cadastrar \nPet', 'en': 'Register\npet', }, - 'xlp8dyn6': { - 'pt': 'Agendar \nVisita', - 'en': 'To schedule\nVisit', - }, 'l6b9o7yn': { 'pt': 'QR Code \nde Acesso', 'en': 'QR Code\nAccess', }, - '45gqx8e0': { - 'pt': 'Agenda \nAuto-Visita', - 'en': 'Schedule\nSelf-Visit', + 'rxnrtdau': { + 'pt': 'Pessoas na\nPropriedade', + 'en': 'People on\nthe Property', }, }, // menuStaggeredViewComponent { - 'jn7p6pj6': { - 'pt': 'Agenda \nAuto-Visita', - 'en': 'Schedule\nSelf-Visit', + 'ee33l0ms': { + 'pt': 'Agendar \nVisita', + 'en': 'Schedule \nVisit', }, - 'yymmdtyv': { - 'pt': 'Cadastrar\nVisitante', - 'en': 'Register\nVisitor', + 'ya37l3jt': { + 'pt': 'Cadastrar\n Visitante', + 'en': 'Register\n Visitor', }, - 'f2jbm9jz': { - 'pt': 'Vincular \nCondomínio', + 'h8s3adu8': { + 'pt': 'Vincular\nCondomínio', 'en': 'Link\nCondominium', }, - 'rs5a7h6m': { - 'pt': 'Cadastrar \nPet', + 'j6tfixen': { + 'pt': 'Cadastrar\nPet', 'en': 'Register\npet', }, - 'if2zuaok': { - 'pt': 'Agendar \nVisita', - 'en': 'To schedule\nVisit', - }, - 'r4mjqq6s': { - 'pt': 'Agendar \nVisita', - 'en': 'To schedule\nVisit', - }, - 'cilu7ief': { - 'pt': 'QR Code \nde Acesso', + '9tli4i2x': { + 'pt': 'QR Code\nde Acesso', 'en': 'QR Code\nAccess', }, + 'i22hecs8': { + 'pt': 'Pessoas na\nPropriedade', + 'en': 'People on\nthe Property', + }, }, // messageWellComponent { @@ -814,6 +874,151 @@ final kTranslationsMap = >>[ 'en': 'All', }, }, + // signInTemplateComponent + { + '9hbdjxrz': { + 'pt': 'VAMOS LA! ENTRE COM A SUA CONTA', + 'en': 'LET\'S GO! SIGN IN WITH YOUR ACCOUNT', + }, + '1ltg0ylb': { + 'pt': 'Email', + 'en': 'Email', + }, + '2x19ce8k': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'k44tm7wo': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + '14u7ipws': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + '1x926nsn': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'jwvd4ai1': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + '05dx91ku': { + 'pt': 'Você esqueceu a sua senha?', + 'en': 'Have you forgotten your password?', + }, + 'p5c6d54y': { + 'pt': ' Recupere aqui', + 'en': 'recover here', + }, + 'olf967cj': { + 'pt': 'Termo de Uso', + 'en': 'Terms of use', + }, + }, + // signUpTemplateComponent + { + '49609olv': { + 'pt': 'INSIRA SEU EMAIL E SENHA, VAMOS TE CADASTRAR!', + 'en': 'ENTER YOUR EMAIL AND PASSWORD, LET\'S REGISTER YOU!', + }, + '3corpwhd': { + 'pt': 'Nome', + 'en': 'Name', + }, + '80wonb69': { + 'pt': 'Email', + 'en': 'Email', + }, + 'ws143wf4': { + 'pt': '', + 'en': '', + }, + '0firji8l': { + 'pt': 'Senha', + 'en': 'Password', + }, + 'rnvdwzei': { + 'pt': 'Cadastrar-se', + 'en': 'Sign-Up', + }, + 'a9smhn5b': { + 'pt': 'Você já tem uma conta? ', + 'en': 'You already have an account?', + }, + '09xv5ctc': { + 'pt': 'Clique aqui', + 'en': 'Click here', + }, + 'huygnka2': { + 'pt': 'Termo de Uso', + 'en': '', + }, + }, + // welcomeTemplateComponent + { + 'dsc9tuc8': { + 'pt': 'UMA EXPERIÊCIA COMPLETA', + 'en': 'A COMPLETE EXPERIENCE', + }, + '5bgqn16z': { + 'pt': 'COM CONFORTO ONDE VOCÊ ESTIVER.', + 'en': 'WITH COMFORT WHEREVER YOU ARE.', + }, + 'dynet730': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'hha60cg7': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + 'zvtay8ee': { + 'pt': 'Entrar', + 'en': 'Sign-In', + }, + 'o6zob50a': { + 'pt': 'Cadastrar', + 'en': 'Sign-Up', + }, + }, + // forgotPasswordTemplateComponent + { + 'xxm3ajsy': { + 'pt': 'ESQUECEU SUA SENHA?', + 'en': 'FORGOT YOUR PASSWORD?', + }, + 'wu2f7yzo': { + 'pt': + 'Não se preucupe nós vamos te ajudar, digite o email cadastrado no aplicativo e clique em enviar.', + 'en': + 'Don\'t worry, we will help you, enter the email registered in the application and click send.', + }, + 'mtz8l7ft': { + 'pt': 'Email', + 'en': 'Email', + }, + 'w7y5wlnv': { + 'pt': 'digite o seu email.....', + 'en': 'enter your email.....', + }, + '74rnd5bu': { + 'pt': 'Enviar', + 'en': 'To send', + }, + }, + // selectHeaderComponent + { + '1gr8ztd5': { + 'pt': 'Criar Agendamento', + 'en': 'Create Schedule', + }, + 'xjahsbjw': { + 'pt': 'Histórico de Visitas', + 'en': 'Visit History', + }, + }, // Miscellaneous { 'i5smty81': { @@ -824,6 +1029,14 @@ final kTranslationsMap = >>[ 'pt': '', 'en': '', }, + '7zjyxhuq': { + 'pt': '', + 'en': '', + }, + 'd86ioepz': { + 'pt': '', + 'en': '', + }, 'lt3ssl76': { 'pt': '', 'en': '', diff --git a/lib/flutter_flow/keep_alive_wrapper.dart b/lib/flutter_flow/keep_alive_wrapper.dart new file mode 100644 index 00000000..286bde09 --- /dev/null +++ b/lib/flutter_flow/keep_alive_wrapper.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class KeepAliveWidgetWrapper extends StatefulWidget { + const KeepAliveWidgetWrapper({ + super.key, + required this.builder, + }); + + final WidgetBuilder builder; + + @override + State createState() => _KeepAliveWidgetWrapperState(); +} + +class _KeepAliveWidgetWrapperState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + + @override + Widget build(BuildContext context) { + super.build(context); + return widget.builder(context); + } +} diff --git a/lib/flutter_flow/nav/nav.dart b/lib/flutter_flow/nav/nav.dart index 47cb35a8..43c87584 100644 --- a/lib/flutter_flow/nav/nav.dart +++ b/lib/flutter_flow/nav/nav.dart @@ -42,7 +42,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( ), ), ) - : const WelcomePageWidget(), + : const OnBoardingPageWidget(), routes: [ FFRoute( name: '_initialize', @@ -57,7 +57,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( ), ), ) - : const WelcomePageWidget(), + : const OnBoardingPageWidget(), ), FFRoute( name: 'LoginPage', @@ -77,16 +77,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( FFRoute( name: 'homePage', path: '/homePage', - builder: (context, params) => HomePageWidget( - userUUID: params.getParam( - 'userUUID', - ParamType.String, - ), - devUUID: params.getParam( - 'devUUID', - ParamType.String, - ), - ), + builder: (context, params) => const HomePageWidget(), ), FFRoute( name: 'RegisterPage', @@ -101,16 +92,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( FFRoute( name: 'registerVisitorPage', path: '/registerVisitorPage', - builder: (context, params) => RegisterVisitorPageWidget( - userUUID: params.getParam( - 'userUUID', - ParamType.String, - ), - devUUID: params.getParam( - 'devUUID', - ParamType.String, - ), - ), + builder: (context, params) => const RegisterVisitorPageWidget(), ), FFRoute( name: 'scheduleCompleteVisitPage', @@ -155,6 +137,26 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter( name: 'scheduleProvisionalVisitPage', path: '/scheduleProvisionalVisitPage', builder: (context, params) => const ScheduleProvisionalVisitPageWidget(), + ), + FFRoute( + name: 'onBoardingPage', + path: '/onBoardingPage', + builder: (context, params) => const OnBoardingPageWidget(), + ), + FFRoute( + name: 'fastPassPage', + path: '/fastPassPage', + builder: (context, params) => const FastPassPageWidget(), + ), + FFRoute( + name: 'test', + path: '/test', + builder: (context, params) => const TestWidget(), + ), + FFRoute( + name: 'peopleOnThePropertyPage', + path: '/peopleOnThePropertyPage', + builder: (context, params) => const PeopleOnThePropertyPageWidget(), ) ].map((r) => r.toRoute(appStateNotifier)).toList(), ); diff --git a/lib/index.dart b/lib/index.dart index 588d205a..d5176451 100644 --- a/lib/index.dart +++ b/lib/index.dart @@ -1,12 +1,12 @@ // Export pages -export '/application_pages/login_page/login_page_widget.dart' +export '/legacy/on_boarding_legacy/login_page/login_page_widget.dart' show LoginPageWidget; -export '/application_pages/forgot_password_page/forgot_password_page_widget.dart' +export '/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart' show ForgotPasswordPageWidget; export '/application_pages/home_page/home_page_widget.dart' show HomePageWidget; -export '/application_pages/register_page/register_page_widget.dart' +export '/legacy/on_boarding_legacy/register_page/register_page_widget.dart' show RegisterPageWidget; -export '/application_pages/welcome_page/welcome_page_widget.dart' +export '/legacy/on_boarding_legacy/welcome_page/welcome_page_widget.dart' show WelcomePageWidget; export '/application_pages/register_visitor_page/register_visitor_page_widget.dart' show RegisterVisitorPageWidget; @@ -14,3 +14,10 @@ export '/application_pages/schedule_complete_visit_page/schedule_complete_visit_ show ScheduleCompleteVisitPageWidget; export '/application_pages/schedule_provisional_visit_page/schedule_provisional_visit_page_widget.dart' show ScheduleProvisionalVisitPageWidget; +export '/application_pages/on_boarding_page/on_boarding_page_widget.dart' + show OnBoardingPageWidget; +export '/application_pages/fast_pass_page/fast_pass_page_widget.dart' + show FastPassPageWidget; +export '/legacy/test/test_widget.dart' show TestWidget; +export '/application_pages/people_on_the_property_page/people_on_the_property_page_widget.dart' + show PeopleOnThePropertyPageWidget; diff --git a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart b/lib/legacy/image_cropper/image_cropper_model.dart similarity index 51% rename from lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart rename to lib/legacy/image_cropper/image_cropper_model.dart index 06aee0b3..3d5fedec 100644 --- a/lib/application_components/templates_components/visitor_details_modal/visitor_details_modal_model.dart +++ b/lib/legacy/image_cropper/image_cropper_model.dart @@ -1,9 +1,8 @@ import '/flutter_flow/flutter_flow_util.dart'; -import 'visitor_details_modal_widget.dart' show VisitorDetailsModalWidget; +import 'image_cropper_widget.dart' show ImageCropperWidget; import 'package:flutter/material.dart'; -class VisitorDetailsModalModel - extends FlutterFlowModel { +class ImageCropperModel extends FlutterFlowModel { @override void initState(BuildContext context) {} diff --git a/lib/legacy/image_cropper/image_cropper_widget.dart b/lib/legacy/image_cropper/image_cropper_widget.dart new file mode 100644 index 00000000..90467078 --- /dev/null +++ b/lib/legacy/image_cropper/image_cropper_widget.dart @@ -0,0 +1,64 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/custom_code/widgets/index.dart' as custom_widgets; +import 'package:flutter/material.dart'; +import 'image_cropper_model.dart'; +export 'image_cropper_model.dart'; + +class ImageCropperWidget extends StatefulWidget { + const ImageCropperWidget({ + super.key, + required this.uploadImageFile, + }); + + final FFUploadedFile? uploadImageFile; + + @override + State createState() => _ImageCropperWidgetState(); +} + +class _ImageCropperWidgetState extends State { + late ImageCropperModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => ImageCropperModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: 500.0, + height: 500.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).secondaryBackground, + ), + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: custom_widgets.ImageCropper( + width: double.infinity, + height: double.infinity, + imageFile: widget.uploadImageFile, + callBackAction: (url) async { + Navigator.pop(context, url); + }, + ), + ), + ); + } +} diff --git a/lib/legacy/legacy_local_component/legacy_local_component_model.dart b/lib/legacy/legacy_local_component/legacy_local_component_model.dart new file mode 100644 index 00000000..65087833 --- /dev/null +++ b/lib/legacy/legacy_local_component/legacy_local_component_model.dart @@ -0,0 +1,12 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'legacy_local_component_widget.dart' show LegacyLocalComponentWidget; +import 'package:flutter/material.dart'; + +class LegacyLocalComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/legacy/legacy_local_component/legacy_local_component_widget.dart b/lib/legacy/legacy_local_component/legacy_local_component_widget.dart new file mode 100644 index 00000000..54c3610d --- /dev/null +++ b/lib/legacy/legacy_local_component/legacy_local_component_widget.dart @@ -0,0 +1,167 @@ +import '/application_components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/custom_functions.dart' as functions; +import '/flutter_flow/random_data_util.dart' as random_data; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'legacy_local_component_model.dart'; +export 'legacy_local_component_model.dart'; + +class LegacyLocalComponentWidget extends StatefulWidget { + const LegacyLocalComponentWidget({super.key}); + + @override + State createState() => + _LegacyLocalComponentWidgetState(); +} + +class _LegacyLocalComponentWidgetState + extends State { + late LegacyLocalComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => LegacyLocalComponentModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return Visibility( + visible: random_data.randomInteger(0, 10) != null, + child: Container( + height: 284.0, + decoration: const BoxDecoration(), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Stack( + children: [ + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Material( + color: Colors.transparent, + elevation: 0.0, + child: Container( + width: double.infinity, + height: 119.0, + decoration: BoxDecoration( + color: const Color(0xFF1AAB5F), + border: Border.all( + color: const Color(0xFF1AAB5F), + ), + ), + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Container( + width: 200.0, + height: 200.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + shape: BoxShape.circle, + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Padding( + padding: const EdgeInsets.all(2.0), + child: InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + showModalBottomSheet( + isScrollControlled: true, + backgroundColor: const Color(0x00FFFFFF), + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const SizedBox( + height: double.infinity, + child: + BottomArrowLinkedLocalsComponentWidget(), + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(200.0), + child: Image.network( + valueOrDefault( + 'https://freaccess.com.br/freaccess/Images/Clients/${FFAppState().cliUUID}.png', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + width: 300.0, + height: 200.0, + fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + errorBuilder: (context, error, stackTrace) => + Image.asset( + 'assets/images/error_image.svg', + width: 300.0, + height: 200.0, + fit: BoxFit.cover, + alignment: const Alignment(0.0, 0.0), + ), + ), + ), + ), + ), + ), + ), + ), + ), + ], + ), + Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + valueOrDefault( + functions.convertToUppercase(FFAppState().local), + 'NOME DO LOCAL', + ), + style: FlutterFlowTheme.of(context).labelMedium.override( + fontFamily: 'Nunito', + color: FlutterFlowTheme.of(context).primaryText, + fontSize: 20.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: + GoogleFonts.asMap().containsKey('Nunito'), + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/application_pages/forgot_password_page/forgot_password_page_model.dart b/lib/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart similarity index 100% rename from lib/application_pages/forgot_password_page/forgot_password_page_model.dart rename to lib/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_model.dart diff --git a/lib/application_pages/forgot_password_page/forgot_password_page_widget.dart b/lib/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart similarity index 97% rename from lib/application_pages/forgot_password_page/forgot_password_page_widget.dart rename to lib/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart index b30452d5..51646517 100644 --- a/lib/application_pages/forgot_password_page/forgot_password_page_widget.dart +++ b/lib/legacy/on_boarding_legacy/forgot_password_page/forgot_password_page_widget.dart @@ -52,7 +52,7 @@ class _ForgotPasswordPageWidgetState extends State { children: [ if (isWeb == false) Align( - alignment: const AlignmentDirectional(-1.0, -1.0), + alignment: const AlignmentDirectional(-1.0, 1.0), child: FlutterFlowIconButton( borderColor: Colors.transparent, borderRadius: 30.0, @@ -141,7 +141,7 @@ class _ForgotPasswordPageWidgetState extends State { padding: const EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 0.0, 0.0), child: Text( FFLocalizations.of(context).getText( - 'lpduiuif' /* ESQUECEU SUA SENHA? */, + 'gfvplb0h' /* ESQUECEU SUA SENHA? */, ), style: FlutterFlowTheme.of(context).headlineMedium.override( fontFamily: 'Outfit', @@ -158,7 +158,7 @@ class _ForgotPasswordPageWidgetState extends State { padding: const EdgeInsetsDirectional.fromSTEB(16.0, 4.0, 16.0, 4.0), child: Text( FFLocalizations.of(context).getText( - '8t05j98w' /* Não se preucupe nós vamos te a... */, + 'azssgpdi' /* Não se preucupe nós vamos te a... */, ), style: FlutterFlowTheme.of(context).labelMedium.override( fontFamily: 'Plus Jakarta Sans', @@ -182,7 +182,7 @@ class _ForgotPasswordPageWidgetState extends State { obscureText: false, decoration: InputDecoration( labelText: FFLocalizations.of(context).getText( - '4gcoci7a' /* Email */, + '0o139961' /* Email */, ), labelStyle: FlutterFlowTheme.of(context).labelMedium.override( @@ -195,7 +195,7 @@ class _ForgotPasswordPageWidgetState extends State { .containsKey('Plus Jakarta Sans'), ), hintText: FFLocalizations.of(context).getText( - 'a7p2iikz' /* digite o seu email..... */, + 'aanw1fp3' /* digite o seu email..... */, ), hintStyle: FlutterFlowTheme.of(context).labelMedium.override( @@ -296,7 +296,7 @@ class _ForgotPasswordPageWidgetState extends State { if (shouldSetState) setState(() {}); }, text: FFLocalizations.of(context).getText( - 'z9ghb8dz' /* Enviar */, + 'e7hdgc4q' /* Enviar */, ), options: FFButtonOptions( width: 270.0, diff --git a/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart b/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart new file mode 100644 index 00000000..d56459f4 --- /dev/null +++ b/lib/legacy/on_boarding_legacy/login_page/login_page_model.dart @@ -0,0 +1,113 @@ +import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/custom_code/actions/index.dart' as actions; +import 'login_page_widget.dart' show LoginPageWidget; +import 'package:flutter/material.dart'; + +class LoginPageModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + // State field(s) for emailAddress widget. + FocusNode? emailAddressFocusNode; + TextEditingController? emailAddressTextController; + String? Function(BuildContext, String?)? emailAddressTextControllerValidator; + // State field(s) for password widget. + FocusNode? passwordFocusNode; + TextEditingController? passwordTextController; + late bool passwordVisibility; + String? Function(BuildContext, String?)? passwordTextControllerValidator; + + @override + void initState(BuildContext context) { + passwordVisibility = false; + } + + @override + void dispose() { + unfocusNode.dispose(); + emailAddressFocusNode?.dispose(); + emailAddressTextController?.dispose(); + + passwordFocusNode?.dispose(); + passwordTextController?.dispose(); + } + + /// Action blocks. + Future signInActionPage( + BuildContext context, { + required String? emailAdress, + required String? passwd, + }) async { + String? devUUID; + ApiCallResponse? loginCall; + + await Future.wait([ + Future(() async { + FFAppState().email = emailAdress!; + }), + Future(() async { + FFAppState().passwd = passwd!; + }), + ]); + if ((FFAppState().email != '') && + (FFAppState().passwd != '')) { + devUUID = await actions.getDevUUID(); + FFAppState().devUUID = devUUID!; + loginCall = await PhpGroup.loginCall.call( + email: FFAppState().email, + password: FFAppState().passwd, + uuid: FFAppState().devUUID, + type: FFAppState().device, + description: '', + ); + FFAppState().userUUID = FFAppState().userUUID; + if (PhpGroup.loginCall.error( + (loginCall.jsonBody ?? ''), + ) == + false) { + FFAppState().isLogged = true; + + context.goNamed( + 'homePage', + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + ), + }, + ); + } else { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + context: context, + builder: (context) { + return GestureDetector( + onTap: () => unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(unfocusNode) + : FocusScope.of(context).unfocus(), + child: Padding( + padding: MediaQuery.viewInsetsOf(context), + child: ThrowExceptionWidget( + msg: PhpGroup.loginCall.msg( + (loginCall?.jsonBody ?? ''), + )!, + ), + ), + ); + }, + ); + + FFAppState().email = ''; + FFAppState().passwd = ''; + FFAppState().update(() {}); + } + } else { + FFAppState().email = ''; + FFAppState().passwd = ''; + } + } +} diff --git a/lib/application_pages/login_page/login_page_widget.dart b/lib/legacy/on_boarding_legacy/login_page/login_page_widget.dart similarity index 80% rename from lib/application_pages/login_page/login_page_widget.dart rename to lib/legacy/on_boarding_legacy/login_page/login_page_widget.dart index 19b87afc..ab64048d 100644 --- a/lib/application_pages/login_page/login_page_widget.dart +++ b/lib/legacy/on_boarding_legacy/login_page/login_page_widget.dart @@ -1,15 +1,12 @@ -import '/application_components/molecular_components/throw_exception/throw_exception_widget.dart'; -import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; -import '/flutter_flow/random_data_util.dart' as random_data; +import '/actions/actions.dart' as action_blocks; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; import 'login_page_model.dart'; export 'login_page_model.dart'; @@ -91,8 +88,6 @@ class _LoginPageWidgetState extends State @override Widget build(BuildContext context) { - context.watch(); - return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) @@ -146,28 +141,26 @@ class _LoginPageWidgetState extends State child: Text( FFLocalizations.of(context) .getText( - 'uem0mca5' /* VAMOS LA! ENTRE COM A SUA CONT... */, + '0113wf5c' /* VAMOS LA! ENTRE COM A SUA CONT... */, ), textAlign: TextAlign.start, - style: - FlutterFlowTheme.of(context) - .displaySmall - .override( - fontFamily: - 'Plus Jakarta Sans', - color: - FlutterFlowTheme.of( - context) - .primaryText, - fontSize: 24.0, - letterSpacing: 0.0, - fontWeight: - FontWeight.normal, - useGoogleFonts: GoogleFonts - .asMap() - .containsKey( - 'Plus Jakarta Sans'), - ), + style: FlutterFlowTheme.of( + context) + .displaySmall + .override( + fontFamily: + 'Plus Jakarta Sans', + color: FlutterFlowTheme.of( + context) + .primaryText, + fontSize: 24.0, + letterSpacing: 0.0, + fontWeight: FontWeight.w500, + useGoogleFonts: GoogleFonts + .asMap() + .containsKey( + 'Plus Jakarta Sans'), + ), ), ), ), @@ -243,7 +236,7 @@ class _LoginPageWidgetState extends State FFLocalizations.of( context) .getText( - '90ls8ppo' /* Email */, + 'f2go5a71' /* Email */, ), labelStyle: FlutterFlowTheme.of( @@ -371,7 +364,7 @@ class _LoginPageWidgetState extends State FFLocalizations.of( context) .getText( - 'rvlumyaw' /* Senha */, + 'paon3y0v' /* Senha */, ), labelStyle: FlutterFlowTheme.of( @@ -514,182 +507,21 @@ class _LoginPageWidgetState extends State child: FFButtonWidget( onPressed: () async { - var shouldSetState = - false; - await Future - .wait([ - Future( - () async { - FFAppState() - .email = - _model - .emailAddressTextController - .text; - setState( - () {}); - }), - Future( - () async { - FFAppState() - .passwd = - _model - .passwordTextController - .text; - setState( - () {}); - }), - ]); - if ((FFAppState() - .email != - '') && - (FFAppState() - .passwd != - '')) { - FFAppState() - .devUUID = - random_data - .randomString( - 36, - 36, - false, - false, - true, - ); - setState(() {}); - _model.smallDisplayApi = - await PhpGroup - .loginCall - .call( - email: - FFAppState() - .email, - password: - FFAppState() - .passwd, - uuid: FFAppState() - .devUUID, - type: FFAppState() - .device, - description: - '', - ); - shouldSetState = - true; - FFAppState() - .userUUID = - PhpGroup - .loginCall - .userUUID( - (_model.smallDisplayApi - ?.jsonBody ?? - ''), - )!; - setState(() {}); - if (PhpGroup - .loginCall - .error( - (_model.smallDisplayApi - ?.jsonBody ?? - ''), - ) == - false) { - FFAppState() - .isLogged = - true; - setState( - () {}); - - context - .goNamed( - 'homePage', - queryParameters: - { - 'userUUID': - serializeParam( - FFAppState() - .userUUID, - ParamType - .String, - ), - 'devUUID': - serializeParam( - FFAppState() - .devUUID, - ParamType - .String, - ), - }.withoutNulls, - extra: { - kTransitionInfoKey: - const TransitionInfo( - hasTransition: - true, - transitionType: - PageTransitionType.fade, - ), - }, - ); - } else { - await showModalBottomSheet( - isScrollControlled: - true, - backgroundColor: - Colors - .transparent, - enableDrag: - false, - context: - context, - builder: - (context) { - return GestureDetector( - onTap: () => _model.unfocusNode.canRequestFocus - ? FocusScope.of(context).requestFocus(_model.unfocusNode) - : FocusScope.of(context).unfocus(), - child: - Padding( - padding: - MediaQuery.viewInsetsOf(context), - child: - ThrowExceptionWidget( - msg: - PhpGroup.loginCall.msg( - (_model.smallDisplayApi?.jsonBody ?? ''), - )!, - ), - ), - ); - }, - ).then((value) => - safeSetState( - () {})); - - setState(() { - _model - .emailAddressTextController - ?.clear(); - _model - .passwordTextController - ?.clear(); - }); - } - } else { - if (shouldSetState) { - setState( - () {}); - } - return; - } - - if (shouldSetState) { - setState(() {}); - } + await action_blocks + .singInActionApp( + context, + emailAdress: _model + .emailAddressTextController + .text, + password: _model + .passwordTextController + .text, + ); }, text: FFLocalizations .of(context) .getText( - '2d3903lt' /* Entrar */, + 'wmbzwstw' /* Entrar */, ), options: FFButtonOptions( @@ -764,7 +596,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'zj6pyujp' /* Cadastrar */, + 'j8567afe' /* Cadastrar */, ), options: FFButtonOptions( @@ -850,7 +682,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - 'iqhyif1d' /* Entrar */, + 'y3wd9q18' /* Entrar */, ), options: FFButtonOptions( @@ -931,7 +763,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - '5x5bp2u1' /* Cadastrar */, + 'j6ufb6sq' /* Cadastrar */, ), options: FFButtonOptions( @@ -1028,7 +860,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - '1fqjz9q7' /* Você esqueceu a sua senha? */, + 'h85112qs' /* Você esqueceu a sua senha? */, ), style: TextStyle( color: FlutterFlowTheme @@ -1040,7 +872,7 @@ class _LoginPageWidgetState extends State text: FFLocalizations .of(context) .getText( - '7miyd406' /* Recupere aqui */, + 'di48hdaj' /* Recupere aqui */, ), style: FlutterFlowTheme .of(context) @@ -1106,7 +938,7 @@ class _LoginPageWidgetState extends State ), Text( FFLocalizations.of(context).getText( - '63xv5ewj' /* Termo de Uso */, + 'gx2fp6zq' /* Termo de Uso */, ), style: FlutterFlowTheme.of(context) .bodyMedium diff --git a/lib/application_pages/register_page/register_page_model.dart b/lib/legacy/on_boarding_legacy/register_page/register_page_model.dart similarity index 89% rename from lib/application_pages/register_page/register_page_model.dart rename to lib/legacy/on_boarding_legacy/register_page/register_page_model.dart index 46bc3a25..4583ef8e 100644 --- a/lib/application_pages/register_page/register_page_model.dart +++ b/lib/legacy/on_boarding_legacy/register_page/register_page_model.dart @@ -1,4 +1,3 @@ -import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_util.dart'; import 'register_page_widget.dart' show RegisterPageWidget; import 'package:flutter/material.dart'; @@ -33,8 +32,6 @@ class RegisterPageModel extends FlutterFlowModel { late bool passwordRegisterFormVisibility; String? Function(BuildContext, String?)? passwordRegisterFormTextControllerValidator; - // Stores action output result for [Backend Call - API (register)] action in SignUpButtonRegisterForm widget. - ApiCallResponse? registerCall; @override void initState(BuildContext context) { diff --git a/lib/application_pages/register_page/register_page_widget.dart b/lib/legacy/on_boarding_legacy/register_page/register_page_widget.dart similarity index 81% rename from lib/application_pages/register_page/register_page_widget.dart rename to lib/legacy/on_boarding_legacy/register_page/register_page_widget.dart index 16a5ef67..da8f34cc 100644 --- a/lib/application_pages/register_page/register_page_widget.dart +++ b/lib/legacy/on_boarding_legacy/register_page/register_page_widget.dart @@ -1,15 +1,15 @@ -import '/backend/api_requests/api_calls.dart'; import '/flutter_flow/flutter_flow_animations.dart'; import '/flutter_flow/flutter_flow_theme.dart'; import '/flutter_flow/flutter_flow_util.dart'; import '/flutter_flow/flutter_flow_widgets.dart'; -import '/flutter_flow/random_data_util.dart' as random_data; +import '/actions/actions.dart' as action_blocks; import 'package:easy_debounce/easy_debounce.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; import 'register_page_model.dart'; export 'register_page_model.dart'; @@ -108,6 +108,8 @@ class _RegisterPageWidgetState extends State @override Widget build(BuildContext context) { + context.watch(); + return GestureDetector( onTap: () => _model.unfocusNode.canRequestFocus ? FocusScope.of(context).requestFocus(_model.unfocusNode) @@ -158,7 +160,7 @@ class _RegisterPageWidgetState extends State padding: const EdgeInsets.all(4.0), child: Text( FFLocalizations.of(context).getText( - 'oxy0n1p4' /* INSIRA SEU EMAIL E SENHA, VAMO... */, + '2d8uulm3' /* INSIRA SEU EMAIL E SENHA, VAMO... */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -171,7 +173,7 @@ class _RegisterPageWidgetState extends State .primaryText, fontSize: 24.0, letterSpacing: 0.0, - fontWeight: FontWeight.normal, + fontWeight: FontWeight.w500, useGoogleFonts: GoogleFonts .asMap() .containsKey( @@ -254,7 +256,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'w0y3fz89' /* Nome */, + '8kjhi406' /* Nome */, ), labelStyle: FlutterFlowTheme .of(context) @@ -396,7 +398,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - '4bfdpd0o' /* Email */, + 'ro4zkkxp' /* Email */, ), labelStyle: FlutterFlowTheme .of(context) @@ -539,7 +541,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'byjglkpk' /* Senha */, + 'lzgobioa' /* Senha */, ), labelStyle: FlutterFlowTheme .of(context) @@ -665,171 +667,25 @@ class _RegisterPageWidgetState extends State 0.0, 0.0, 0.0, 16.0), child: FFButtonWidget( onPressed: () async { - await Future.wait([ - Future(() async { - setState(() { - _model.emailRegisterFormTextController - ?.text = - _model - .emailRegisterFormTextController - .text; - }); - }), - Future(() async { - setState(() { - _model.passwordRegisterFormTextController - ?.text = - _model - .passwordRegisterFormTextController - .text; - }); - }), - Future(() async { - setState(() { - _model.nameRegisterFormTextController - ?.text = - _model - .nameRegisterFormTextController - .text; - }); - }), - ]); - if ((_model.emailRegisterFormTextController.text != '') && - (_model.passwordRegisterFormTextController - .text != - '') && - (_model.nameRegisterFormTextController - .text != - '')) { - _model.registerCall = - await PhpGroup - .registerCall - .call( - name: _model - .nameRegisterFormTextController - .text, - password: _model - .passwordRegisterFormTextController - .text, - email: _model - .emailRegisterFormTextController - .text, - token: random_data - .randomString( - 36, - 36, - false, - false, - true, - ), - uuid: random_data - .randomString( - 36, - 36, - false, - false, - true, - ), - tipo: _model.device, - descricao: random_data - .randomString( - 36, - 36, - true, - false, - false, - ), - ); - if (PhpGroup.registerCall - .error( - (_model.registerCall - ?.jsonBody ?? - ''), - ) == - false) { - context.goNamed( - 'LoginPage', - queryParameters: { - 'device': - serializeParam( - '', - ParamType.String, - ), - }.withoutNulls, - extra: { - kTransitionInfoKey: - const TransitionInfo( - hasTransition: true, - transitionType: - PageTransitionType - .fade, - ), - }, - ); - } else { - await showDialog( - context: context, - builder: - (alertDialogContext) { - return AlertDialog( - title: - const Text('ERROR2'), - content: - const Text('ERROR2'), - actions: [ - TextButton( - onPressed: () => - Navigator.pop( - alertDialogContext), - child: const Text( - 'ERROR2 '), - ), - ], - ); - }, - ); - setState(() { - _model - .passwordRegisterFormTextController - ?.clear(); - _model - .emailRegisterFormTextController - ?.clear(); - _model - .nameRegisterFormTextController - ?.clear(); - }); - } - } else { - await showDialog( - context: context, - builder: - (alertDialogContext) { - return AlertDialog( - title: const Text('ERROR1'), - content: - const Text('ERROR1'), - actions: [ - TextButton( - onPressed: () => - Navigator.pop( - alertDialogContext), - child: const Text( - 'ERROR1 '), - ), - ], - ); - }, - ); - } - - setState(() {}); + await action_blocks + .signUpActionApp( + context, + name: _model + .nameRegisterFormTextController + .text, + passwd: _model + .passwordRegisterFormTextController + .text, + email: _model + .emailRegisterFormTextController + .text, + device: FFAppState().device, + ); }, text: FFLocalizations.of(context) .getText( - 'w9vrsnmf' /* Cadastrar-se */, + 'c7sfyeh8' /* Cadastrar-se */, ), options: FFButtonOptions( width: double.infinity, @@ -909,7 +765,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'zep60lcd' /* Você já tem uma conta? */, + 'jglpa1tr' /* Você já tem uma conta? */, ), style: TextStyle( color: FlutterFlowTheme @@ -922,7 +778,7 @@ class _RegisterPageWidgetState extends State FFLocalizations.of( context) .getText( - 'tl8k1ld9' /* Clique aqui */, + 'hfcm0td9' /* Clique aqui */, ), style: FlutterFlowTheme.of( @@ -980,7 +836,7 @@ class _RegisterPageWidgetState extends State ), Text( FFLocalizations.of(context).getText( - 'dbtzii7i' /* Termo de Uso */, + 'c3kno4t9' /* Termo de Uso */, ), style: FlutterFlowTheme.of(context) .bodyMedium diff --git a/lib/application_pages/welcome_page/welcome_page_model.dart b/lib/legacy/on_boarding_legacy/welcome_page/welcome_page_model.dart similarity index 100% rename from lib/application_pages/welcome_page/welcome_page_model.dart rename to lib/legacy/on_boarding_legacy/welcome_page/welcome_page_model.dart diff --git a/lib/application_pages/welcome_page/welcome_page_widget.dart b/lib/legacy/on_boarding_legacy/welcome_page/welcome_page_widget.dart similarity index 97% rename from lib/application_pages/welcome_page/welcome_page_widget.dart rename to lib/legacy/on_boarding_legacy/welcome_page/welcome_page_widget.dart index 9484ebf9..1ec859fe 100644 --- a/lib/application_pages/welcome_page/welcome_page_widget.dart +++ b/lib/legacy/on_boarding_legacy/welcome_page/welcome_page_widget.dart @@ -36,16 +36,13 @@ class _WelcomePageWidgetState extends State if (FFAppState().isLogged == true) { context.pushNamed( 'homePage', - queryParameters: { - 'userUUID': serializeParam( - FFAppState().userUUID, - ParamType.String, + extra: { + kTransitionInfoKey: const TransitionInfo( + hasTransition: true, + transitionType: PageTransitionType.fade, + duration: Duration(milliseconds: 0), ), - 'devUUID': serializeParam( - FFAppState().devUUID, - ParamType.String, - ), - }.withoutNulls, + }, ); } else { if (isAndroid == true) { @@ -147,7 +144,7 @@ class _WelcomePageWidgetState extends State children: [ Text( FFLocalizations.of(context).getText( - '3pl41wkq' /* UMA EXPERIÊCIA COMPLETA */, + 'xflxvs9y' /* UMA EXPERIÊCIA COMPLETA */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -167,7 +164,7 @@ class _WelcomePageWidgetState extends State alignment: const AlignmentDirectional(0.0, -1.0), child: Text( FFLocalizations.of(context).getText( - '13nhoxpg' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, + '5a86wzd1' /* COM CONFORTO ONDE VOCÊ ESTIVER... */, ), textAlign: TextAlign.start, style: FlutterFlowTheme.of(context) @@ -265,7 +262,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of(context) .getText( - 'zt5uc5g5' /* Entrar */, + '65nuva6j' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, @@ -323,7 +320,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of(context) .getText( - 'jteakpo0' /* Cadastrar */, + '9u6oaw01' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, @@ -398,7 +395,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of( context) .getText( - 'qoc86gvo' /* Entrar */, + 'd1qem43w' /* Entrar */, ), options: FFButtonOptions( width: double.infinity, @@ -459,7 +456,7 @@ class _WelcomePageWidgetState extends State text: FFLocalizations.of( context) .getText( - 'p5tgmj0c' /* Cadastrar */, + 'bhowzv2u' /* Cadastrar */, ), options: FFButtonOptions( width: double.infinity, diff --git a/lib/legacy/select_header_component/select_header_component_model.dart b/lib/legacy/select_header_component/select_header_component_model.dart new file mode 100644 index 00000000..4c60514f --- /dev/null +++ b/lib/legacy/select_header_component/select_header_component_model.dart @@ -0,0 +1,12 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'select_header_component_widget.dart' show SelectHeaderComponentWidget; +import 'package:flutter/material.dart'; + +class SelectHeaderComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/legacy/select_header_component/select_header_component_widget.dart b/lib/legacy/select_header_component/select_header_component_widget.dart new file mode 100644 index 00000000..8f4f9339 --- /dev/null +++ b/lib/legacy/select_header_component/select_header_component_widget.dart @@ -0,0 +1,185 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'select_header_component_model.dart'; +export 'select_header_component_model.dart'; + +class SelectHeaderComponentWidget extends StatefulWidget { + const SelectHeaderComponentWidget({ + super.key, + required this.selectToggle, + bool? toggleIndexValue, + }) : toggleIndexValue = toggleIndexValue ?? true; + + final Future Function(bool toggleIndex)? selectToggle; + final bool toggleIndexValue; + + @override + State createState() => + _SelectHeaderComponentWidgetState(); +} + +class _SelectHeaderComponentWidgetState + extends State { + late SelectHeaderComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => SelectHeaderComponentModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + height: 55.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.selectToggle?.call( + true, + ); + }, + child: Container( + width: double.infinity, + height: 50.0, + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(0.0), + ), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + '1gr8ztd5' /* Criar Agendamento */, + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + color: FlutterFlowTheme.of(context).primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + if (widget.toggleIndexValue == true) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), + child: Container( + width: double.infinity, + height: 2.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: BorderRadius.circular(100.0), + ), + ), + ), + ], + ), + ), + ), + Expanded( + child: Container( + height: 55.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await widget.selectToggle?.call( + false, + ); + }, + child: Container( + width: double.infinity, + height: 50.0, + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(0.0), + topRight: Radius.circular(0.0), + ), + ), + child: Align( + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + FFLocalizations.of(context).getText( + 'xjahsbjw' /* Histórico de Visitas */, + ), + style: FlutterFlowTheme.of(context).bodyMedium.override( + fontFamily: + FlutterFlowTheme.of(context).bodyMediumFamily, + color: FlutterFlowTheme.of(context).primaryText, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap().containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ), + if (widget.toggleIndexValue == false) + Padding( + padding: const EdgeInsetsDirectional.fromSTEB(0.0, 2.0, 0.0, 0.0), + child: Container( + width: double.infinity, + height: 2.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primary, + borderRadius: BorderRadius.circular(100.0), + ), + ), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/lib/legacy/test/test_model.dart b/lib/legacy/test/test_model.dart new file mode 100644 index 00000000..24f736ca --- /dev/null +++ b/lib/legacy/test/test_model.dart @@ -0,0 +1,17 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'test_widget.dart' show TestWidget; +import 'package:flutter/material.dart'; + +class TestModel extends FlutterFlowModel { + /// State fields for stateful widgets in this page. + + final unfocusNode = FocusNode(); + + @override + void initState(BuildContext context) {} + + @override + void dispose() { + unfocusNode.dispose(); + } +} diff --git a/lib/legacy/test/test_widget.dart b/lib/legacy/test/test_widget.dart new file mode 100644 index 00000000..f175944b --- /dev/null +++ b/lib/legacy/test/test_widget.dart @@ -0,0 +1,44 @@ +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import 'package:flutter/material.dart'; +import 'test_model.dart'; +export 'test_model.dart'; + +class TestWidget extends StatefulWidget { + const TestWidget({super.key}); + + @override + State createState() => _TestWidgetState(); +} + +class _TestWidgetState extends State { + late TestModel _model; + + final scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _model = createModel(context, () => TestModel()); + } + + @override + void dispose() { + _model.dispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => _model.unfocusNode.canRequestFocus + ? FocusScope.of(context).requestFocus(_model.unfocusNode) + : FocusScope.of(context).unfocus(), + child: Scaffold( + key: scaffoldKey, + backgroundColor: FlutterFlowTheme.of(context).primaryBackground, + ), + ); + } +} diff --git a/lib/legacy/visit_history_template_component/visit_history_template_component_model.dart b/lib/legacy/visit_history_template_component/visit_history_template_component_model.dart new file mode 100644 index 00000000..8e53e34b --- /dev/null +++ b/lib/legacy/visit_history_template_component/visit_history_template_component_model.dart @@ -0,0 +1,13 @@ +import '/flutter_flow/flutter_flow_util.dart'; +import 'visit_history_template_component_widget.dart' + show VisitHistoryTemplateComponentWidget; +import 'package:flutter/material.dart'; + +class VisitHistoryTemplateComponentModel + extends FlutterFlowModel { + @override + void initState(BuildContext context) {} + + @override + void dispose() {} +} diff --git a/lib/legacy/visit_history_template_component/visit_history_template_component_widget.dart b/lib/legacy/visit_history_template_component/visit_history_template_component_widget.dart new file mode 100644 index 00000000..29571281 --- /dev/null +++ b/lib/legacy/visit_history_template_component/visit_history_template_component_widget.dart @@ -0,0 +1,389 @@ +import '/application_components/molecular_components/opt_modal/opt_modal_widget.dart'; +import '/application_components/templates_components/visit_details_modal_template_component/visit_details_modal_template_component_widget.dart'; +import '/backend/api_requests/api_calls.dart'; +import '/flutter_flow/flutter_flow_icon_button.dart'; +import '/flutter_flow/flutter_flow_theme.dart'; +import '/flutter_flow/flutter_flow_util.dart'; +import '/flutter_flow/custom_functions.dart' as functions; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:provider/provider.dart'; +import 'visit_history_template_component_model.dart'; +export 'visit_history_template_component_model.dart'; + +class VisitHistoryTemplateComponentWidget extends StatefulWidget { + const VisitHistoryTemplateComponentWidget({ + super.key, + this.parameter1, + }); + + final FFUploadedFile? parameter1; + + @override + State createState() => + _VisitHistoryTemplateComponentWidgetState(); +} + +class _VisitHistoryTemplateComponentWidgetState + extends State { + late VisitHistoryTemplateComponentModel _model; + + @override + void setState(VoidCallback callback) { + super.setState(callback); + _model.onUpdate(); + } + + @override + void initState() { + super.initState(); + _model = createModel(context, () => VisitHistoryTemplateComponentModel()); + } + + @override + void dispose() { + _model.maybeDispose(); + + super.dispose(); + } + + @override + Widget build(BuildContext context) { + context.watch(); + + return Container( + width: double.infinity, + height: 900.0, + decoration: BoxDecoration( + color: FlutterFlowTheme.of(context).primaryBackground, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + FlutterFlowIconButton( + borderColor: Colors.transparent, + borderRadius: 20.0, + borderWidth: 1.0, + buttonSize: 40.0, + icon: Icon( + Icons.settings_sharp, + color: FlutterFlowTheme.of(context).primary, + size: 24.0, + ), + onPressed: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + context: context, + builder: (context) { + return Padding( + padding: MediaQuery.viewInsetsOf(context), + child: const OptModalWidget(), + ); + }, + ).then((value) => safeSetState(() {})); + }, + ), + ], + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(14.0), + child: FutureBuilder( + future: PhpGroup.getVisitsCall.call( + devUUID: FFAppState().devUUID, + userUUID: FFAppState().userUUID, + cliID: FFAppState().cliUUID, + atividade: 'getVisitas', + ), + builder: (context, snapshot) { + // Customize what your widget looks like when it's loading. + if (!snapshot.hasData) { + return Center( + child: SizedBox( + width: 50.0, + height: 50.0, + child: SpinKitCircle( + color: FlutterFlowTheme.of(context).primary, + size: 50.0, + ), + ), + ); + } + final gridViewGetVisitsResponse = snapshot.data!; + return Builder( + builder: (context) { + final visitHistory = (PhpGroup.getVisitsCall + .visitasList( + gridViewGetVisitsResponse.jsonBody, + ) + ?.toList() ?? + []) + .take(10) + .toList(); + return GridView.builder( + padding: EdgeInsets.zero, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 10.0, + mainAxisSpacing: 10.0, + childAspectRatio: 1.0, + ), + scrollDirection: Axis.vertical, + itemCount: visitHistory.length, + itemBuilder: (context, visitHistoryIndex) { + final visitHistoryItem = + visitHistory[visitHistoryIndex]; + return Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(50.0), + bottomRight: Radius.circular(50.0), + topLeft: Radius.circular(25.0), + topRight: Radius.circular(25.0), + ), + shape: BoxShape.rectangle, + ), + child: Stack( + children: [ + Container( + width: double.infinity, + height: double.infinity, + decoration: BoxDecoration( + color: valueOrDefault( + () { + if (functions.jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FlutterFlowTheme.of(context) + .success; + } else if (functions + .jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') { + return FlutterFlowTheme.of(context) + .error; + } else if (functions + .jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"') { + return FlutterFlowTheme.of(context) + .warning; + } else { + return FlutterFlowTheme.of(context) + .primary; + } + }(), + FlutterFlowTheme.of(context).primary, + ), + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(10.0), + bottomRight: Radius.circular(10.0), + topLeft: Radius.circular(25.0), + topRight: Radius.circular(25.0), + ), + shape: BoxShape.rectangle, + ), + ), + InkWell( + splashColor: Colors.transparent, + focusColor: Colors.transparent, + hoverColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: () async { + await showModalBottomSheet( + isScrollControlled: true, + backgroundColor: Colors.transparent, + enableDrag: false, + useSafeArea: true, + context: context, + builder: (context) { + return Padding( + padding: + MediaQuery.viewInsetsOf(context), + child: + VisitDetailsModalTemplateComponentWidget( + visitStatusStr: getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS ''', + ).toString(), + visitStartDateStr: getJsonField( + visitHistoryItem, + r'''$.VAW_DTINICIO''', + ).toString(), + visitEndDateStr: getJsonField( + visitHistoryItem, + r'''$.VAW_DTFIM''', + ).toString(), + visitReasonStr: getJsonField( + visitHistoryItem, + r'''$.MOT_DESCRICAO''', + ).toString(), + visitLevelStr: getJsonField( + visitHistoryItem, + r'''$.NAC_DESCRICAO''', + ).toString(), + visitTempStr: getJsonField( + visitHistoryItem, + r'''$.VTE_UNICA ''', + ).toString(), + visitObsStr: getJsonField( + visitHistoryItem, + r'''$.VAW_OBS''', + ).toString(), + visitorImgPath: + valueOrDefault( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + visitorStrList: getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString(), + visitIdStr: getJsonField( + visitHistoryItem, + r'''$.VAW_ID''', + ).toString(), + visitorJsonList: PhpGroup + .getVisitsCall + .visitasList( + gridViewGetVisitsResponse + .jsonBody, + ), + updateToggleIdx: () async { + setState(() {}); + }, + repeatVisitSchedule: () async {}, + ), + ); + }, + ).then((value) => safeSetState(() {})); + }, + child: ClipRRect( + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(25.0), + bottomRight: Radius.circular(25.0), + topLeft: Radius.circular(25.0), + topRight: Radius.circular(25.0), + ), + child: CachedNetworkImage( + fadeInDuration: + const Duration(milliseconds: 500), + fadeOutDuration: + const Duration(milliseconds: 500), + imageUrl: valueOrDefault( + 'https://freaccess.com.br/freaccess/getImage.php?devUUID=${FFAppState().devUUID}&userUUID=${FFAppState().userUUID}&cliID=${FFAppState().cliUUID}&atividade=getFoto&Documento=${getJsonField( + visitHistoryItem, + r'''$.VTE_DOCUMENTO''', + ).toString()}&tipo=E', + 'https://storage.googleapis.com/flutterflow-io-6f20.appspot.com/projects/flutter-freaccess-hub-0xgz9q/assets/7ftdetkzc3s0/360_F_64676383_LdbmhiNM6Ypzb3FM4PPuFP9rHe7ri8Ju.jpg', + ), + width: double.infinity, + height: double.infinity, + fit: BoxFit.cover, + ), + ), + ), + Align( + alignment: const AlignmentDirectional(0.0, -1.0), + child: Container( + width: 200.0, + height: 20.0, + decoration: BoxDecoration( + color: valueOrDefault( + () { + if (functions.jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"A\"') { + return FlutterFlowTheme.of(context) + .success; + } else if (functions + .jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"C\"') { + return FlutterFlowTheme.of(context) + .error; + } else if (functions + .jsonToStr(getJsonField( + visitHistoryItem, + r'''$.VAW_STATUS''', + )) == + '\"I\"') { + return FlutterFlowTheme.of(context) + .warning; + } else { + return FlutterFlowTheme.of(context) + .primary; + } + }(), + FlutterFlowTheme.of(context).primary, + ), + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(0.0), + bottomRight: Radius.circular(0.0), + topLeft: Radius.circular(25.0), + topRight: Radius.circular(25.0), + ), + ), + alignment: const AlignmentDirectional(0.0, 0.0), + child: Text( + getJsonField( + visitHistoryItem, + r'''$.VTE_NOME''', + ).toString(), + textAlign: TextAlign.center, + style: FlutterFlowTheme.of(context) + .bodyMedium + .override( + fontFamily: + FlutterFlowTheme.of(context) + .bodyMediumFamily, + color: FlutterFlowTheme.of(context) + .info, + fontSize: 12.0, + letterSpacing: 0.0, + useGoogleFonts: GoogleFonts.asMap() + .containsKey( + FlutterFlowTheme.of(context) + .bodyMediumFamily), + ), + ), + ), + ), + ], + ), + ); + }, + ); + }, + ); + }, + ), + ), + ), + ], + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index a0fbd98d..8d32c695 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -27,11 +27,13 @@ dependencies: sdk: flutter auto_size_text: 3.0.0 cached_network_image: 3.3.1 - carousel_slider: 4.2.1 cloud_functions: 4.6.7 cloud_functions_platform_interface: 5.5.18 cloud_functions_web: 4.7.1 collection: 1.18.0 + crop_your_image: 1.0.0 + data_table_2: 2.5.10 + device_info_plus: 9.1.2 dropdown_button2: 2.3.9 easy_debounce: 2.0.1 equatable: 2.0.5