From 45778a986601dc05c8e15f0c050119a3a1223708 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 25 May 2025 16:54:43 +0330 Subject: [PATCH] feat : request and request tagging --- assets/icons/place_holder.svg | 1 + assets/images/place_holder.png | Bin 0 -> 23331 bytes lib/presentation/common/assets.dart | 80 ++++++ .../lib/presentation/common/assets.gen.dart | 9 +- .../widget/app_bar/r_app_bar.dart | 6 +- .../lib/presentation/widget/buttons/fab.dart | 81 ++---- .../widget/buttons/outline_elevated_icon.dart | 4 +- .../draggable_bottom_sheet2.dart | 74 ++++++ .../draggable_bottom_sheet_controller.dart | 7 +- .../widget/map/custom_marker.dart | 10 + .../lib/presentation/widget/map/logic.dart | 27 +- .../lib/presentation/widget/map/view.dart | 62 +++-- .../core/lib/presentation/widget/widget.dart | 1 + .../lib/presentation/page/map/logic.dart | 2 +- .../lib/presentation/page/map/view.dart | 18 +- .../page/request_tagging/logic.dart | 3 +- .../page/request_tagging/view.dart | 123 ++++++--- .../lib/presentation/page/requests/view.dart | 2 +- .../lib/presentation/page/root/view.dart | 6 +- .../lib/presentation/page/tagging/logic.dart | 15 ++ .../lib/presentation/page/tagging/view.dart | 239 ++++++++++++++++++ .../lib/presentation/routes/app_pages.dart | 25 +- .../lib/presentation/routes/app_routes.dart | 5 +- 23 files changed, 655 insertions(+), 145 deletions(-) create mode 100644 assets/icons/place_holder.svg create mode 100644 assets/images/place_holder.png create mode 100644 lib/presentation/common/assets.dart create mode 100644 packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart create mode 100644 packages/core/lib/presentation/widget/map/custom_marker.dart create mode 100644 packages/livestock/lib/presentation/page/tagging/logic.dart create mode 100644 packages/livestock/lib/presentation/page/tagging/view.dart diff --git a/assets/icons/place_holder.svg b/assets/icons/place_holder.svg new file mode 100644 index 0000000..cfd772b --- /dev/null +++ b/assets/icons/place_holder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/place_holder.png b/assets/images/place_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..fe12c5a005e81ec1e5d1acb2da3ee323980a0a75 GIT binary patch literal 23331 zcmbSzhdynW@%S!gRuAR*4%2tw1u91=*+2cyGiO5AElq5TQT|2uHu6^z7 zD|`RmKHu;6ANYAZJY4s_-ezvnl5_w-w{W8TB3IG5uYigh#000zx2?Z{ZfH5VEe3Q*n&BW8d)!x(F`uStP+uIxA;Ns|EYwh+J;rjeZ z`i9~a0N@5RQMVrYykDF2u4gx#?A#jY)7>P0Ljrwu|2BP=x?S`s1Q+3QAa z5%5ywh|3RAQ5yQHwVt%Olp2&Aw=adf+6nU5-0mC=+?Z-8S6J%p?@j#|*z{<-yKic8 zbh>xrgU4dhG=%Q||BL+Bq5?oi*Hs^a<3`&pEH&dIx(DuHtdldtA$LSnXo^pYf)^@a zAwkL0`}y@5-O8ce*@w99?xsy(6H<=x4yg)B5gD&@=X{#_1p1Yp z;dj*>_P|}ncH>~GDbsEzgDLk>|B4#r{b?sp2Zl1QPFjylJC96R?`v*z^BNXIgTFcr zDs|4rf=Qcr4?qgi*Hia1sG+5fHt;TV4eiX5*R99G>Vt2?S6TXdsyaDpuM z`&=u5nvjT+F~fQ=e7N7;mAU`$HofmpRxCYtC7wN^L9$4R74NzFA{SjfWzbY5cNeB* zM9j^~rE4*iA>xA^{?|Ycy0gK*nT;Cdj~jhjvV6WvT|1_t#Ar|*t>H1WQ$5sDt$)oz z>}iT|Mmf~L&Ddboh;jj;GebEUMy&7NbTrs1(mDAtK?MxMWPxF_N)qKuIyyw9Oj2t2 zBQ2uRgHIHgSIgn~&c$#YV7Ta{-s^Dz^U-=Elu>i^eRtCkw7l_t(bP4$TB#!OBn9E( z%fd+on}%XZpK69eK455I$FSA5`g30#9j;GebA-|mAkpzSdX3}NiS@gqQ|JdpQuCn_ zobsEZ!=}QXSKyrfI8A=3sRd~^8asa!JuJQKrtvtPaZp(SBMxnfbqJpN0==(%J!D-% z*WMgzjy^+rl8GZ`pPIS+NwKgJG@dRn6O2ZcO1WKe132B>Xwk1WNdR|+E5eC|&sPLEZlz4{0 zT=A|iQ>nMTL(If(v~Jj#J9HE=ck|Fsnh^YP?%#)bhz2@*+};l%g0FvJA>!d^ic?5X z>#{ZVB;0tnpRty*Vyu&UN}+cw#9#<2_c!n*#lL60eL(^|hgI^6dO-usdt17M_dYF} z@xs8N3^17TLbODoOD|^?m@0IV5K&qj5mDSNMMHa#UCDM^8!elwT#=|OZl4Xrf=Vo^)rwtRG&|BBp zDGDODRxLlXEQFKqgtCIMnqshCoQG$*hIU^I=l+N%dEy5B+tI?&l&8%0+*THYXDC#g zZZIKeLKu+xNpK|pNqrJQd>KrEY`GV~!}Gva5qY&r3s(a^*n1_8t$O4yWjXx~t|4|c zRN0~%_>i_lPeC-2-Y25N>fJfOMP&W}>R3YsKEo8$k|fF&o0`Y917B_v)%Z1H?#aVr zW6O(VIHph~GfS=ba~Hj_5!%SU9nyLd#?QkOr`J}0LkM?Vc6jN%Te(eD8;l z9+DgUuH;0gmX z6gnbrP&wekc`1j2>+u|~1L0W=_@DQ%iLW`3qbDmW2LlIGS|}9#FKV66M*6HB9DFE+ zaCp|V%a#-o!MhTUHwGSUGv@HF>G%cX@4;XJqXN=)I3iWTOzB zohu0u5eKr&#}qixtiF5L-%&lwhqoRr$gzXxZNx}vF^SW>04nksvILXCHCv<%1I^r9 zedU+}lag#Ba|u}+81hl(Jed3~nHdT-uOGhTl5WDN`vpon+4$nT>5{=)20A+5wwW3; zBtm@*v+OB1?Fn`KPy8}F)&{9I*|B$7FKnONN-C)+rhMk4qZ0~WD&Zn4Q5$Q{r{qpk zT0IN?kRpge@%C8MLS*lWMv*>*MA#SCo?ET*QGg>n~$8HQ;X|IL}(260gL9!-hmJF z$iGow>ckv_HUQ2&rih3LyD9B=16N;~K2nzX3RI7OU0f0f32TJXfhO?(HB`S)$WHoSS*yngMX*)?_`X3MVPJbIo0cx29vgo85ciNJ*#M5aCSy22 z-H*}X5fMo#+LWr#U=Tw{i5%n8;=}Xt|B+iC&b@T^&q;k&85k$8-1C7il-!}uM1Zt& zFdJ1)J@?tDZp;3XLxE|Skx{7&z=FBPW%GujF%yRB%ERsLy8jV1l}5B8U<1nw%Lk9q zhA{}n<9|ev9{lHPtC8c~Sk}W$?E_R7 zwr0RG)bNqi`wTV>h!OhV8&McDOdA8o`C}dIrS4}Welv?SWqg|3?qLY|frVqo%(=2! zJw$ov)yLL|iBlweN41yYFpDkEM(<19HF3iUy=l25L*bhSnL&B1g&u zFyoklkaNGN0?|bUMQ>J@QP_ukDB*K0Rf#Z=DC3NUR-N_xGERoMRb&-5q!%%dwTd)R zIv%~VS*8rgDhs?iXy_*Mm5TRqNUH}!@udPN!Cr5{$`EK%+b!~Co%F8Nr(7AUn;$z} zaW$PSq5I53bS9V*s&JpGCu_895li|^m>7LZ)h%h^`{_)7c6CRr;T0O3&J-sUH^>f@ zh*AXSV!DM)M;6s=aGz`|+moz!mk4O}d_CIoUIjRFmHwvOU z;TWgz=z6z!1u&0S_`AX7$Nc4VS^h^sWmeI;6}9je$9;XP`&FO3q`~8k+fCSwifF47 zjk5vS#P_fQ6@Xo@PGTYOkg`|blO<_==Nq|Erh&}MjhMKhy2YjukrMCqCi_Q9O z+ii*b_5z0h1*BBW*L<6T;(}=!&nl|n%85dwQ6qQ<)E2Xq>%s9176(%%VUOz);*NEo zMeD_M#Jrr$U7YU1s?@40cJT2Onq!1amVSRQ4z^w>mB+J8_3h0Js`e%|#x6I$UXQ4` zrP;zuxTTYVYbS3|r>nMu>L?m~5(YX}uqtsh7d5F#;?W(tgpOH3ALl)NPwfx^5%a=b ziIJKQ5~ILKi=tRPU-&=XoW!{v4uRrh2Mhvx7 zRl3&X{5yXJ7X5BZhCwVlN0L)ADU*v>hah#^4z}+r%sLCVr$4wj0)t|i$FAr+5?dip zIGXlzi3$}ybGGP&Z?uBZ01*FJM_YJWHM;4Pu^qHvm2e{#r?Yh|Y5&GU#Dz>bF8^Va ze3i$Y%*Tpwr&P3PSOM_e`lwP5_eYWJ@Upt(=dtk!leH4)oscc$?E@8gc*kbzES{l-F^3vecF<{IK4yvc;w!m(i$&Tbri>vlnW zR(-t@Wb@a>t4JKPWJ@t(4?mdbZi=NK_P>hPM9pr|5hQg~ycn%W`s2mlPo%|9UOG3$ zo=``2Il|FAM44X8;3;O$W!%nWW4sXHNcLnX?oE-bkn!dl$06oF=*IgM1}@JiUH>B7 zKqI~0P;jK9yE=zyg4UsYoXPBwdx52QlT@T6y3$%ivnz^H?)w%1RIvV*+z)F@^6$*F zL#mM4j~h+5w{_66pV?~7{ubbv5)@aXO?eK2-Nf%qb?7L)XY;-<|L=;|AUf?HGxN`s`U(Kgdds*i>gIloofqzVhvsDC2arL_m+fR#U@J4X{w`l zD2^6zcW`iA3Z?-W8Hz&X<}n~GBa22xa{@`y>Ef+}Gqf5sCagX8y#*@z;6<&{PXga$ zXs<^_Xn1taJtD`(npS^_+2}k|RO4_$P&N_-PfQX_WAnhk}Ra zcaIN2X`*N}&oA;%rix9li`N#T?bp3F-aLm-1gqB$FUPnS@M@^s@tJDNy6JX=)Fb`( z@uxMKp7I1ye8@1xc`{bWf9^N61qubVj2?e+BC2BTw`H(4&~uhyqtkANqsnGEJ8!W| z2FtoN*6`GoC;noY>b{Hh=fLsybCbl79nI%U*IonX++!b(Z}(0NevptN1y4zZDM;fo z@ni-UN#33)Q`rN#bBj!)5@JlhUUcq`esFXxIwB&}i(tA|yzZJ%DDx=spW)g-mpjPw z4;xD4WI(+pK@Ih9R&}CiOZ|Xc$}rD5SXpn6(bh(`Su}9f?BM)|dI_jKeafGzc;6@q zT>M&@eiz{uwPb=q zIR%g&ubv$<`Wp_1ma4E!gI-y)Fj8HCy4)7o9U6!EaC!tGT6;g!(sk8BaN~HZbA}J+ z8>5X$Yy1au)l6ptkUI^iG+mfPD0hLQ%d}cZ+G|uUqXj)-0+e2QE$-C!2G~24E|clB zpJ9x_{)^s0R<~m(({NzG7MsfkR&A2x$IsF7U^|D6Jf_`SnyJdLiRoi;t2-7q(EE$b zgK94;%MCya{J<7~_h!n%OPXCq+uxO~XY3Xr2a_GLskSpTR|nN|k-A2l__D9d6fnF8 zHai;8dY^d1tQgX5gQ*ewjJBe2?PsdS&~cwgN%On5pZoq~q^Am=mPX7^KT{?1dfY;F zQe^y=F{S8Dfl@mjY>k@(9v83Im}G9~pA9)Pm*fv*p-?tE+o|NHn9)=Fk=1@ZX_k~~!2BlC#^NfLT?iUeOkGyh#^-hyatjKTLC#ArIS zp5eJbO3Htu2D7@`$S1-_LM4krKlxI&g9^OOPcl> zb6hj|s-x#=F4|1Zt|NR3L(K<@k+uNPp=wr;ySx5tDtO7yCra-KE$2p2BO`n~zayNr zx2`rqb$|z5m9r<&nJ-KMLbpA7DuTG`wUEH(% zWjnXf?-xA8V-6e2H(c~!X$LwFfmx%>j>=zN;l+RwYn;O@%}tt4 z-xzIFTb^MF*e6|>#+RyY?oni_EY`Qc_S`ySR;c6qF2sfRfZc*1fuKte^|@RpImcuL z;h%rB*3%P`VdMFn#EWc@{M$0P^7K8ygUF>L`=$Cazkn4p9UbAyT2Jf@7#J;LU}Jn& zfC=^97Vs(!m}0=vy;1Y#b@Ri`l`r?7a)rzG;-eiUM95q?2ZPl9p}CP??F+b`TpzVp zpe?zK7wuAgP>G+Z34Ke!)9<@fXQsT_&pIttzz=D<>{HKhBkf?(YXfp}NlNuICb`Dc3q^nJ?yCTTM0JQ2=_se8|Naw?G+;QbJMOqfvVlMTtne_$MJR4dEkFlcT7u#u;`pGNnn`SnN7 z<_Xzm^aa-Eho@lNX&!LwbvA_Mu@+FnL8-{Xvo6(_D@&8r5I8TT!;JZw6x&&=21`^Hja<1IWN1C)o_TPq6n2c6a z9H;VOJ`W2lcNT8fR!KLEt_ERqil|F_P`v;AXbIyT{z;hqWzGnbPYO zT>KKpUv2ZkUZgq7$4k07Slo2t9mGm!QCcH*z4Tls?jNJ=gcHNki-awXP+f~Z>;WzR zPj`)aw)kSx&X91ediJK=j8a01s10pyBXpYbHKwRKbV7G6-&B=ZhW>UE=<*UKv}epl zk3Yf(@6$W(#$IP2@b)a}#?Ca9+41s^1ivwm*p9Jujy2u=8btmh4+BHOl2HHbZrBU0 z(X>|&Bx9LmGdt`~{L?p@VwG{MXmx?)KkQhb`>3watvzqakIl&AT5)RuN zfd@#w_EGyi%vBvfOgW*B^qxMoiE@MyI(IV6R?95!NRUY%?`W^}pITT!I-KsTHMur{ z2jv&p-miCM$$mZKuNSTPK(KvJ?;ad$#_*Dvk-jT*deE%-oXad-jluqgo2kXq()(Rt(2;r{#I9cSaHOB`;_HVE3;duv+n%S@q>zS=(HWIA+-DX5uaalFm>DOtwxu5EC=v451rAGl(NWg z9o!!+nKdCBx?$M}rShQlB6Djf25hAPsRhBm2if0-J?%pSl~C@r+PM}kJZ3ZJGF;8F zNcL(-)j{zVy+bKg^H~7Pr`5;GUY*Bpih)-4&`F4$7j0;$!6oI&t2}Ft9)3#)n_m?x z9oU|AdW2}QhCLsY+#u$me(W$e>!8#ncj<{p9WI{s62b`WnyGY{a3inLy zbM7;;lhG@vx#rs4amDOn2+v+}VdsSuWTgsIhnn!8dF>O2vzsHL;e`~dtO7^{Brd-XmX{PKtgv!x~Ur(dI z^W*Qcq{_qe{VgUm)yroN9MuDZRw*5@^WkU_lLW@t_S21XAMu1r7xlG&S9?FRrmh5F zUru`eczo@HXdUTsQ~EVck~c<_xMQ)#c=2)i_kZVvCyeD3QwYjuR%p`Di21%H_qyXI z$bs$cQr`7x{HG(%SW|wBiH0YK_07p*n-)gNo|b?J(|JeH-t3rh22<>3sPlStW+C$Q zWcS#Yg_X{@ghyy4+WdFsC+rr~cQ|g+2h-a>-e28Xa;~gPWVC(n#G<;=!kgdyUcHo3 z`3sHGY6snf9T%U7L5{^-UK@SB#u0T};qrNaigkyJ_F648X`pqo2p^nTxdn!J5ax8t zB^3n}dO`4wjXCZ6TQjUL)7OGmsx!qxPGOwEbmfgT8k`)f#0fr}Jb8OUrGSJ(bSrzB zCpX+~91fId+34qXexl@lJExV=RW}}$(ZWg65Ys=xO#c#z|$!qD%VlaCGJch+xw*r4xGL-1!=9)SJ zSS$H$(zI3^C{FlpTkx2c(Cmet*Ot`T_P-s)#ox&&=PNOyC}oW7@pK=D{54%{fO8j8 z;G&qP1)MX`B!TkKZ^+l%9=9`-^UuF})xkFm149!|7lcZ$?raP}2D7g2^q z2KHmi3<1eeDB1vG5}69iWCZ& zn!*uOhX!w_FGGfPMBco-PpMj>1G<^Y&T&`i_l~}w+_`vX?%4~vq|E^GnZVaPrd7$U z9u9APEdCD*unFG0u2qv^hv)a-K8VT@lqTgi;jaUnjCNMWXZ>@RvoM`5P<#2c9P#EF zoOr7a7k!u1`1h%8OkN@t@AaDw%Abt$8z=EbfMn{`>0h_k@{*sFLD5p!LYl+BWUH_> z4&uS5xZ}ec&5`jz3+xFRl`+kYs&!maXL(dEj^%F>O6x-Ma!B|RuOTQC>))6#j&6&_N}bnydndT(3q(CAEn6r3 zG0zI5BY+?3aBjh&S>5W(V^>Mmn1~0y2|V;&%qbA(V(kgrvyP$aPm}Xb|FxfCzt6PXNgn@jnvZSE{!zp==<#shqq>iqzKTMX zt`-8i0_H{S(_3*EEaJDHFr|06@hZ1^MWicM^yB;GqD|OmbYi9$tZ`K)E#RNBobuz! zP6aH<^Of&r$Z_g7Jx3b&BMMakx6nD|m!x!O5@t7eQvZPc1H#)~%|q7yE>1P7f%^6X zi$(=-XW%O(tE|lwZFCDKpT)L#b>Dq={Okze`r^NKi@?!&`p1~Z9x|eSS&O%`yYbI% z1}>yA^oP*6B)oeF4v;_eF>{8L6c#?NftElT?tNRG4Cd;+@zTr~J*~!*NLI!we^2bXCmz0txwmjn}lSi#ndeB zUb7PUXn$)|7(l@KY>UAWMb`c-zek7w$NpAx?Ris->1~r-4W~_`*Kdo}aI@c;?eoXZ zaL+PqyK+9^i@D8TNdS+`0khNVVz-As_kp7&xsC0;)%0`m)}RD3aL!_VSnt(ccd36* zMup}dvsxq5$H${aLS{hO$*m#rk>#-yni6mZVJWRgDV+FZkRzkc&qm+Qd>u0jnaciA z#WP_t*8Kv`y%`D|!yHGHyi(?rkA9ZZZ_yI9L~cdeC27Oa4WM5u$C!cLbM-kHg-6|g z;Dlc&Kk8TSLym>*8J1I*R71~mzdULUvXAcR4pI9>?PRchZnET*qA}IO#PaDWzJ;l0G3C^f&2wWtE-1DRC= zRTf}$d!@Jf2C6;|HRa+nz*ej>@@|4|g*JG#D3%}VS?>I}tWPKPF+vO|oz_TcfFdh5 z&S})~o!GR@p%ZbnC&zMS5-!nXOt+kG5=ZLQ5`wiwGmT%}dba{4eyN0(Fdn$R3VfKN zVfo6R^j1QB4H#JKI2TRQM2Q>>hvQi>g{o(zV=v=JXbHWE)1ieSU?W?!xYSvCPgTFb z4052b@Q6gMd!`Ae*t4|p!H%2F1F0m%t+&gh0ZGb-0-R5jzMDZzqAY*E|Ki{E4q;w#;lxv~u(m_}4xymA6l#QS{99Maj+k**%SW6Qx8-w0Y|0?xt zWvU%J99m~iqt44xR30#uh6}&QS{=XZ>gM#hLKsnCXw^7FfI9olZiABK zYa4B}#-oW>r-@DB7e;=sHNZss1nTM&_34t62%v_A1M)85Q>lQdGvv$JuSV@16?`VF zs*@p315r;iVSPApU1-k<^ASs-TIjFXrq5eB2t@yezFDQf=x(bGivaqYXKLNuUcEg? z0ysR|T0@~dCv8WLF6F9rOJAmaJ_W!3iW&0-2B>wf+(f@y@VJ+^bm=gg6?$^-BIB4V zwmsl|d=>U)l^LUG41CR|1{j437VuS29g;X*1fy#s^*8-}{A4wscfwS+(SLbvof{{r zN0t`L)|<-=(0MOePg@;}q3^#e&2@%0Y@R_7x(aWg!sFbk;}oh266cpc4MBh2m3;#3 zCCN~Y_KHABa2!Kjp^I@ff)5_%VLtASl6liC?guPgb zz=&1?5gLm9twA@Ptq5A^*7=smNg-*y!$5?+YH3^RC+PiGE|`lQCJI7mg?xKF3+<0 z>)4?4tdM9+To>NhuPv??xYA<*#_PpkI$`#h+%2?qTMnnw-e=>Dv&I@l-5n`9SL?wD zd~~t|u_VcwS5sHDrs)_0@Lq|bcv_SicXX^U@k%bCABbl*i`fMMAD4$=~p@ z^++s@-qjZdrkF{d4Y97JAsSajROz-BfnNCJCxxtne`%SvwG4@s9G}HiL_g~hq=ee8 zFLwN1^e-z1o20!_qOq_A33BbNsvvWd6)09ba?UbF_PcXElEqYLXB{fz-?x3 z>dDcYjk+gazfVD^W}Y&b(CyqP9~}X^k~-$PxrXcga_d)Hm1~iGGOf2WQrZ_VYP=l# z5Cupu8NZrOpo)%n3k2KjO=HtRp%}efm8mxn^6(C32w6iq4D-T$yF<7+=|)EsB6M7m z(DtmfRgaRa6s@ua0DIa;9;KFY7N{skl0`k`XWFWGS+Y82&2(qs5?{%@TelUXC!cs$ zUl>4SEp9*c#Glnxe6M74ILsLEu*Gj)#U0`{aA~-a5C@4h<5}ZMW*`MpTAKXH zeI5dUfJ@#WkB}y#N-y+vbb7Zexj{sHd+&bnE;W(=vs)&GB84JpeX`ac`tbI510v>> zzy%Awa(XGb6H}ec21fJITA={C_i{ zGjW9!#0Vh41z=eQZb3S_NbOO3h$#G~Xl8nk119SNHSp?!iI1SV;RT-Hn~?4Q9xp)p zt^fPn7M?{E1I%baXiiI#7#;0=H5@1FCPoh8ajY*&cu#}Wqgc-|OF-?Y1RSBTRX)~A za1r(xhi2WvfN%qramh~_Oqhu{h{`;gHsRuk|~4GUexkaH;3Dg43$FKY7Yu zL8K_E>__FjfT!7D2Upqhwu=JO0pcq(EV^YGxJQ`4QTKnpyh9feZGr!gC0Cz8E`0`1 z2s)wfWwDT-+#n~qKhU2V{35^=5b z16H7*xvFy;6^ou!iUI4YO*f`4BAX{sZCfnUIF}iN=vnIcP4UJHjz;%x3i0r?Kdc0c z)RNwRHKj2yjXKJ#Sk_~4aFka9dJB`(3CW#=0{{8TtrCn{9T*9SO%oMa{d&RP^kD~> z$3rlub3RfRkX_#BZWD-!%VB+^dwuGKJwdKu(UJ=mo7}iwUD)^ay89OY>=2LB$+IqOMfVW$6m>yCNZJs1`PhXSz=H*krZs4FVHO- zAM>HKqHmdizW|5y#4&!ZPx|uxfMr+!%!l2ey2`ZC1?nd6M&5py!;*jobH88!TvZH^q^PDlxQ67O zRgNR&gviE;2-0=2gIcve@N#6vZ0b(iZUIjUkoA{A+kB?{6pb`O$O8}|gfG=>> zv{6o<2%pU{b!ZjjxV`!wT^A|H+<*l$-`$L}#9>MHlvt(isD{GSq8?`~Y=d3~1)uM5 zzzy*pk5<`|l5!>!{3A4KZz2aVt&E>2FZLKLLggG|XP`h7Ap}RB*A4$YMRZWnGA7uR zERzaqQL28m1p;`XP$?$2TfLiNqmoqB6bDaVjr5ZtS_9PMU`8H3&I&|e zQq(#C`x12XH*=c0)p1|&y008VB!reVXi7N2bvhexk01e!&C176V-)@g*$OpnSDga+ zxw%zjpk%42IYXV}c=5%(8tF{4>x$S-&EG*_fUJTC_{Ozkmrm(r^?Z_mo1f^da7EQ4c_MF9y64|nKIu;^wy*@=4!gJ`U>=itx z_SbA99^}#taye7;A-d;=FrB|f(-TobCj-}yG=|S`Dm?Xh7wflSYiEse`%LKGo8&6P z(X&1|yo>fCZ1?43U>gu>w}8n9y}0^8B>XvJPslyAJz4eN(8E@JK2=^7r@R=J$HG~C zFG{82R4~aHzo-UDbKR}iVQ*>iW zFp>geL?T+Lge*AJ1)1bvn=@%TS$pWw!M#x!#2988=~C!unra1aSKc zDmSSO*nUyl#NoYo1@7Mcbz9u^xZ(mYviFSsC?5JeaL0I>D5_fmiD@eu=PHm>_DA3q zILi%o6ZT+}b64dOIsW6U=x5p(Q1wwmFh4yL12jduZ3p2Vg>i&ZD?tF z#>}5X@Bjreg6hR7@z6OKUbG<_(4X8m8&;Z$_~U0m=Pit918tlMAG|{*k!+-v-yuzR zlYxY9rG)_FCyOrd-l7ATpSJ6jZW3d+^1k+&7$~N!{Plpe@G8i#5hdv}1Y_ycf+`W!F#$Cm#_4UK{uBEQ#R+r`jNkVk@MJ)kM zJeC+nW%0IB<2fl1+#G2A;VNc^b2j#wr2RY4WM0`?s`~3N#ajp71Yg3XdlFIB+ww{T zv09(g6r$~Ee%0UG-@w3ayc?l?FDK;KO`J9urMwwc*)}ngPk-N~0A@UQrc_Oa=RS3V zdu+5SXXXXKS<06#sSI=ZL?hZXT0(<|%sn4eAc#;G7F-zan)1uoU)0z|lp(Y`kH$@y zzp8$9$!d}r5Xj}Ic2k=T*Fjvjf~62B|z`YY_OwhyuBw3NP>18J~efe0AHI0ulV zV?H2Ro`VEzm2~2wzQBV|y~IkMeO15jlJX$q`NCuHSt{3GrY2h31m~p}S|`*U^9$ZJ z_(__WT{@?iUY)0k4@Dq(ei6pm$I`#d0-Y${2R=}YlROri$yC?xP96b;7x#(ozl}$W zr2EFvHw_}M>sTV5v!I7zg4qp7ZHfZ=`#L$uUcb_DJcXR|6a!@1;!AWMGT?;o@nc2x+R7MuX~A?+!apoBB`WIoe9fW+)GTl&VpINR5G_85`B)JrlrUOU{5 zc|d+pAMW$1Dg^tfU=VTOSe1;W8}oh7pZ>Vh+WXA%0rrW$!eSb|*L#ISik}_puedOa zgZz#LYqd7ds_OanBgZAG;}h=labM+!#t-^IrZm5As-AjDm1t$FTOhzO;grB31(H9f zM4?|NC3A#62q+Tii)@(0$X8qL{7ahOc;xud&$*_K3wkhh9$ z=Jw%q&NrW|SCW)7-(7b~X-w|S_M{wg(Uv$J`JMKmL}8k1hY77y$$P?Tj2;&55(Np? z`9~L3>$R?L?CM6n1!c<1(NcX^0h#7EbJShmqwPzNRe7oTa;V$i6B2wkI;+A)YOR0! z5jg1U+IYofyU4(K`idBOP+j#mDo@850I;G$Jj`(5wR4IpG@y|-*5P79;+dmiVbDlHL zbRNio5r4$hLNhBhl`Rq{gRHnU9(~U=@wjbW9h8cFB4 z+f65(tSvXS{TzK#Rd1jq2=X!*_PT@io+&9G zvz*z?l!x1ezQ0S}%*4{2I6QrE8p4Ddc@QO2?9`!fI$`cvSZ=ySgt-2aKLBRPo;Ozg z{gqX>#Dm5l;XqbfCAQNH?n8fV-<#3PIs zVPDUW*6oq11!BAjQ|dsL0h6N-+Cc0wTRIvw7gdO`q*9OYpQsiQnJt5=^|lS3XL|0E zx$ums1zjV~?A+=99`ya4+Y{x{WgB^DRR}l)EWk3um%ZRKOY56c*^YgYueioVd#RFo z%QeT`8bGzIr6xWf3f07Og<|R=yb?0Q*)$PIz+)@U4Be=<$NX{>GyIQPRF%!Zanw$s z0Zirup_5+=$ubUE-3lK8Yru>}C6C1h*-# z_z=p{rh}0VntTd((IZJCUnHx1kFNR4Kzt(qhRw>`1(^Q1`8FgUr7|_H;c8~fJerFQ z9ya&<_3h>45xs$8JIm;*v`SX~6i-iv*F;&bWym|`zOROn%1mpP-BLuyI};t%e_S}Q z>=0jRssoWc?QUwmzw zF{aQbVv$T{-0Eqn1obihobOYVTSg2#LtqSk#(~b+xue$}hdV|oh`SnmE2STYxzes% zh_=VD2)_+2DPUh{FD6&X&_iomK`Ljd)41^T!5<&D9AOs~(^dBJ8LLzU%PJxoO?su# zlOUx(2>h-$sq?^tUJ3C6^wD0<`?rW*s!+w)(5LMguQKDqrm{WCuX%~78Xr-V7|K%G z%|Cl+8{>uB*&jOznbxQwJDZ;zdlet<@V()dyHV75%HJFU7cQny@T;uO$fG|mXo^~N zXFU93o}8e86~?y(t>8W|fJS5O!cHVH=PvI)HW zdtP7onMcw}xu_TS(bI!GM#AQO2v&t}FR9?OWer2v8l0tQ0)+VQRVVf6VM{snDZ0;roZmF^4;9?#e#PZ~ z89bRSA^pXYUi-#o(ge@j-({w?4#8HqIw=>|+gGo(^E(czgNf|hIBh|1q9eg{5G-b{gx%Tw4XU2plW(KeR*&k-1T^_lH>OqS%B`j zAsKxTjttBm^8VH%^~cmi%U?_S4OT&w+4*{kc(_&{YTK@;B+g&DHIq^iG(?(8Mdy68uo?~uu!0ZGJ#@~h5O zv)&me_tz5B{Z}{rwut7wN1VS|{k1 zwrY4u1u_lRhpWSFh{sD-A!NdY%gpR(=LVlw&J$M0g3DJ-Dvf6Q8t~0|9KR2bu>pRe#OO$!Au5j2-b|PE!eOAMSpqP-W?w z9CZ%s(%-l;0B3YW_!(Vp3+gsq_u@FL(X4qxoI9)!udZx9bDewqudXuuZOLw&IFZH7 zPJwo+Ns8+R7_bjmr?2_(5mqHS%Q!ardbN?3R}zaDO3fV`z5KBOqWyc6E%6J%58@oW z*Noi*V(DLmhJ8}5Z?k%uz^>sl`;MjS{NdHEIFE=&M4EXM2(xS7 zpQ71EsqI5-%>%3)Ccom=s{_5tyY}AilwVSLEoBhVT2Z%P+FM=v!1o;yDz!R>3}tFX zd{@Z|a10D3;RS#z*o*%QkfMEaEF#0U33g!Dwy#8AH9_(L`xrMgoyid>kr~;O^;^xZ zigKH(WiB((jmpusR>x^zDHPjnvi#~pu7ACneclJ+EdffR%I3qUVvahxpSQ-Jqk}v5 z6)39SlX(1^zV&WB{xHTuI8K>#FzgUIQ+m$byg$uSXL$N`+)9Y}unFn?`($2mR{Z<@ zJD95uoafp&`$lNe@8$4G#lK)7WZzgFJ23MunxLPw#6!bx{am6tz_tInxmdaYE$4O( zdHp7mV2rQI{nqBGmgL85f^T183;rl0lSW*SbLCIhF4HRA6*y{9h`w|WcKmov{P_oL zJ?wP$<_*mWq|VCIlug}t8#c~Hsj>ckhsv+wpA<|kT9d}4Of5*O=ocSR7JiJxQA#)c zJ&kZ0iuzF=jT|EYeqX2X4}E4W$wf|dQ*b6yyImLHd0T=JMvv+(Uw74=J&(1+pCY|(gZww z=*n>k8b&cBoC0Qi1WTQ}+DI{|^`TfTGI_2wQAJeqmszzT?=-ZMNS|+A-h0Buvr)$( zH90Pu68yqH!|C3K9eawtdlunUKm2YcE~b_jsr&ZwrFWnas`|o^K_sm85xMWwbDhUQ zCR&}m%U6IC>f_BmMKq0gLW>^rmgQRYz(*__jkxJrotOFRR37D$usI>=bY->aP;I>& z_rbiQV?LS=hDQ-{1tii(mI7{KlVb1(PMOWh%Y%|9-)gHW)SObxHyqg)`Cq(iS6;2U zirKZjk#SogmB_H{$QyXo{{J;{-v4ZV|NoB&s`e;VJ62I6rIZ?N#ikUsw^~)J_KIDx zs;FIiRcp5Ph*YVUmZJ7fDQYEBTS7ip-`{`Wd%ImfUeBC!p4T~7&UGHo$GualynTb5 zDkMq2e`>zH8d2wUbPYp442JP)9e@N`TEEi%Xgyo@2d`);pi(7PJ8wVbU2qViZWRsp zXbX$pTT?25-pk)-QCwEDzHnFR^b`BGDRuUVY+r6%jO;)O6B znjj30Tj)ume}aIskMwbD$99`{2-57MC-XjUU++EfC>EAr(i}gIUNI>9 zH$zFR{T!wouMwyd!mZi7WmuS7Wt<*L#fZ>crm&`?P1;gkp$%!!bPVN9{LGafX>ON_ z?>Q$olMOBwALDXOpFmDu9gAiIXV`l<$m?Pr*tc9?#;w0T0qnGDea}3M9Yc%x(RE}5 zJ2Iky9**A#lG-`g*IJ1#;#tkw-AV4qP6&|c(c77T6w`&IX<9Az_Ww};TG{-%&r>dK zthjx0!EStzMc9 z9_~?1fkm3zz0;utQD7qb!HjF*F)8F;rDs8IFdwb{i-auEv^K`DBEiA{7#r}4{c^5G zLs-5NEMQ;EUJ_CSb(oiq6bF_#u8iVSMU&hxD_TRryi+<>w;DbhG#eay+XO^OE;IDG z^Ull!5UksO;g#UN+TdMu*rd^-W!o|ljCnqLEd0zlb3?8Qe=a_?chc^>+9m!p(x9I; zEIR_?SKAf(N?>vw=yQE))r(i?qMjAGdna8*WTl@`8=_ZKKuMPnMs!%r6FRa> zuUCF{;wF)NK`b8vl-*cJa(yWMj}vaK+{S2)lY6^6KB2;FKbcWbJO^Y^zgY*pl)LK# z9jOIdYp>zPInf*Zgj1``nH)g(=OzRu;_mn9m7XOy-*a9Q43*;_f%|2sugcM8>M8?G zDmK5*pFM;04Ej82>yRx*am%@^*YubDc$x0+df2_}cdHcj@PJ`QAvq#Ex=2(HM=`Ah zHD_{wxCjQk(Lqb#hGVBjn*w)76kX> z70KJS_U%dt<}$s1f29L?TlU=VJXeo!AtMNK*CL6%O=ueU2T1rAweAeNwdexsOUa9? zGBz#SGjv5cgICe_hqqr!&e4#xURi?ZOU@En_%L@o(eZaiLqJ{QrBLRE05_EvUE|Z# zZ(k$YGyD=9ysqx_8q7FktbmA6%t_0F%+|}r41;l^#@+v%{CPj@-0Ga%(>P%85K^8= z@*+p*o~Zv8c{gO&U!5u)>t!QO#tk<(5nI1=HM8_1Vrx4=+QwM5>g)tNcc}KNR*}*% zd;MSm=Kkix;CWiyYSIYRm0m*=s{4Q+lc6grC@Nxt-V_ejr(7QFVQ!?IT>u6Z*=5hH zKZPi^ts+pua5kXW==k<0Ai2`bCfh7MH+&7lUAGUy_?qe6OUl~(&+d+@li4xexrm&v2=aI$ikPE*)@{=#yexgT<4SFxOQb zl92Jre?nlbOUr7>RNDTWAbI-}oA0{NlKD8T)*bdqhA5)LzaZ9Myt8I7UMw6q#zyv# z!w#B(k$VGl1f*Hgnv?7!zTcL)=d!s)5*%%osCpIE!J$MrdpRo3?)sZ?13|l2WoN6B zsjckN96E=MQ$qJB ziCIM)%kbxMPe6SL+yV+c);aiG48;4MKmrfyVrxzQNzxhKHn~}<c=(vWt3jYJy6$rzD#`my+(CiuxxBYv-nQEcn{w2SBQ59*D+P zrZ-xEz8fd@E%^dfk)HTYpf;Njl-vZG1LzDC_bY;3$hy{4Y}}OqHBa#vS#d=pj)9%{BTym$F9cq+?R$ld>?!$?mCCXj1mob46kPW_G-Cc$h93s=p$xyY5q zv1{qUFDwx#6Xw7+`C*D;@tUTg#s6!keYxKR?4pSB3e#&vpI;h?ww;5UmUm6c8fRYR zaU0`=`v%3sp_r!XXpTBcia8F*J4=*SQ_q!Mx?$h&B}DEWs%>0RMRy-t#y3j}`$+q` zsKGD!Br3*55@|GBKxYmmYlj+l;fn*jhY3;Y?NS2at!ef`nMIXnLC!Rhr4*e7%P>i@ zm+{?Rq^Owyhw1VEvKS_aPpy#g`js_(!WSH)wy3rx4ivn2!F8-8t%kOUW)>DiVux!_j2K?sVD)5wUM8JOrL$R ztbaTCb8DK98oF*aX|XhujgT7cj@k2(!7o^a%ky-F>|vjG%5)WK)ev67W&-V%--Y9G zzGMwMeJP1Ug;VaAr9FF6vP}3ttczXX$ zG#U=opXJMsbaVIwfmgJnqQitR&i{_)2R@8W5X0~ik)=n{;LNlV71Y_G?R4An2G9x^ zkz>;6ZmzS&P?vdFC77gj{5BSdbC8X1e}1WVfP))OEAgUqeZqS`2Jba+b_WgutqjrT zNBTGzL*W&(H*8MxJtIYwB6A2I3f}w@wARMGJ6|-oFAi9vFtphlI!vWCwq^7jF0AE(s1lU1oX%VU0Qu@l_iQ zvZQ^L4IpbnuP@Pcz?)f-`bV4OfbX@DUh)Sa2NQw(pPMcwS6ejYgZFq@5@nrLf&by4 z?%pxDpc5s_^0VvyIV}mml<`%AeHyqCaeT1f`))Bi_vw?PrXGV+?r=`wga>0y&Jr!Y zf_4>Wytusojp+t8kqW>bDe0X*5zW>}^!+$VjFkG^RQMD>AIsT&jD z(f5F;dJXEYNqo;iXQG!6$!{3gC@-zHL_~>jb|V^q`$cO-rF6gFP10(8{=g?D%Vj|U z;61hLm7S%oDfJoe2)hTx_^~L(*~Gjr2iq=CDCNQ%Q5UHjk+lxGz?A9OgZor9yA+J9 zif8CM1d&w4gTGK?^YiIyUGe9aXmPRz99ZSe{qE&L{R4)Hsv$W1o2Nm3gM?A9L_@d6 zUuTbeDfXW0y|Kzt)JS)QeWvd-k;<4O8}ywf&3q=pPa?ySSY&CU)+;W({kJFj!Y=u-|D ztK0A8Z4|GAiAxvWuiPWvrEM9|6Wrcl&o`Si@*fyX5MynC^JQp;j4M#O{|C(TV1oRU z*Dc{N+fSqTdqs|%6y2NdmTHO5hiTz70M!L9i=_5p0LKs)ue@YHk#9BxhI0s>g29_!?$u`JiE zIsIyv!>mS`U((b1&yLEIACFTkayixJ$$>w)X_hkt!K49w3YwwmDf{R@=H>vfW^kg( z4Gy*7kJaCm297;LBO?(=tFoFzh=D_4EC;Lkjka;3n#$O}AsO$<@>pMMmLO|AVXm3< z_##^=Pv~AIH$7ln5ZRg&gVD?m`tn9d?|>oPGmo3p^I04Olo}5HCD1$)W4bF&CL`@Z zhqS9^y0qZlHQG?^dpyEJb zrKX7~o>fbV;17QRD?34banuFEyW&r5c6<78%Mf0r4L4_> zXkOX<6heP}gTHkMJsM@x^nHi7g7>rTMWA6xC8GQkGNO7Y-&AZS3N`YkO|7=3@N^|m ze`?lnyn5nNJOs9P0#2PV2@u{H`EbfCiVNur?-7-7iB*1R-F1fUBpZO}C4>ug4V=#1mEiNYYe|5puH~d-Z&3 zYUyu5i8TDspYOS&&Ssy0!zJadWXWMN5`90;_GUMyM$4A|Ea7^Y?+&{fS_Db{vP+5m z_XyNKathOw=mQiv0~p(o8-}cJ^hp2rJ>D-6j7=!-j3_{}j2%Z?=SM2IlpqwC5(g1+ zX{y_OCanLE5lpoPrzX9UdapI4nQ#8X(Y5VJgZ99-Ah|=p z($)%M`x#-4bNWcqPL|{+>Na1O$v1-w(mUj7e_%fg0F0`S%cGNS>W zro88w(fu7Z5~Ig)MM>{8$DO}1x%#?#Meq+{V&}n4%XhTH=pLuWt{po___RT8(+gd z=a|!2&T^nxFta!g&5&?dA}d4>_NZ@;3S#C-9ynXu-|xymDUm~rPX3NA%#5&i{i!-{ z-tk`*qcrhf>l@TzFXObix>}6s%W7w}+5SoeMPB)A(=RU>9&-ium?br_a7eF6uzz4n z?a4Q6-gX|gJ})0frEWImf3z4^qZ?Y07Qo_1``3tma6p!=3>6)D2yW!B14&nvCr1GXbhOZF(Ks6p7ihhDwN zvx0!$5_Y7JaGU&NbL~2qoe<`N@_UQ9N8(^*1G#2Rq-r7gG6c&NnJ$!Daj7-=*D0DI zdf~>+hKj)8qDv2|+Bdru3yI%`izj;{i-fVo223Y*HIF?KE7?Y+gVizI_M4~4w`wSg zs!qgW?BvX=6a&dtj7YX;;`@~Qf{iuNf1mZwONSnrmfhRlP`4&r+rQEDX0677O~>ei zGJH|KN^CQTN#NIaIVQSn?Nti`C3Im+F=^Vrh`jwRbONK1Bs6y5SCWhEt}=N^os{CA z*{?)Y>-Qf}hTkqSJ0%^Qf9l_@;q6)oLc5}IJ*2H?$#Nzj&@{_LfUUi+wuoXs@4*7v z7CMwrk>y>A>B=q(xc4VaBvCVIeNLkg>v7ieB{1&Fc0%Iw8WJed7(%#M@~j_hDTwxj z=WTY*@brZ(zn=sOLFdW3bt-DCYt_(QXex9y+^o3b^AqyzN;swlpqqr?!lOew6qlD= zkUC$&7kVo%%7YDlzHY7qzvdD63%V6BRd0b|!K`6-P(p~J$qIcq!yK!65MBtL<43u; zi}+E$DGDul6p$vLT|a~_n6Z9*PHbJa`oR+2r3S&#{{FPI#^G2;$on?xs?#utblo*7 zpFh{UiZ{n7VAL`B{1F?x{bGh;(WBADO>*@E-`SqGx>bvU{aRgQr0q1qt7W8Ts5hoO zOuI6zxn9d$H;eV}a7J{$!1mATN~CHPh=bg@_aQJR%vb)%V+9PmBWBp3f7{%SJdzGL zy9xjJ#0pV}_4O*9iLW1;{w2B^%yttA;i5t^b!j4}wHx-Xf9dxt~nF-$c8f6OHAX#?1k)^%xzxS2v-YC98vL3tF^?{YTM&dwubp8&q<%$=7 z=oPO&UiH~6vU$&iHf?68f1VY+Fbi${DWrYP6r|xK{#apl-jyUae+R`!b(2Q`97wrG z`{RJS7_*vvM$Hu`tS#V5QNqE3&g%a|+`^hJkFM=%|M!@O+$ literal 0 HcmV?d00001 diff --git a/lib/presentation/common/assets.dart b/lib/presentation/common/assets.dart new file mode 100644 index 0000000..295cf2d --- /dev/null +++ b/lib/presentation/common/assets.dart @@ -0,0 +1,80 @@ +///This file is automatically generated. DO NOT EDIT, all your changes would be lost. +class Assets { + Assets._(); + + static const String iconsAdd = 'assets/icons/add.svg'; + static const String iconsArrowLeft = 'assets/icons/arrow_left.svg'; + static const String iconsArrowRight = 'assets/icons/arrow_right.svg'; + static const String iconsBgHeaderUserProfile = 'assets/icons/bg_header_user_profile.svg'; + static const String iconsCalendar = 'assets/icons/calendar.svg'; + static const String iconsCalendarSearch = 'assets/icons/calendar_search.svg'; + static const String iconsCall = 'assets/icons/call.svg'; + static const String iconsDiagram = 'assets/icons/diagram.svg'; + static const String iconsDownload = 'assets/icons/download.svg'; + static const String iconsEdit = 'assets/icons/edit.svg'; + static const String iconsExcelDownload = 'assets/icons/excel_download.svg'; + static const String iconsFilter = 'assets/icons/filter.svg'; + static const String iconsGps = 'assets/icons/gps.svg'; + static const String iconsInformation = 'assets/icons/information.svg'; + static const String iconsInspection = 'assets/icons/inspection.svg'; + static const String iconsKey = 'assets/icons/key.svg'; + static const String iconsLiveStock = 'assets/icons/liveStock.svg'; + static const String iconsLogout = 'assets/icons/logout.svg'; + static const String iconsMap = 'assets/icons/map.svg'; + static const String iconsMapMarker = 'assets/icons/map_marker.svg'; + static const String iconsMessageAdd = 'assets/icons/message_add.svg'; + static const String iconsPdfDownload = 'assets/icons/pdf_download.svg'; + static const String iconsPictureFrame = 'assets/icons/picture_frame.svg'; + static const String iconsPlaceHolder = 'assets/icons/place_holder.svg'; + static const String iconsProfileCircle = 'assets/icons/profile_circle.svg'; + static const String iconsProfileUser = 'assets/icons/profile_user.svg'; + static const String iconsReceiptDiscount = 'assets/icons/receipt_discount.svg'; + static const String iconsScan = 'assets/icons/scan.svg'; + static const String iconsScanBarcode = 'assets/icons/scan_barcode.svg'; + static const String iconsSearch = 'assets/icons/search.svg'; + static const String iconsSecurityTime = 'assets/icons/security_time.svg'; + static const String iconsSetting = 'assets/icons/setting.svg'; + static const String iconsTagUser = 'assets/icons/tag_user.svg'; + static const String iconsTrash = 'assets/icons/trash.svg'; + static const String iconsUser = 'assets/icons/user.svg'; + static const String iconsUserSquare = 'assets/icons/user_square.svg'; + static const String imagesInnerSplash = 'assets/images/inner_splash.webp'; + static const String imagesOutterSplash = 'assets/images/outter_splash.webp'; + static const String imagesPlaceHolder = 'assets/images/place_holder.png'; + static const String vecAddSvg = 'assets/vec/add.svg.vec'; + static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec'; + static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec'; + static const String vecBgHeaderUserProfileSvg = 'assets/vec/bg_header_user_profile.svg.vec'; + static const String vecCalendarSearchSvg = 'assets/vec/calendar_search.svg.vec'; + static const String vecCalendarSvg = 'assets/vec/calendar.svg.vec'; + static const String vecCallSvg = 'assets/vec/call.svg.vec'; + static const String vecDiagramSvg = 'assets/vec/diagram.svg.vec'; + static const String vecDownloadSvg = 'assets/vec/download.svg.vec'; + static const String vecEditSvg = 'assets/vec/edit.svg.vec'; + static const String vecExcelDownloadSvg = 'assets/vec/excel_download.svg.vec'; + static const String vecFilterSvg = 'assets/vec/filter.svg.vec'; + static const String vecGpsSvg = 'assets/vec/gps.svg.vec'; + static const String vecInformationSvg = 'assets/vec/information.svg.vec'; + static const String vecInspectionSvg = 'assets/vec/inspection.svg.vec'; + static const String vecKeySvg = 'assets/vec/key.svg.vec'; + static const String vecLiveStockSvg = 'assets/vec/liveStock.svg.vec'; + static const String vecLogoutSvg = 'assets/vec/logout.svg.vec'; + static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec'; + static const String vecMapSvg = 'assets/vec/map.svg.vec'; + static const String vecMessageAddSvg = 'assets/vec/message_add.svg.vec'; + static const String vecPdfDownloadSvg = 'assets/vec/pdf_download.svg.vec'; + static const String vecPictureFrameSvg = 'assets/vec/picture_frame.svg.vec'; + static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec'; + static const String vecProfileUserSvg = 'assets/vec/profile_user.svg.vec'; + static const String vecReceiptDiscountSvg = 'assets/vec/receipt_discount.svg.vec'; + static const String vecScanBarcodeSvg = 'assets/vec/scan_barcode.svg.vec'; + static const String vecScanSvg = 'assets/vec/scan.svg.vec'; + static const String vecSearchSvg = 'assets/vec/search.svg.vec'; + static const String vecSecurityTimeSvg = 'assets/vec/security_time.svg.vec'; + static const String vecSettingSvg = 'assets/vec/setting.svg.vec'; + static const String vecTagUserSvg = 'assets/vec/tag_user.svg.vec'; + static const String vecTrashSvg = 'assets/vec/trash.svg.vec'; + static const String vecUserSquareSvg = 'assets/vec/user_square.svg.vec'; + static const String vecUserSvg = 'assets/vec/user.svg.vec'; + +} diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 815f89f..7604588 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -84,6 +84,9 @@ class $AssetsIconsGen { /// File path: assets/icons/picture_frame.svg SvgGenImage get pictureFrame => const SvgGenImage('assets/icons/picture_frame.svg'); + /// File path: assets/icons/place_holder.svg + SvgGenImage get placeHolder => const SvgGenImage('assets/icons/place_holder.svg'); + /// File path: assets/icons/profile_circle.svg SvgGenImage get profileCircle => const SvgGenImage('assets/icons/profile_circle.svg'); @@ -145,6 +148,7 @@ class $AssetsIconsGen { messageAdd, pdfDownload, pictureFrame, + placeHolder, profileCircle, profileUser, receiptDiscount, @@ -169,8 +173,11 @@ class $AssetsImagesGen { /// File path: assets/images/outter_splash.webp AssetGenImage get outterSplash => const AssetGenImage('assets/images/outter_splash.webp'); + /// File path: assets/images/place_holder.png + AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png'); + /// List of all assets - List get values => [innerSplash, outterSplash]; + List get values => [innerSplash, outterSplash, placeHolder]; } class $AssetsVecGen { diff --git a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart index 6db58bb..67bec05 100644 --- a/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart +++ b/packages/core/lib/presentation/widget/app_bar/r_app_bar.dart @@ -13,6 +13,7 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { final TextStyle? titleTextStyle; final VoidCallback? onBackPressed; final List? additionalActions; + final int? leadingWidth; final Widget? leading; const RAppBar({ @@ -24,8 +25,9 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { this.onBackPressed, this.additionalActions, this.leading, - this.hasBack = false, + this.hasBack = true, this.centerTitle = false, + this.leadingWidth }); @override @@ -41,11 +43,13 @@ class RAppBar extends StatelessWidget implements PreferredSizeWidget { titleTextStyle ?? AppFonts.yekan16.copyWith(color:Colors.white), title: Text(title), + leadingWidth: leadingWidth?.toDouble(), leading:leading!=null ? Padding( padding: const EdgeInsets.only(right: 16), child: leading, ) : null, + titleSpacing: 8, actions: [ if (additionalActions != null) ...additionalActions!, if(hasBack)...{ diff --git a/packages/core/lib/presentation/widget/buttons/fab.dart b/packages/core/lib/presentation/widget/buttons/fab.dart index 200f0ab..3a33df7 100644 --- a/packages/core/lib/presentation/widget/buttons/fab.dart +++ b/packages/core/lib/presentation/widget/buttons/fab.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/utils/color_utils.dart'; + import '../../common/assets.gen.dart'; class RFab extends StatefulWidget { @@ -21,10 +22,7 @@ class RFab extends StatefulWidget { RFab.smallAdd({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenNormal, key: key, ); @@ -32,10 +30,7 @@ class RFab extends StatefulWidget { RFab.add({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 40, height: 40), backgroundColor: AppColor.greenNormal, key: key, ); @@ -46,10 +41,7 @@ class RFab extends StatefulWidget { RFab.smallEdit({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -57,10 +49,7 @@ class RFab extends StatefulWidget { RFab.edit({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.addSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.addSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -71,10 +60,7 @@ class RFab extends StatefulWidget { RFab.smallDelete({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.trashSvg.svg(width: 20, height: 20), backgroundColor: AppColor.redNormal, key: key, ); @@ -82,10 +68,7 @@ class RFab extends StatefulWidget { RFab.delete({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.trashSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.trashSvg.svg(width: 20, height: 20), backgroundColor: AppColor.redNormal, key: key, ); @@ -96,10 +79,7 @@ class RFab extends StatefulWidget { RFab.smallAction({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -107,10 +87,7 @@ class RFab extends StatefulWidget { RFab.action({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -121,10 +98,7 @@ class RFab extends StatefulWidget { RFab.smallFilter({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -132,10 +106,7 @@ class RFab extends StatefulWidget { RFab.filter({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.scanSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.scanSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -146,10 +117,7 @@ class RFab extends StatefulWidget { RFab.smallDownload({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.downloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.downloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -157,10 +125,7 @@ class RFab extends StatefulWidget { RFab.download({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.downloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.downloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -171,10 +136,7 @@ class RFab extends StatefulWidget { RFab.smallExcel({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.excelDownloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenDark, key: key, ); @@ -182,10 +144,7 @@ class RFab extends StatefulWidget { RFab.excel({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.excelDownloadSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.excelDownloadSvg.svg(width: 20, height: 20), backgroundColor: AppColor.greenDark, key: key, ); @@ -196,10 +155,7 @@ class RFab extends StatefulWidget { RFab.smallBack({required VoidCallback? onPressed, Key? key}) : this.small( onPressed: onPressed, - icon: Assets.vec.arrowLeftSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); @@ -207,10 +163,7 @@ class RFab extends StatefulWidget { RFab.back({required VoidCallback? onPressed, Key? key}) : this( onPressed: onPressed, - icon: Assets.vec.arrowLeftSvg.svg( - width: 20, - height: 20, - ), + icon: Assets.vec.arrowLeftSvg.svg(width: 20, height: 20), backgroundColor: AppColor.blueNormal, key: key, ); diff --git a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart index 7afef0e..d4c57a0 100644 --- a/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart +++ b/packages/core/lib/presentation/widget/buttons/outline_elevated_icon.dart @@ -32,10 +32,10 @@ class ROutlinedElevatedIcon extends StatefulWidget { Widget? icon; @override - State createState() => _ROutlinedElevatedStateIcon(); + State createState() => _ROutlinedElevatedIconState(); } -class _ROutlinedElevatedStateIcon extends State { +class _ROutlinedElevatedIconState extends State { @override Widget build(BuildContext context) { return OutlinedButton.icon( diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart new file mode 100644 index 0000000..91826d5 --- /dev/null +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet2.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'draggable_bottom_sheet_controller.dart'; + + +class DraggableBottomSheet2 extends GetView { + final Color? backgroundColor; + + const DraggableBottomSheet2({super.key, this.backgroundColor = Colors.white}); + + @override + Widget build(BuildContext context) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (controller.isVisible.value && !controller.isVisible.value) { + controller.show(); + } + }); + + return ObxValue((data) { + return Stack( + children: [ + // پس‌زمینه تیره + Positioned.fill( + child: GestureDetector( + onTap: () {}, + child: Container(color: Colors.black54), + ), + ), + // محتوای BottomSheet + AnimatedPositioned( + duration: Duration(milliseconds: 300), + curve: Curves.easeOut, + left: 0, + right: 0, + bottom: 0, + child: GestureDetector( + onVerticalDragUpdate: (details) { + controller.updateHeight(details.primaryDelta); + }, + child: Container( + height: 350, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.1), + blurRadius: 10, + ), + ], + ), + child: Column( + children: [ + GestureDetector( + onTap: () {}, + child: Container( + padding: EdgeInsets.all(10), + child: Icon(Icons.drag_handle), + ), + ), + Expanded( + child: controller.items[data.value], + ), + ], + ), + ), + ), + ), + ], + ); + }, controller.currentIndex); + } +} diff --git a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart index 5a1caef..2bf39e1 100644 --- a/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart +++ b/packages/core/lib/presentation/widget/draggable_bottom_sheet/draggable_bottom_sheet_controller.dart @@ -129,7 +129,8 @@ import 'draggable_bottom_sheet.dart'; class DraggableBottomSheetController extends GetxController { final RxBool isVisible = false.obs; final RxDouble currentHeight = 200.0.obs; - + RxList items = [].obs; + RxInt currentIndex = 0.obs; late double initialHeight; late double minHeight; late double maxHeight; @@ -158,9 +159,5 @@ class DraggableBottomSheetController extends GetxController { } } - @override - void onInit() { - super.onInit(); - } } diff --git a/packages/core/lib/presentation/widget/map/custom_marker.dart b/packages/core/lib/presentation/widget/map/custom_marker.dart new file mode 100644 index 0000000..d1e5cae --- /dev/null +++ b/packages/core/lib/presentation/widget/map/custom_marker.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:latlong2/latlong.dart'; + +class CustomMarker { + final LatLng point; + final VoidCallback? onTap; +final int? id; + + CustomMarker({ this.id, required this.point, this.onTap}); +} \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/map/logic.dart b/packages/core/lib/presentation/widget/map/logic.dart index 0824b14..78ab225 100644 --- a/packages/core/lib/presentation/widget/map/logic.dart +++ b/packages/core/lib/presentation/widget/map/logic.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:flutter/animation.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map_animations/flutter_map_animations.dart'; import 'package:geolocator/geolocator.dart'; @@ -8,13 +8,16 @@ import 'package:get/get.dart'; import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/utils/logger_utils.dart'; +import 'custom_marker.dart'; + enum ErrorLocationType { serviceDisabled, permissionDenied, none } class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { Rx currentLocation = LatLng(35.824891, 50.948025).obs; String tileType = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'; - RxList markers = [].obs; + + RxList markers = [].obs; RxList allMarkers = [].obs; Rx mapController = MapController().obs; RxList errorLocationType = RxList(); @@ -61,6 +64,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { @override void onClose() { super.onClose(); + _debounceTimer?.cancel(); animatedMapController.dispose(); mapController.close(); } @@ -113,7 +117,9 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { final latLng = LatLng(position.latitude, position.longitude); currentLocation.value = latLng; - markers.add(latLng); + markers.add( + CustomMarker(id: -1, point: latLng, ), + ); animatedMapController.animateTo( dest: latLng, zoom: 18, @@ -132,7 +138,7 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { 'radius': 1000.0, }); - markers.addAll(filtered); + // markers.addAll(filtered); }); } @@ -148,4 +154,17 @@ class MapWidgetLogic extends GetxController with GetTickerProviderStateMixin { .where((marker) => distance(center, marker) <= radiusInMeters) .toList(); } + + void addMarker(CustomMarker marker) { + markers.add(marker); + } + + void setMarkers(List newMarkers) { + markers.value = newMarkers; + } + + void clearMarkers() { + markers.clear(); + } + } diff --git a/packages/core/lib/presentation/widget/map/view.dart b/packages/core/lib/presentation/widget/map/view.dart index 8fe6cc2..4204919 100644 --- a/packages/core/lib/presentation/widget/map/view.dart +++ b/packages/core/lib/presentation/widget/map/view.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; -import 'package:latlong2/latlong.dart'; import 'package:rasadyar_core/presentation/common/app_color.dart'; import 'package:rasadyar_core/presentation/common/app_fonts.dart'; import 'package:rasadyar_core/presentation/common/assets.gen.dart'; @@ -13,7 +12,16 @@ import 'package:rasadyar_core/presentation/widget/buttons/outline_elevated.dart' import 'logic.dart'; class MapWidget extends GetView { - const MapWidget({super.key}); + final VoidCallback? initOnTap; + final Widget? initMarkerWidget; + final Widget markerWidget; + + const MapWidget({ + this.initOnTap, + this.initMarkerWidget, + required this.markerWidget, + super.key, + }); @override Widget build(BuildContext context) { @@ -48,8 +56,7 @@ class MapWidget extends GetView { onPressed: () async { var res = await Geolocator.openLocationSettings(); if (res) { - var service = - await controller.locationServiceEnabled(); + var service = await controller.locationServiceEnabled(); if (service) { controller.errorLocationType.remove( ErrorLocationType.serviceDisabled, @@ -59,7 +66,6 @@ class MapWidget extends GetView { } }, ), - contentPadding: EdgeInsets.all(8), onWillPop: () async { return controller.errorLocationType.isEmpty; @@ -71,9 +77,7 @@ class MapWidget extends GetView { Future.microtask(() { Get.defaultDialog( title: 'خطا', - content: const Text( - ' دسترسی به سرویس مکان‌یابی غیرفعال است', - ), + content: const Text(' دسترسی به سرویس مکان‌یابی غیرفعال است'), cancel: ROutlinedElevated( text: 'بررسی مجدد', width: 120, @@ -87,9 +91,7 @@ class MapWidget extends GetView { textStyle: AppFonts.yekan16, width: 120, onPressed: () async { - var res = await controller.checkPermission( - request: true, - ); + var res = await controller.checkPermission(request: true); if (res) { controller.errorLocationType.remove( ErrorLocationType.permissionDenied, @@ -110,7 +112,10 @@ class MapWidget extends GetView { } return const SizedBox.shrink(); }, controller.errorLocationType), - _buildMap(), _buildGpsButton(), _buildFilterButton()], + _buildMap(), + _buildGpsButton(), + _buildFilterButton(), + ], ); } @@ -122,16 +127,30 @@ class MapWidget extends GetView { initialCenter: currentLocation.value, initialZoom: 18, onPositionChanged: (camera, hasGesture) { - controller.debouncedUpdateVisibleMarkers(center: camera.center); + if (hasGesture) { + controller.debouncedUpdateVisibleMarkers(center: camera.center); + } + //controller.debouncedUpdateVisibleMarkers(center: camera.center); }, ), children: [ TileLayer(urlTemplate: controller.tileType), - ObxValue((markers) { + ObxValue((markers) { return MarkerLayer( markers: markers - .map((e) => markerWidget(marker: e, onTap: () {})) + .map( + (e) => Marker( + point: e.point, + child: GestureDetector( + onTap: e.id != -1 ? e.onTap : initOnTap, + child: + e.id != -1 + ? markerWidget + : initMarkerWidget ?? SizedBox.shrink(), + ), + ), + ) .toList(), ); }, controller.markers), @@ -171,21 +190,18 @@ class MapWidget extends GetView { ); } - Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { + /*Marker markerWidget({required LatLng marker, required VoidCallback onTap}) { return Marker( point: marker, child: GestureDetector( onTap: onTap, behavior: HitTestBehavior.opaque, child: SizedBox( - width: 36, - height: 36, - child:Assets.vec.mapMarkerSvg.svg( - width: 30, - height: 30, - ) + width: 36, + height: 36, + child: Assets.vec.mapMarkerSvg.svg(width: 30, height: 30), ), ), ); - } + }*/ } diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 546efec..bdcab01 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -6,6 +6,7 @@ export 'buttons/outline_elevated.dart'; export 'buttons/outline_elevated_icon.dart'; export 'buttons/text_button.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet.dart'; +export 'draggable_bottom_sheet/draggable_bottom_sheet2.dart'; export 'draggable_bottom_sheet/draggable_bottom_sheet_controller.dart'; export 'draggable_bottom_sheet/bottom_sheet_manger.dart'; export 'inputs/r_input.dart'; diff --git a/packages/livestock/lib/presentation/page/map/logic.dart b/packages/livestock/lib/presentation/page/map/logic.dart index c54ed07..04370f3 100644 --- a/packages/livestock/lib/presentation/page/map/logic.dart +++ b/packages/livestock/lib/presentation/page/map/logic.dart @@ -2,7 +2,7 @@ import 'package:rasadyar_core/core.dart'; class MapLogic extends GetxController { - + var ss = Get.find(); } diff --git a/packages/livestock/lib/presentation/page/map/view.dart b/packages/livestock/lib/presentation/page/map/view.dart index d05b39f..6935217 100644 --- a/packages/livestock/lib/presentation/page/map/view.dart +++ b/packages/livestock/lib/presentation/page/map/view.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter/material.dart' as mt; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_core/presentation/widget/map/view.dart'; - - import 'logic.dart'; class MapPage extends GetView { @@ -14,9 +11,20 @@ class MapPage extends GetView { return Scaffold( body: Stack( children: [ - MapWidget(), + MapWidget( + markerWidget: Icon(Icons.pin_drop_rounded), + initOnTap: () { + + }, + initMarkerWidget: Assets.vec.mapMarkerSvg.svg( + width: 30, + height: 30, + ), + ), + ], ), ); } -} \ No newline at end of file +} + diff --git a/packages/livestock/lib/presentation/page/request_tagging/logic.dart b/packages/livestock/lib/presentation/page/request_tagging/logic.dart index ee5f9ee..de94cdb 100644 --- a/packages/livestock/lib/presentation/page/request_tagging/logic.dart +++ b/packages/livestock/lib/presentation/page/request_tagging/logic.dart @@ -1,9 +1,10 @@ +import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; class RequestTaggingLogic extends GetxController { - +final TextEditingController phoneController = TextEditingController(); @override void onReady() { super.onReady(); diff --git a/packages/livestock/lib/presentation/page/request_tagging/view.dart b/packages/livestock/lib/presentation/page/request_tagging/view.dart index 67d773a..0ff57ed 100644 --- a/packages/livestock/lib/presentation/page/request_tagging/view.dart +++ b/packages/livestock/lib/presentation/page/request_tagging/view.dart @@ -1,5 +1,7 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:get/get.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_livestock/presentation/routes/app_pages.dart'; import 'logic.dart'; @@ -9,37 +11,98 @@ class RequestTaggingPage extends GetView { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text('Request Tagging'), - centerTitle: true, - actions: [ - IconButton( - icon: const Icon(Icons.search), - onPressed: () { - // Implement search functionality - }, - ), - ], + backgroundColor: Colors.white, + appBar: RAppBar( + title: 'درخواست پلاک کوبی', + leadingWidth: 40, + leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12), ), - body: Column( - children: [ - const SizedBox(height: 16), - - const SizedBox(height: 16), - Expanded( - child: ListView.builder( - itemCount: 10, // Replace with your data length - itemBuilder: (context, index) { - return ListTile( - title: Text('Request Item $index'), - onTap: () { - // Handle item tap - }, - ); - }, + body: Padding( + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + child: Column( + children: [ + RTextField( + controller: controller.phoneController, + label: 'تلفن دامدار', ), - ), - ], + + SizedBox( + width: Get.width, + height: 356, + child: Card( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + Expanded( + child: Container( + width: Get.width, + + decoration: BoxDecoration( + color: AppColor.lightGreyNormal, + borderRadius: BorderRadius.circular(8), + ), + child: Center( + child: Assets.images.placeHolder.image( + height: 150, + width: 200, + ), + ), + ), + ), + SizedBox(height: 15), + Container( + width: Get.width, + height: 40, + clipBehavior: Clip.antiAlias, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: const EdgeInsets.all(10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + ' تصویر گله', + style: AppFonts.yekan14.copyWith( + color: Colors.white, + ), + ), + Icon( + CupertinoIcons.arrow_up_doc, + color: Colors.white, + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + + Spacer(), + + + + RElevated( + text: 'ارسال تصویر گله', + onPressed: () { + Get.toNamed(LiveStockRoutes.tagging); + }, + height: 40, + isFullWidth: true, + backgroundColor: AppColor.greenNormal, + textStyle: AppFonts.yekan16.copyWith(color: Colors.white), + ), + ], + ), ), ); } diff --git a/packages/livestock/lib/presentation/page/requests/view.dart b/packages/livestock/lib/presentation/page/requests/view.dart index 966ea7c..b656387 100644 --- a/packages/livestock/lib/presentation/page/requests/view.dart +++ b/packages/livestock/lib/presentation/page/requests/view.dart @@ -93,7 +93,7 @@ class RequestsPage extends GetView { itemBuilder: (context, index) { return GestureDetector( onTap: () { - Get.toNamed(LiveStockRoutes.requestTagging,id: 0); + Get.toNamed(LiveStockRoutes.requestTagging); }, child: Container( width: Get.width, diff --git a/packages/livestock/lib/presentation/page/root/view.dart b/packages/livestock/lib/presentation/page/root/view.dart index 879add1..f506375 100644 --- a/packages/livestock/lib/presentation/page/root/view.dart +++ b/packages/livestock/lib/presentation/page/root/view.dart @@ -9,6 +9,7 @@ class RootPage extends GetView { @override Widget build(BuildContext context) { return ObxValue((currentIndex) { + return PopScope( canPop: false, onPopInvokedWithResult: (didPop, result) { @@ -16,7 +17,6 @@ class RootPage extends GetView { eLog('Pop invoked with result: $result, didPop: $didPop'); navigatorKey?.currentState?.pop(); - /*eLog('Pop invoked with result: $result, didPop: $didPop'); iLog(Get.currentRoute); iLog(Get.previousRoute); @@ -39,11 +39,11 @@ class RootPage extends GetView { child: Scaffold( body: IndexedStack( - children: controller.pages, + children: [...controller.pages], index: currentIndex.value, sizing: StackFit.expand, ), - + extendBody: true, bottomNavigationBar: BottomNavigation1( items: [ BottomNavigation1Item( diff --git a/packages/livestock/lib/presentation/page/tagging/logic.dart b/packages/livestock/lib/presentation/page/tagging/logic.dart new file mode 100644 index 0000000..f543973 --- /dev/null +++ b/packages/livestock/lib/presentation/page/tagging/logic.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +class TaggingLogic extends GetxController { + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + } +} diff --git a/packages/livestock/lib/presentation/page/tagging/view.dart b/packages/livestock/lib/presentation/page/tagging/view.dart new file mode 100644 index 0000000..6bb7f25 --- /dev/null +++ b/packages/livestock/lib/presentation/page/tagging/view.dart @@ -0,0 +1,239 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; +import 'package:rasadyar_core/presentation/widget/buttons/fab.dart'; + +import 'logic.dart'; + +class TaggingPage extends GetView { + const TaggingPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: RAppBar( + title: 'پلاک کوبی', + leadingWidth: 40, + leading: Assets.vec.messageAddSvg.svg(width: 12, height: 12), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 15), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Container( + height: 40, + decoration: BoxDecoration( + color: AppColor.greenLightHover, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.darkGreyLight), + ), + alignment: Alignment.center, + child: Text('آمار ثبت شده : سبک 5 و سنگین 8 راس'), + ), + ), + SizedBox(width: 4), + IconButton( + onPressed: () {}, + style: IconButton.styleFrom( + backgroundColor: AppColor.blueNormal, + fixedSize: Size(40, 40), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + icon: Assets.vec.editSvg.svg(), + ), + ], + ), + + Expanded( + child: Card( + clipBehavior: Clip.hardEdge, + color: Colors.white, + child: Stack( + fit: StackFit.expand, + children: [ + GridView.builder( + padding: EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, + ), + itemCount: 20, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 12, + mainAxisSpacing: 8, + ), + itemBuilder: (context, index) { + return Container( + decoration: ShapeDecoration( + color: AppColor.lightGreyLightHover, + shape: RoundedRectangleBorder( + side: BorderSide( + width: 1, + color: AppColor.blackLightHover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Assets.vec.editSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.blueNormal, + BlendMode.srcIn, + ), + ), + Assets.vec.trashSvg.svg( + width: 16, + height: 16, + colorFilter: ColorFilter.mode( + AppColor.error, + BlendMode.srcIn, + ), + ), + ], + ), + Text( + 'گوسفند ماده', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + SizedBox(height: 10), + Text( + 'سن : 18 ماه', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith( + color: AppColor.darkGreyNormal, + ), + ), + Text( + 'نوع نژاد', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + Text( + '1212115112512', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.blueNormal, + ), + ), + Text( + 'نوع پلاک', + textAlign: TextAlign.center, + style: AppFonts.yekan14.copyWith( + color: AppColor.bgDark, + ), + ), + ], + ), + ), + ); + }, + ), + + Positioned( + bottom: 10, + right: 3, + child: RFab.add( + onPressed: () { + Get.bottomSheet( + Container( + padding: EdgeInsets.all(20), + color: Colors.white, + height: 300, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 40, + width: Get.width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + border: Border.all( + width: 1, + color: AppColor.darkGreyLight, + ), + ), + child: GestureDetector( + onTap: () { + + }, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'گونه دام', + style: AppFonts.yekan14, + ), + Icon(CupertinoIcons.chevron_up), + ], + ), + ), + ), + /* DropdownMenu( + width: Get.width, + + dropdownMenuEntries: [ + DropdownMenuEntry( + value: 'گوسفند', + label: 'گوسفند', + ), + DropdownMenuEntry( + value: 'بز', + label: 'بز', + ), + DropdownMenuEntry( + value: 'گوساله', + label: 'گوساله', + ), + ], + ),*/ + ], + ), + ), + isScrollControlled: true, + ); + }, + ), + ), + ], + ), + ), + ), + + SizedBox(height: 10), + + RElevated( + text: 'ثبت نهایی و ارسال به اتحادیه', + textStyle: AppFonts.yekan18, + height: 40, + backgroundColor: AppColor.greenNormal, + onPressed: () {}, + isFullWidth: true, + ), + ], + ), + ), + ); + } +} diff --git a/packages/livestock/lib/presentation/routes/app_pages.dart b/packages/livestock/lib/presentation/routes/app_pages.dart index b74d313..1ca33e7 100644 --- a/packages/livestock/lib/presentation/routes/app_pages.dart +++ b/packages/livestock/lib/presentation/routes/app_pages.dart @@ -8,6 +8,8 @@ import 'package:rasadyar_livestock/presentation/page/request_tagging/view.dart'; import 'package:rasadyar_livestock/presentation/page/requests/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/logic.dart'; import 'package:rasadyar_livestock/presentation/page/root/view.dart'; +import 'package:rasadyar_livestock/presentation/page/tagging/logic.dart'; +import 'package:rasadyar_livestock/presentation/page/tagging/view.dart'; part 'app_routes.dart'; @@ -26,18 +28,35 @@ sealed class LiveStockPages { Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => ProfileLogic()); Get.lazyPut(() => MapWidgetLogic()); + Get.lazyPut(() => DraggableBottomSheetController()); }), children: [ - GetPage( + /*GetPage( name: LiveStockRoutes.requestTagging, page: () => RequestTaggingPage(), middlewares: [AuthMiddleware()], binding: BindingsBuilder(() { Get.lazyPut(() => RequestTaggingLogic()); }), - ), - ] + ),*/ + ], ), + GetPage( + name: LiveStockRoutes.requestTagging, + page: () => RequestTaggingPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => RequestTaggingLogic()); + }), + ), + GetPage( + name: LiveStockRoutes.tagging, + page: () => TaggingPage(), + middlewares: [AuthMiddleware()], + binding: BindingsBuilder(() { + Get.lazyPut(() => TaggingLogic()); + }), + ), ]; } diff --git a/packages/livestock/lib/presentation/routes/app_routes.dart b/packages/livestock/lib/presentation/routes/app_routes.dart index 616d5ee..95a777a 100644 --- a/packages/livestock/lib/presentation/routes/app_routes.dart +++ b/packages/livestock/lib/presentation/routes/app_routes.dart @@ -6,5 +6,8 @@ sealed class LiveStockRoutes { static const init = '/liveStock'; static const requests = '/requests'; static const profile = '/profile'; - static const requestTagging = '$init/tagging'; + + //static const requestTagging = '$init/tagging'; + static const requestTagging = '$requests/tagging'; + static const tagging = '/tagging'; }