From df6d54a007066ce593b3beeda2ee0f38b682d820 Mon Sep 17 00:00:00 2001 From: ElPoyo Date: Wed, 29 Oct 2025 18:43:24 +0100 Subject: [PATCH] =?UTF-8?q?Refactor:=20Centralisation=20des=20labels=20et?= =?UTF-8?q?=20ic=C3=B4nes=20pour=20les=20enums?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Centralise la gestion des libellés, couleurs et icônes pour `EquipmentStatus`, `EquipmentCategory`, et `ContainerType` en utilisant des extensions Dart. - Ajout de nouvelles icônes SVG pour `flight-case`, `truss` et `tape`. - Refactorisation des vues pour utiliser les nouvelles extensions, supprimant ainsi la logique d'affichage dupliquée. - Mise à jour des `ChoiceChip` et des listes de filtres pour afficher les icônes à côté des labels. --- em2rp/assets/icons/flight-case.png | Bin 8075 -> 0 bytes em2rp/assets/icons/flight-case.svg | 35 ++++ em2rp/assets/icons/tape.svg | 32 ++++ em2rp/assets/icons/truss.svg | 26 +++ em2rp/assets/logos/SquareLogoBlack.png | Bin 0 -> 43896 bytes em2rp/assets/logos/SquareLogoWhite.png | Bin 0 -> 41419 bytes em2rp/lib/models/container_model.dart | 115 ++++++++++++ em2rp/lib/models/equipment_model.dart | 167 ++++++++++++++++++ em2rp/lib/views/container_detail_page.dart | 2 +- em2rp/lib/views/container_form_page.dart | 2 +- .../lib/views/container_management_page.dart | 72 +++----- em2rp/lib/views/equipment_detail_page.dart | 77 +------- em2rp/lib/views/equipment_form_page.dart | 47 +---- .../lib/views/equipment_management_page.dart | 115 +++--------- .../containers/container_header_card.dart | 54 +----- em2rp/pubspec.yaml | 4 +- 16 files changed, 441 insertions(+), 307 deletions(-) delete mode 100644 em2rp/assets/icons/flight-case.png create mode 100644 em2rp/assets/icons/flight-case.svg create mode 100644 em2rp/assets/icons/tape.svg create mode 100644 em2rp/assets/icons/truss.svg create mode 100644 em2rp/assets/logos/SquareLogoBlack.png create mode 100644 em2rp/assets/logos/SquareLogoWhite.png diff --git a/em2rp/assets/icons/flight-case.png b/em2rp/assets/icons/flight-case.png deleted file mode 100644 index c90651d27730a0f821d59bd79260b9a374fca334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8075 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 U&`hGejlf3s?e_de=+3zC-;W@;Gynhq diff --git a/em2rp/assets/icons/flight-case.svg b/em2rp/assets/icons/flight-case.svg new file mode 100644 index 0000000..f25fde0 --- /dev/null +++ b/em2rp/assets/icons/flight-case.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + diff --git a/em2rp/assets/icons/tape.svg b/em2rp/assets/icons/tape.svg new file mode 100644 index 0000000..46a4d38 --- /dev/null +++ b/em2rp/assets/icons/tape.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/em2rp/assets/icons/truss.svg b/em2rp/assets/icons/truss.svg new file mode 100644 index 0000000..41d0048 --- /dev/null +++ b/em2rp/assets/icons/truss.svg @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/em2rp/assets/logos/SquareLogoBlack.png b/em2rp/assets/logos/SquareLogoBlack.png new file mode 100644 index 0000000000000000000000000000000000000000..869b506b58afd1b282e5454e6287d58aaacb94b7 GIT binary patch literal 43896 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 K$_xva!~X|OGw?Y8 literal 0 HcmV?d00001 diff --git a/em2rp/assets/logos/SquareLogoWhite.png b/em2rp/assets/logos/SquareLogoWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f991732f2f1d2769e75755ec7045294b20bee5 GIT binary patch literal 41419 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Νq466AS9!wjZ>_OtB?S7)i;qYlg&At(w;yel(@ypI6-^%(VlDXwu#2lNjI(w22QvX5$<$+j#4fbSd=(8rycI!RNHMn6Myg1-hnx*Y{ zW}Qjo!0i0JZMS)m7eaeRPqC0#3Or9n!w*Vc2}E32mwI@EFI&m0@DkNyc9miBVwkT! zkgw?Zb|2~rtKPQu3xk}a$k~S34gxF15++Mn zyjD{N`2yefY?^nqdYCijtC9U8N8peW%5MOYD2&VUe5X_-1P7Lb%g|O12_+?%dCE(4 zTEA5IDLyaC<+RkLGT zcoel7Nsdwo+Ir(Ww`myM(x?T-Q=%|`L}&?R*=%XZRAs7{-~a`%acL&v(cR4rX%hwX zR1ixJSL)F|V4oJ*eD>6a6(Iw!`0I3$s+jD6w0!zmDJHvmdj}IyK_>8~(+&UjjBhL##nS~I?M!jdAQRU}M0g||o;my4oxK@s{@MA6!^RfIR$`!;r+8Wo@C;jVeTA$1wvogbe=Gn`&~>_XLf7;Y0K^IUiHPc#lvw~hdz z@1DJLX(;psByMJt5*V>|_%lbWeMBC~OZT?CE=N=>tsE<^V#U~Jz`RxCm<$p4Kx1UW z%-b>AJg@b{^lRURYt%08$1GD%A4e|3`^@|CbseKJBCzn?2=^oLxlv4dxrJW;;kl2Z zTk?52-j=fQ)*eHNGZ@S}?BQmPxN~^MciIc;E1S|XDO+pvna2&y6E`LJh+@$L_8ik{o7Y@0q1iNNw_8lH4(a34cJ$&cf`?{mv)-;90d)#N7KL zb{PYvzTRAr#;TAfbTF1*W;v}Phd?Ch4FMrz886KZqWHmzc8lTUqYGGbz!0=TXCM}OR zHSoh(o{FQ}!l-xN*xr*Pn#l84abi-tyM4Hyp7ElDz(b;AR`gC?hM*kt1MB5cM#*N; z1N}qvN$D`x374#a9P6lbz4KSUWeoF3b=lhWmXjrQL00OU=nM9>WoyAGB-T8oG#mUQpmh5#KkFjGrm&|&ck8FfBYy&g!uQ_+cCsQbf*`x2P(xI1=!!*3) zO@!CENeVy2i+ollu;$TaIpPTfXFGq@?oa)$` z7^}kafj^L*aUx|xA1-`s_p7^w+)_~Jg!ZT{iH5)Ut4yzvCA^knt)s?i5;K#lxF@QnhJEuA8+9RQ>m7ce2^L2zwB$1 zoxHdWiyGB=rngAQOC0YNImQQptp5}=tMTm0wJq(#Qbn5xzG!+O)nz=O+Ne^6+We*(e zgNLS5@k#))@@&7xLJ%&6uJa%lm2_Zw0j9FwUaM4jeHw1CWPi1R;rpi&Fx9`FjI*@d z#$YNYWh5Rqq*;^^pQXoB&&n*o>V>zrTINTYz!+v`>ask1>{EJ0s5&QWlrwkzl<6!& znZzNMR0_Bwo0hGC5jHU9-uVkfEQKooZ8`ihBbNOsPQQYh6YGM`xw&S1=GcHrF)>X# zyLw!>IJ0FqKmCDG_@1|hzo*v_I*igE*Fez0#%?*mlcF=s+ZT4U(5H+%*~orZ@v2ki zUt*AFM4xkfMGes5&`?RPES0vxIRKJ>8L``SUBJ=9s(*+;t-a&Zv0TgU;d?>M_J}Nh zZVwUu<&)Q9;noL)NI4>4!9E3P0q&`00c43{URt4St)#jt8|&1y(^sF;X}f7BD*?|# zgOj&P+WZlM_PuvIJ~dd+?qY9dGQpWQaB~m$tCptWN}o7A7MQ&nSYDz~3C&7GR-|N} z1wLnzkIobBf4WzEPN6jt>S#+-=&EkE9lOd>f|yJ0byvBVVJ%v3yC$gUI<-*6$b$RT z=}k~uX%x|Q-|s(OUhHa00=x0nq7;Y(>v-SYWhsji!|RU(C*52mALkxoUPx@g)&%^N zV*hG|)8kSQo!EW8duQyqIEQx1?03QLBk+Ww*VO^fMz{bNf1!VDmz>e|7B*ZV1mGh) zGmbc&$S2(2j5b4o^_r2Nu9BUbg8IN4^17NUn4|T#S(Nr}x$VSUlY}Ncv=$ucG=n6Y z@R$av(v?OvSm!4yLN%}w0QhOPlXWECc$~!mJAJ?fV&G<_9r6mvt1%T{$!|;LMHTWf@vEY^vl7^>idi?XG$W*LAL)iIK^NN)CSb z%g^2XDpzFO%udt8XwsUgI;ax%xPf&I095V(*V5+s`J+ zxOI1k&(Cqu%IM$j$7QCf`-n?L@15dkN@;0SZ(;uM0io;^k>;Zgbn8@90n;v29htuj zZC)TehxWOdQkAZz2`IJaJAqNGo*%C#`WI*4=8K1>h>sYI>vjGU# z3EhKGSAyZZ^!mH;aVa@tTYT2IYB{?H<~fa2D$gH1J;R}xdOB_P!s4c1e<0J+DUzZs zc7aLnH1zFZnq^p;8_>8#8|%8hB+Wm2<)F>B&e!%u!uVO2!qc#NgL?slV*8$1ezzQB z!qr?DAl~xi9+4{^{`^Yz0^)D?51DzUWaXxp(6#~7ZB*(bfx!2g@_xm_7mFu$0T?HM z5F->WfSQyFg8jOH&nXXNq2|G`R2d7C?7Fp#Sl5L{DAjn&QI0|j=z96h!-zsumYjNY zc@!2(uTwtHfoFa!F{Qy~QVTML7C zQ0ZM&x%`(#q@qqiB_TR$lx$rrGCZ649(73JO zOxJpe^XvtQ#Z>ihs_zY<&Gc;o72|$NBdg7^8!`b$T@;7Aww`ZX49^)`T=fte75F`Q zuLNI53QyyuuzSml`>o^DC0MK5{rfnwmob*m9U-swhI!anyY%M@Sx;nH<^Gt>VOo0o z@oXH8_gtT?|DEZGOTSYaL=M`F6Z>T%kRON9Q-M5oNi9dVyJ0a=@Z*XGD&c zJX4?*QoG4#7+cb^z`gyRzY7mGjW(k zF7Ly-1YZ&2^ogYV#C{2h^IRICFeGEj#nv8wwO^J?ugobf`@psB{K6@8Qvg}@%vzS~ z-L?>_7n|rGPDBBmN`mug1fDw^RDNaDuNfSazlPmo1ciHf8rM5bdFK@d?T>FMTJUu_ z(+>mmftKE7RZpfCr>|L`+ieB*Ggv|&Hzl3t3i!6L@TWOL8!EETJ*-dIb&a%7mig|# zjP@M5tFhI9X&Jwj;3aiox;jEUZ|lk~e`ju{%yvH~{^izZu7AxiIqzevVeS_v`qAC8 z8ipCD1dkrd6G9KK%a1>@Bq!sTVp*S}jv4&e@duKGjlP^<|K1+HVu^Ea1EVhggx=3u z`eua-$|QZiQt%%~_&MLhBw)qy$oKTK1Hub|q92Funevj*46Yijd3b14Ai{X3P4J4k622XXu!r>NR@E&Juj-dnV`oOs40HYT;WM=GMO}$JfO}&F11r;( z>(t9pSB^hdWV?Sh76~H{I)ik}1<83}zKq4;!lx>Mh^y56x(-cC8NttVhm-MA^K^Gf zEVFXyd=oF(ilGmw$5(RRJn^CaLRjB_P}~iLJHD+b*Kp~+y*-vSlI=;yZ3a6Hs`nAr z@7ZrkVkI70BITwY(IgDU=jUpb^VtoUTbJ}f?iXx|3D%vkjAI_*<5ydIl*4&R+20$m z1kOEIVY{Ew99J0hAF#^x=!|%N8}e*dnFD*XPT8xq&h(=es{H$mOM!lyh2lg0Vk3q_ zfc&$yxTgvW=sQ`OySq34t{m~$Y6CL^=Cu@tW@?CR^Q@}<^U2^lUVe9&cOJT|Ph?rL zU01Dn=ZM>^!PCZi7bP|+g{Dg@NDMh0H8T=@dW?(n?5aTSzX$b*5xl0PnD}0kzoA60 z6X&#lDZuwV_vEIXLZM4b2b0MDn+=(Kl-Z>Ar&734pBH*)2|O_B;GsEN#xr|3a_zl6 zw~bzhMK8~u?qyQxPEC;`^2#xbYfD4~;sX%AiHX0Zs2JV^xt%qx6x7!-$aAM!ks+QM zmpz=!IqEJaxvJ8r`86GyQ<|{+#4t!ij z|A-ff6sVkml5d7$y7 z*HZFA8jh#QZ-~tF02zTz@Fp+s(lmH^czH&kT+o!;-yl7@O}{EWG&8$r&SDyd6cZj1 z2ot#4*`Hyw^#%Idd{>CL?yFD{$=RxCM3h7W8{ky{D3$?|v$mF$Nn1sO>0bH5=f!rb1JX{7mJ%8!-ksmS&_ z^90x5_asV21hkut3dO+UXw=K+*>`k%)OZ-kN&EDC756h;qrdLZ1uf=?f+=4=deRDg zYPXqt?u-Ao(_}N|h=+a(wgb_jm`Pb?}Nd%5}nFHePqI{Q}G(yO@nAQ`BTkF z8SuFa^84OOe68?j*3TGbW!&w6-lk}dD)M)_=oLL0A|y(5o?zO0i^ocvqQua?^&gBb zkc!T5IKBU~VQ;70Wo9$ldwtfwznA{Bf0a)1u4uU{534o7i{aJQDGqx5x&EAXjKj{P z;2zcd#dVeMDiS;!e5-kxBYs+Z-AYd+LIk#|PoBAPr6`md^~PqvWkytx@*Zmc4aWNE z<(`&Xp$E4!`1%{0_DTT`sE?aN_OmK40eIdLOnnO*5bqs2bpz&Jui3O+RcX}&2TKR~ zyt2l13Gs|w7}uY|$9n4AfmYoyTZ!YhUV6f;H%W%!i6pCXtbY8Kl0)@2t(JrK(YVAo zUXnR>$<7I_^Pw5+DsWmmxWPvwkN-&sHJG5;mVE(|%X&-5|;XG)jFx2RjmptoTk~Q#H z$G`1zdy(<#@=eZ0tjbGg>1Mt^Od@w(li9~hYD>GiIElVr8EC+;fTWEDeBH0U$eg{d z!epP9)u+ovId1(7JI-X8yM5OuPM=&D}2rB9_hP z#2(>73Icn~L{b(-_mth+BEBkxgUIXjtpT2*J8krctCUfZ9X=GnbtzXrEcZ&{z9~v6 z3Wxn5m)yL&$f*oBBKfedlS6q)7H~Y|0Y>B`{I5}AUhuM3v8Qb+!vG{Z6!tRBy*a|P z) z%c>-O;?g|Yn!yI$>C2;J`$rJi_|NDrs&@^9)$SjcTXu;> z$5f@OH}~o18ddV@8t$bzN4~tCZg0FmFx4R(%-i{``46KpRkj1okmuhlUYuxTxEZwO z%;wkq+r)C88JMbsac!$ArcOy_2E5qIJ089E=$dJ(`&nW#3@b{3u|BKz*439*WHzVY zoFnvXTahPj!iD*jpSN#Jz~ZE%~G(A#A!p7!%U*Z?b*mFCjP1r)Ch(i%C9e}%lMjW zpX#UeE?n2P>A9PyTJbaHg4T>pOsJy2>`!D;ZTdba9Femp6F8ji)QUO9m0kXzRQ`m^(UBfA zLqEVVyW*vD}o{ZrdV!Xvv>yVW&wZP!T{0YLWW zb+WE;h&x3aD_FMjkw8Gd=He->6h8ZPm!}ql_NcLSPYT(ZA7dzFMC_-r?2nfsoQezs zGJKt0zs`{p56={2-^-skT|u5tTvH!P))ip2xagt4)%& z@xI))m@~eLjsPX(SL(9WeR8Yw>O{@2@3cwv-FvYmenxzb{3}^aub5b-+gJM0m^Y1gJFkN-{CjtUxPR1lq8Nh(q+N-LY~pI68Tsb-e{`9Q zy`=7#_!Gh^G2dNg&9mlJfCUE%z~QsH)hD;@_%GGWuop&)#rik)21n^mGzRs|wo7PD@S@kL1a* zTU-^-%%8j%ySk4|S*&bZXPxIRy^Qeq&ONXF{DctNK~{E2g2o?Ak_0*UFLOB-;vct^ zi4p{*KcpqhiOhq&!!C~u4+!X}2<1I09TX{=dMV>J+!FU!)&`6-CFt{xm6zv!sFn8c z&OQHr^R2>elEkd9)y|51_a3>p&033(7vClbFbqFPsGn%N9kD6R&WwLJoU4SVgmFf~ ztfuOn&EmGZ=Y|YxMoigkIc%*L-`U|spdORsq*p9%NIP`i;a-J=grlU;%bnn0+8R@w zkwKHxqmtg}-|?lXmUu)AWwh9ZU?B1?jI9zKzz6eDE946Mvo%7JJJ@<`5&) z1;7(lD^+qQb1(JRj;$^o%{iF0I5R)l?siD?_xg$(@}$|FUPs*Rf3sHj=UJCkznv-A z>*TBX-Io7JX`XcVfL{AMh*e&x;XHlo!>F#?f5Qp8g>4cGd3r=K3FKw;4_jGH={#VZ z$Ax@_CgS_K8tpe}?pCUoRg#R`eXc|sy$nHDQ0Px;U-ZcI37^2aJL|jmPoH+% zueI|VV>c>+au z#(bk+)_R}49cnwg!g&mW&;B;3@D38gBZf`5|G7B*1NgV3{^9X|#TNL_RW}=g1fT_c z-dzSQ%!mjQWJJX{Xs^oftGXB4Q}?}^fZ~pYAvuX1dS!(p_?{BY+j-t`-O#%IyeuDP zzffnoL|}6NNa2V!*NJb&oc+bHl^+~(S;r4AaVX0GR6V8X7ARHCj-&;{HUl)+E8Rw)^Bd(dyM<)GT37P_T0q=GNKfQ0gr1ec5GDv5UjG+!Nx$B}6u z>=q8FdDGf-$BX0lxDQ;TLKr4INN%WHP=~U?>PD-AY9u=k!WKIK_Mp;>2ukMGhYKqq zldbhO*ZHF#y78eN20Qj`&jDb83La*wE@ zV(za@Xx(EJQ64`S@#>2E8vf-N`l@Gg@u*V*$RZz?K)*rv;AB_0PwUO zw#%RUsTwTRfJoS>0uqp$+fnq9aNi=>cQfq92IMkC&j|!1{k6QrZH(mZ^wu-e=(6A$ zWP>RM=n508)Oc!~{pg%Ocl;CpJtzmAj;}CLEIqrzx0y17bX3tvc6H$%QI>ctas0Fm z{3rp{b&@?0lwtE*?}!-um8S~A8xZc2$Z8YBFhOZe6=FG0@1k10A~MjF;gvxUKz-iq zaAoas77&7thU?rD zR8Q$f%T?`1@}gawM75fgC}rE-T!HQcsk%WS=%aZC=-41@4oDnFH&j5(P1L(W)ysI?njYO+?k*-8MiPsYn^pkvmR_ zQ&Fla^iY_!MC>>O+nxdGFp}N-lWX`f9VQPvTkY{xw+&Fyz$qCd(^CxTj?k?etn;`G0)%@KE=s^Pc)RDAa@lN!p7pkP7~i_H zlSQy+>Y;9Xgn9HFhU$*TEza3RSedc`kce7jNchIwQ>Wt*@P^)6e&I&=qC^+H!2Nnp z3xcUH&~3r|6IQC6CFs6y1WLutxz4%UU4heLArP?eFjU88SDB|?e=*d@L;4VLFo|&KI95nCzrC#! zeUrW?=fxn}NT38IAt;qd&dEG|9wkp&KTnn$z}YyT?=6H>En$z^LjD#wd1?oev`8vk zVK=;(>s$;`Pe6CG01vXklpd?!R^>-!iE|sW@6axwrM=Oj>PEM4XVHKMi|Ts4d>MaJ?%Cwh{Ir)6V`jD{~K8V>T z0fh^RDA~r4`{}01_vP@j_vFoJ9JWQlaesWj@kFkC{7-lb0!jqkng$iRaGTKT3x+H2 zG(+7eKvT(nQ28OV-$65+h?JR(Q#gtUGE(#UC}d+m1ulZ%3$EUeFKVc%WA^7G2*foA zUt?$oZaXx>qhIkj+G$k}goB)G2!O(a1R{mm^BEcfQT}KsElTw#WJriO5;1rk3N?`Y zG}l2l0j(8@@;w@R*9HUBvSws0xRWS}Ptv3&rHhuv_S%Hab8a zL&NNIbzdN8+zUYW=ab#h)+A&awhke+rv&4~k~P9(7$2iU@K82DP66=VtHwS};P=g9 z1tu#H=0mvCZ74>D-RFqebz5|$yB1w)23okRs8vosNGUny(JNdKt2;1O9efD-SLmYr z>3kB>%R zH#FR@K)L%_uMFKLHK@sT-i;&)WO1SS3Id;+40(3qN@lY24~v_)DR0zSkS&UL9UV_d%Q=}V-2^->M}T0 z2<={qCA1C{A?R2LuYyMW6t4W7YOWw=NpxyTOvtc4|7v!gXuCO>c`YB3L&a zC0lVrjUqcz1hO;SO*FoyZ=0-hZuDPY12sI#yVqhCGp+(1mc(0lx6gaqi*nw zmvau`2Ujpb-l*+<>`|z;paTnRjRG8)10q?%K`^78sm4YL!Wdq_as3bDRY891m8xz* zT1B5@wv1sFKO=o`@1N3%Yb?n3IyS)AW2wmL(lw(MZq1okzU7{{?N*m*|5C~jpOXm4P zuy>IGAylN1$ty8K3ZM@{x9->h0VZpamXPis<9_Irsp=8D*an=kPe*qoETL5>az=OP zla&>?A*;y(9|`srJKQ8YW$&?&LHtO&=vNM)sCs>5?W<^N%k(n+a)YbG7r5HHBd~P4 z8Y+kilAYGb=T&Eea#TG3Zo0shV@CAKOb^g{qX8RbDDEF`wa1)Z;LYr#w!}+}yLPDIs_RlRrcB#!`?_Mp4I(B*w4mD~utw9-+G`AmS2I1Y)!+4yro%F?;MW3O?v| z|K}V9;d@vX%P`MIpc*0f=cy7_maqKd1~aL%L5QL{aV2cyjQP&6xkwwI4FYK6iMy$bGTTMriNKMhI`Ox51@8I z+clKtsN1jy6PkuCB$*R-p}(2FVKS*NM=`qE0pDat2w+Xzz?H;Mjk0V zG|}u#75AYe40s@e&*I&0a!(Z-qE*b;Jpsx4=u;;cc4)&Hc*g^3ydxg3=zw-8;jh$$ z2Ny8A7{l-)9ruG!?eE_VR>R4Mu+u>!z*9dQ`aZjo_h34Aqv!$9Vqh3lNR8Q5_ME_~ z-f#k=ZikhC7z7WAaw2U@=3B?RdH9k(`uNKbKKVTslKuNo9r!yx zO*aFvuL9(-8dhZl>+HBm=!VRX%Efjl;ttvluyG|=ha5TaP3t|pFbX&Nc}!6%G}?{W z3~fO?x{nbdKZHW9FlM@sPi68`yqtkGBbRUwc_V;4f`^B$!UHm-A=i1#2PF~!`6qq& z$ZJ^8ACyWdE87zbAn=qCVmxW3WZ*7q@6K4&L`t&tNInAO$HbQA(3#Y|KpUM*?$~X zhuMWzD7pO0(Zp#W@7{V;C5LbX(z|qk3f@i_}@L+J(@Q&lO$r5`xG1*q&OX69`Or>&_JM9QsKPb@Ohev2f)VaC_Ca76 zPDf%LcJd8&=S+XQhpYlfrGsdcVy`}JTf3+-dJ+9z3A&nbtO@>C(dp5M#my)sZR2^J z-5D?*x>@J?Gn@$=axnAHtRD3n?khYIA3D~@?yZW>K)`p0(CyMHI{fI!TI5Wd6w0V9 zM9VSJdNpuy>fFU^R3ANf&#vO_A(u}Yvrh#m@FTj6JH*wFN1WO^TzLy4mQU}d(%Q{^ zFdU|M;%4m7%yxX(1LMC!b((CPO|Z~9^f7HT@!wg8h^RvJ8%Y3M#TF0L!C*im*042y zgw9G4>{~%A%-xWLat@&z(PR#+J>Vie?J#&a3Ga0c9QCr87iabzkH~^bdq5TX(lE0^?@Hvpi@l&d9GQ0s6@k-arKM=cBQO1|OV)?!L~Vd(xgl^-Ggd$z^raGeR`sS->kJ!b-l@v7`jMg>O$WZCfsqbETCCF4B* z6POY9P683tQr!(_ZCSHb2#CU*fOf zzy337VE;>cdL|w%6Jc~N{=coN{VyT@Z$tGTz=8kU)#1O7#~q8Uh4=2|Hf{=iJ$SGr zPnonfCKMR5{tBbn*Q+ykaSHCKS7#B?(Pa&iRI~?cot=8lzB4+a_Ge_HN0O6BSMZ~69a1lA_$Pxi9wQfu^i4867;T{=^moD#d0tHqcjetGeRr=R2B63pcM2OOp@i7sY2a8X6LCi%O8yP|5s4cRkRU=vkG{a68kFE*z#}=wyBUoq+m#2`J$x4l7J{qn);B>&*!~{mbhi`R-*cFWIG$tdWkxUQ%vYv zvBCbrsQpB|2uv~$ZmNb|!SR0&^!>_Ta6ef&zeIoiiNtP+>L*`}uJ(|Bf0bP6d~{(- z2E_i&l5^^qtl0#aI>uQ^^S27=6Laf#|F{GzJLx-QNcjT3UyOlG)H-X;kG%XjwfOfW zZKKEpX^m%F7I5f@rxm&>LGBiI4lXg0?6o<`U&DB$Hq4yvX+ufLtefvhx|q~mu^TMZ zjf_+}MK)KwG-Z6!a(_|jOSSJ_kFD}+j~ZSi4C%R5p7>r*o8o6|0dmyi3h5v#(<`^W z>&r)q2(Q-eqP?fnOj(h?eT9SkW72~|dkTAE(@o?Ro&J+eeDcZA|o#7j!0&hVyFuN4qG1_%#UT@QE+hjFXQfT{f z+^4(Z!6oaj=x6uPlRf5hbTMCTg}KwTg~tAokLfMa3<<>K_6=X2c=w)z$vB(PtldTs zEL`g9Y8+GS3|~Hb^%mBl^p>T2YcYx8UCUh{id~M9w`a&k{W$H7Rx+p@>5Yz($~(`q zakKWu6Z$-%*Dkt~P0=fu7ax?b&e9h|+@IEXv2UahT)NoBz;WyXp{^vMRVhP7I4Rm| zcllCZ8!1ge-^hA_BC7#kG*^`Gz*!gwjuf5M^|pVb@8w%J zRAQlq*fF2vbP2*Z93}e0RFZaoIJ-DxX@Ax$yXB5A}=X}F!?->Vq5O_nviA+>%zDuj_GtM{86V%Kz4=(4*fLyNaO|!|GX;Bdlaz`D>z zw>p89FHjl^J)b<);V&@aTWrnE*s0}m;{L_V@aeE6*LBXAGy^X*(#6O`PFli$al%Jy-os4>^y5l7!c6Kn`o0YQ&~9!Ind*8~$_ysH z1g@ZST=76sWDOe;JUhealYj6+v{~ELS(GBfkY;M9YnfQIDi2ALA^BgTkqO~RzMt5W zae)IaMsb8zCEUu2JsGF=(8z9RF^nRQw#oxjcXA`b2mk?#9rGhQsuAzsGjJzeuj}fK z_7!F$Ut^qX=}PZ~U4S`TJM7n~;-we1*oLZd0*39(PTC*}%sEG(Ui{XvCNr7{+ra9$RJ-!yr6bnNgSaNzPMG8lz8H`KMX@ESi+Nc*a5sQ@!K>i^un9cYPqoai5}|1 zd4;V4{pO%mu{-GRgz0av2kOehGf#K;&GUy*Qk>v>~$f z+mrlXs5pQY`Y*3Q^y1Gs{;L}ZD5x=r{`~XDfB5ik>O=YJJ$;N`fPWLjKcD^obsLgD zIm(pyXMOY+r&D7I-aJ^nvg{ywSe zyFDZAgfmCqzUKhO?&N*HnFVJ5PNJFo-KGA|AL;!0pTUQYTherYBU{`{UtU$~vqhxj z@}o`~_nNmYc(HcGGJG!QH!hJ|8ow+%q92yFgO$)G`$8$?gvB0;n(@fM<$!S9*oWy( z?RLC$K&$TCmc`l2oc8lPOR5KdiH%;$K+^>1g^GXv_+QHhZ--zkBtR3L+FE^MS8@KX z$gbczaGw7ARq$O4M|9WKXipjDz%SpH5;*_EyptbZ&XwTrv*{YdEbCb zJpGrw5T{bRD{`IaB}4Sr|1PZlPguC)!FL(9LPj(RyXWC=TU=dIw*NcrDtfAi7zc}{ zUM}T-@0WVFW0e`f0sFIG|D8AfpK+G`fAK-)6nwqT2^=|p{+PGZHD43fWKLH8^kC9@ z=6jqW5{i0cDs4Tp8b4uIhYYhW>lMzq=3&1%&)rQYrGB^;l=>$=G`-j*?rs=~JEnfA=av7}kcEKNoblMb1|0tMA}#rXRQi8e%~@ z624KqXME60#ggmEN@miw(tP+oT|$p)SvH?Xq`g9Qyi^h_qx%fO|D_@a!BQPxs(C!+_D-35X?D4HctIbH!PmK_?3Es|-T7t+d5dLC^||p1-pZyzOR0jxphtw<4mXeD&L;rf+t?nP$%BW?*g}^2w5Ot(lIEw1$DljqVB` zmTXSOrlfq!f2{CaU}Va}NGjX!^}Z^HUBqqAS9&-~vr>8(UKH)Eu;9+$ zsM|r*ML(|q+DnzZN8d`!c7~mn?j}~JN!fm01=<6m`l20oubAtu#$hKiZn<~?7je2JI^zj?Kfljg|CY>>oW@2t|_e5pu( zL2tmtB{BE&M*33Dm-=Q79;o8GYVgzRQxc%f zi3Q4xY-a6^L`Fo2>UDhi@( zE~q0SQ2|F7;YKhn>=-uKmvqCNR&ZQ7!nW^#unTJAM0}KIimzPIsR^{Sfm3g#G+iHS_rv7?2T#=|j|| zY)iYeOgM4TpUhX{hB(zow!p*9X|a%YYt2}t^^whFOHJosu zM`BJ`k%ag}Nc`$Fl_jzejd&q!@Z!$GfTKNMRjs})CtgnKOEBVuC-0oJj1wNhRUIdO zje9l7a6|1iZpes;)`XI}3c?5&P;pP|H`*qzK zZN?>4;oiZ`f-I{1*79(Sx{k?B)o~sRv6|PG`eUXex)qF-J;ssW>OwQa)%lyt*JOr= z_%>SZbn-%5b>P(iZX(%Ux$yn$umG6eWG)^9&^CsgaM+>D7>4Phg2IW^ZX#Tp{#;c* z=XM_{7;sLxu+d%tc=5cIKhm7f?2Ca4ri&D;Y&?e~GvkT!Gb5tEn1M75uI?JwD6>}J zE(HdB-$8@V#4&^mrqzE%181Dy3!abo4`^V(RVMW%79s%N{zds8H$EHh@ z9tJqumTlRvtvu_s!m}cbAE2@qwu&HGo`OJnybx-aL1)g)wUPGGJEb`0Yrwlt0&I8( z^WH&&EV|hhM@&%ulNV_w%sAHdU~~D|xTyjsZ0bR$D{GR8&5a+R?TCW5Bgp3j8BI}U zPobE6p|lVtog5CYCZRQ^+Db@7ZjKNC!1rZ6FC*F{T4fbT65%Xz)NdmKiSX zP)RlxYAj83PTbqtaPBjb$TV`O1NFFm8i8SD=aY%U1P^ zZmrrpX+(Pb1$rgJExvVmMOX}2^k&X4PEl0 zgSs^9=nPJhKFW(Bx!!s^xGYpU`@nEni73l;PaN*|K+q_WR(iXu zPH#cLmz+5mUcg8qw4|?xY#FEG*K)$ezlZrw7_CgKg-lLNftGg+3|xq7E%NPFCH+7g za+|r>U4{tpdtZ^bwW?WIXrPZq=%A zjxlDMYv=j7gh;oDpmx=lU_q(tASdq4H#mX{P@WPU3kos%a^UIV%%n05+<;Sv-8hNG z@t8@t*JEh?7eQqW6P2*^?uWjFsiPtSgCimw;RaXh_p%gCY?r0SMXSI9?INnc({l)W z%Djo6yo(2npM(E~J1H>z>0Lmmm*tTfF#D@>Fh3`l2#Oblj3x07Ru(+u-g=Jq{7Ej; z3Mi@tZr`la>CG2zO1Mv&EM_C>*=x$z#N5PV=B;ojgdH&6yaL;9zSi5#Frd}6;`?a|^dOE!NY$ zg<}CUhrM7z2=B_-(n%!o+NOubxfu)G91HswPXJ-3u}kPs#8vH1gZh6vZYmfE!gh^i z)$FJk#72V=&`jYNBzx$Xbl-MVJgaST3;saxn0k80raM9FEyq5(Qmc%4_=y%s!m(1k zRgF2QEbel(6@2JdJ1RapR0+Pi-4-eBQ~M9H6oXuv1v(Y}5t{tPb7?OOz+7a)EanfM zfb^}xwveYYR1gFft;#P-k$bl}0=B zbn-NifoTKHx1B!HJZjthgQJ28^G5poJMhF7^4Nx5jD_#E{tVE zKjN<81nN;v@=A#!f~xBLp@{)ABDQq)H!YRtZok;+O1JHYmRY<#>`@th+)e5U0%WD(E&o#?k zr~7p}%Nd=-fSYmxS{}l@CkDJPF|=FS=HHsy-LLgF-5(9|UVf4y-3A6J^_aLw6I5fK zQLjS^ka}tkznKZ@`SJN^s}@`ZJJp|cw`jK&9Ap(V_ms%7W?_EOe}i<|-cs%MhShYI zV7L>T!C`oPIM!Uj#?S&)I7a~aO06JXby{#zs{!-Pt_+O?=IPk3mD}hx+*iPBE+pdU z@ImeMQ^#?&oTk8RIOs~ed_s%QyxMz2lk zjC_;7t!JtK9*}|OWWmUVjBPz%2<53#+%{M`dznopFn@8W`0t2IirJ%&R1?OsUPEiyiZ6_RxlYDZ|gpaixeJ>YU`R7-zTwR|nkeM{He z{q9oK*`$dnk`p8mA?I1cfO5r5V+BC=Gz8+tb0a_9P$yx}2%b3Lt;$UoxE>V3v)&~8 zv|$yzg^)$SLb5*_{r4Jd2)K_|a0IEQ-^H7ALSdQ>@|CMe+Xj4vt#VWt=9k{DB|GcN zGJl&$mtqcZCj~H1XTtZoM}Fr>5s^hZ$xQ-!lC(C6c<_Fgf%Ja6@SC%2;|6!jylCkG zv662QUVr#mL9*C&(x>xXL$8OzyyFRSgZHsOMy8Gdt=(YlXUF&mOA`7SdncJgf2;G% zENq71aXFPu3x)zkb_udare$u~1F!0tcS&d|5F7U0RkFxA-*ga*7p5z5E4&o-nL8sx z_GXCZzU&@fH=(N;R%1Xvcw9C$RNZNqWsCa~XxOqE>2?6WxhR+*8ShyGBZ47%a>Rg? z>k#gr9>yBpFXK=_*Qw&D{+EXjk@~4WcMTIf6Cdq*+Tz*Bni<)0lJ~ZB%02k!iX9an zz5Vc_ME$+1)zah>qJXF>yz+>IqQ1!0w60oj=+N&+4?#}FCL7ME*=>v-9U-HcZNm_I8B+8w^#)mTi;N^bp zQq<)~hxAG7Sp3he813y%cXr7f>MU>eB^ADTt|S|YL~Yq+?A;?i!sAIYMm2tCKk#aQ zg||?Dju}WwJtfDzYba=|2tlay185ke2AHxr8%TJ00U=R0BQ+zo~{+ z!S{wSB7xkvi$C=&&F_=rW3&a74J;MnCzP)zj|Ar;U;J7&m}k5@mzWSBT4CQ(R=2#x zoDh1alpO)dvXm!J*n2p|Q5&Zn?<0f`e9Skeq}fQ2m_m#l>R`o&vm40q1(wY(I{v5~ zUP4upYC>l_-$5LhM5Z3fjrEJlx*jXE5;3*<3guUk`J3`3_H|`-TQ6E*Uelg)u66t| z@}%*z9)#cG>a;ckCIAWIcIXfZoPX9H@)61ppul{d@sT)FL|g5Tc|Q%bG%r2IARo!z zi`tVfx0tXdw-5=nOFmGNEeXBG6P_|CjygXVh-8IMrJw1pxTQi7C8qtAAErhn!Pt0H-jT3kAaCd~l8r%%6{)K5lZ=i(>OyF8 z`V$B-+&RmFJq(P9chYl^gSre|O*)8~iTx~#DMl(}`hudM9Shmg`q@I* zU*!ce@DrZdDb!!50dE|c3cRYJdo%+p6MajHIa|~PL*%77P!HE}58}}cEtj%+5;h*Rxde3DK@g@ey3OOC4IE1aCUgVYq2j(W3|bxlBx~JCOgaCHbbpQ+&v6WG{vO`VxgEkZ~!8G0V&q& zL!vY}nxJuQ5^740ilq|9IkUtJF`{T5rh3zI$j!@>RF&=6*rCJkK9f%BqyA506Y+uu2N8byvffyT(BZr67S92kw3Z z#&~cB0MV>5ax11Jfuwhe?KaO=R!#|WvDUp`KOWSM&VFBib$$CUb@#xz{=74OH*{Wh zx$3qZaJ5!Tu#Gu%Z`i5fx?STm-MFYT za=Ty7vhxmJY5*E!@#SB+-Tx?72-pO2z*OS6j=5Vwkt718gSXK-GH{1(o3Z;ukg`t- zBEe#}N+_)>ukqQAfR?8JK_dKTx8*Ay>04T0b&q!EzGE!_7>5nV2fn49R-Nlxg{d05 z{gKmBVJ9cZ8LNc$2rA;4#LIaf7(WWjUkThQmUp@9wmte9s#w3&jjTQ1?0Ggabml@h zyTBLV<8%HOg-76G&!4V?BUQN}j=iN(`wZXYy%N1mKPHlMz@9RFH}qpipNlRNta#^x z=Het2meRAtQ7`%beM>7?kB3Z1k^e#eY^0eJOi1W6c@$cFZtR7>{Q4iJAuaiLRui8^ z^JAUK6#lgR4}l4oWNo9eOa zM7&qZMm-YxqtNA0VsYEUZfXD!JUXCQ-0Oyd3x(bP6PM(l`YdCwfJ*#mm}%VP)HAUc zy^0U%wz-SeflYWiMeuk^>X~Mn883ggNIhe)fzj5f>XE8;#HHgL@f}S1Do^M|^;Kw_ zC#oW_ffuh2kLfg&G)q49v3 literal 0 HcmV?d00001 diff --git a/em2rp/lib/models/container_model.dart b/em2rp/lib/models/container_model.dart index b414d2b..177dac8 100644 --- a/em2rp/lib/models/container_model.dart +++ b/em2rp/lib/models/container_model.dart @@ -1,4 +1,6 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:em2rp/models/equipment_model.dart'; /// Type de container @@ -57,6 +59,119 @@ String containerTypeLabel(ContainerType type) { } } +// Extensions pour centraliser les informations d'affichage +extension ContainerTypeExtension on ContainerType { + /// Retourne le label français du type de container + String get label { + switch (this) { + case ContainerType.flightCase: + return 'Flight Case'; + case ContainerType.pelicase: + return 'Pelicase'; + case ContainerType.bag: + return 'Sac'; + case ContainerType.openCrate: + return 'Caisse Ouverte'; + case ContainerType.toolbox: + return 'Boîte à Outils'; + } + } + + /// Retourne l'icône Material du type de container + IconData get iconData { + switch (this) { + case ContainerType.flightCase: + return Icons.work; + case ContainerType.pelicase: + return Icons.inventory_2; + case ContainerType.bag: + return Icons.shopping_bag; + case ContainerType.openCrate: + return Icons.inventory; + case ContainerType.toolbox: + return Icons.build_circle; + } + } + + /// Retourne le chemin de l'icône personnalisée (si disponible) + String? get customIconPath { + switch (this) { + case ContainerType.flightCase: + return 'assets/icons/flight-case.svg'; + default: + return null; + } + } + + /// Vérifie si une icône personnalisée est disponible + bool get hasCustomIcon => customIconPath != null; + + /// Retourne l'icône Widget à afficher (unifié pour Material et personnalisé) + Widget getIcon({double size = 24, Color? color}) { + final customPath = customIconPath; + if (customPath != null) { + // Détection automatique du format (SVG ou PNG) + final isSvg = customPath.toLowerCase().endsWith('.svg'); + + if (isSvg) { + // SVG : on peut appliquer la couleur sans dégrader la qualité + return SvgPicture.asset( + customPath, + width: size, + height: size, + colorFilter: color != null + ? ColorFilter.mode(color, BlendMode.srcIn) + : null, + placeholderBuilder: (context) => Icon(iconData, size: size, color: color), + ); + } else { + // PNG : on n'applique PAS le color filter pour préserver la qualité + return Image.asset( + customPath, + width: size, + height: size, + filterQuality: FilterQuality.high, + errorBuilder: (context, error, stackTrace) { + return Icon(iconData, size: size, color: color); + }, + ); + } + } + return Icon(iconData, size: size, color: color); + } + + /// Version pour CircleAvatar et contextes similaires + Widget getIconForAvatar({double size = 24, Color? color}) { + final customPath = customIconPath; + if (customPath != null) { + final isSvg = customPath.toLowerCase().endsWith('.svg'); + + if (isSvg) { + return SvgPicture.asset( + customPath, + width: size, + height: size, + colorFilter: color != null + ? ColorFilter.mode(color, BlendMode.srcIn) + : null, + placeholderBuilder: (context) => Icon(iconData, size: size, color: color), + ); + } else { + return Image.asset( + customPath, + width: size, + height: size, + filterQuality: FilterQuality.high, + errorBuilder: (context, error, stackTrace) { + return Icon(iconData, size: size, color: color); + }, + ); + } + } + return Icon(iconData, size: size, color: color); + } +} + /// Modèle de container/boîte pour le matériel class ContainerModel { final String id; // Identifiant unique (généré comme pour équipement) diff --git a/em2rp/lib/models/equipment_model.dart b/em2rp/lib/models/equipment_model.dart index 4d0d91f..88e977a 100644 --- a/em2rp/lib/models/equipment_model.dart +++ b/em2rp/lib/models/equipment_model.dart @@ -1,4 +1,6 @@ import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; enum EquipmentStatus { available, // Disponible @@ -99,6 +101,171 @@ EquipmentCategory equipmentCategoryFromString(String? category) { } } +// Extensions pour centraliser les informations d'affichage +extension EquipmentCategoryExtension on EquipmentCategory { + /// Retourne le label français de la catégorie + String get label { + switch (this) { + case EquipmentCategory.lighting: + return 'Lumière'; + case EquipmentCategory.sound: + return 'Son'; + case EquipmentCategory.video: + return 'Vidéo'; + case EquipmentCategory.effect: + return 'Effets'; + case EquipmentCategory.structure: + return 'Structure'; + case EquipmentCategory.consumable: + return 'Consommable'; + case EquipmentCategory.cable: + return 'Câble'; + case EquipmentCategory.other: + return 'Autre'; + } + } + + /// Retourne l'icône Material de la catégorie + IconData get iconData { + switch (this) { + case EquipmentCategory.lighting: + return Icons.light_mode; + case EquipmentCategory.sound: + return Icons.volume_up; + case EquipmentCategory.video: + return Icons.videocam; + case EquipmentCategory.effect: + return Icons.auto_awesome; + case EquipmentCategory.structure: + return Icons.construction; + case EquipmentCategory.consumable: + return Icons.inventory_2; + case EquipmentCategory.cable: + return Icons.cable; + case EquipmentCategory.other: + return Icons.more_horiz; + } + } + + /// Retourne le chemin de l'icône personnalisée (si disponible) + String? get customIconPath { + switch (this) { + case EquipmentCategory.structure: + return 'assets/icons/truss.svg'; + case EquipmentCategory.consumable: + return 'assets/icons/tape.svg'; + default: + return null; + } + } + + /// Vérifie si une icône personnalisée est disponible + bool get hasCustomIcon => customIconPath != null; + + /// Retourne l'icône Widget à afficher (unifié pour Material et personnalisé) + Widget getIcon({double size = 24, Color? color}) { + final customPath = customIconPath; + if (customPath != null) { + // Détection automatique du format (SVG ou PNG) + final isSvg = customPath.toLowerCase().endsWith('.svg'); + + if (isSvg) { + // SVG : on peut appliquer la couleur sans dégrader la qualité + return SvgPicture.asset( + customPath, + width: size, + height: size, + colorFilter: color != null + ? ColorFilter.mode(color, BlendMode.srcIn) + : null, + placeholderBuilder: (context) => Icon(iconData, size: size, color: color), + ); + } else { + // PNG : on n'applique PAS le color filter pour préserver la qualité + return Image.asset( + customPath, + width: size, + height: size, + filterQuality: FilterQuality.high, + errorBuilder: (context, error, stackTrace) { + return Icon(iconData, size: size, color: color); + }, + ); + } + } + return Icon(iconData, size: size, color: color); + } + + /// Version pour CircleAvatar et contextes similaires (sans ColorFilter si Material Icon) + Widget getIconForAvatar({double size = 24, Color? color}) { + final customPath = customIconPath; + if (customPath != null) { + final isSvg = customPath.toLowerCase().endsWith('.svg'); + + if (isSvg) { + return SvgPicture.asset( + customPath, + width: size, + height: size, + colorFilter: color != null + ? ColorFilter.mode(color, BlendMode.srcIn) + : null, + placeholderBuilder: (context) => Icon(iconData, size: size, color: color), + ); + } else { + return Image.asset( + customPath, + width: size, + height: size, + filterQuality: FilterQuality.high, + errorBuilder: (context, error, stackTrace) { + return Icon(iconData, size: size, color: color); + }, + ); + } + } + return Icon(iconData, size: size, color: color); + } +} + +extension EquipmentStatusExtension on EquipmentStatus { + /// Retourne le label français du statut + String get label { + switch (this) { + case EquipmentStatus.available: + return 'Disponible'; + case EquipmentStatus.inUse: + return 'En prestation'; + case EquipmentStatus.rented: + return 'Loué'; + case EquipmentStatus.lost: + return 'Perdu'; + case EquipmentStatus.outOfService: + return 'HS'; + case EquipmentStatus.maintenance: + return 'Maintenance'; + } + } + + /// Retourne la couleur associée au statut + Color get color { + switch (this) { + case EquipmentStatus.available: + return Colors.green; + case EquipmentStatus.inUse: + return Colors.blue; + case EquipmentStatus.rented: + return Colors.orange; + case EquipmentStatus.lost: + return Colors.red; + case EquipmentStatus.outOfService: + return Colors.red.shade900; + case EquipmentStatus.maintenance: + return Colors.amber; + } + } +} + class EquipmentModel { final String id; // Identifiant unique (clé) final String name; // Nom de l'équipement diff --git a/em2rp/lib/views/container_detail_page.dart b/em2rp/lib/views/container_detail_page.dart index 4a36937..8a89950 100644 --- a/em2rp/lib/views/container_detail_page.dart +++ b/em2rp/lib/views/container_detail_page.dart @@ -167,7 +167,7 @@ class _ContainerDetailPageState extends State { Expanded( child: _buildInfoItem( 'Type', - containerTypeLabel(_container.type), + _container.type.label, Icons.category, ), ), diff --git a/em2rp/lib/views/container_form_page.dart b/em2rp/lib/views/container_form_page.dart index 0804556..7b46ad7 100644 --- a/em2rp/lib/views/container_form_page.dart +++ b/em2rp/lib/views/container_form_page.dart @@ -177,7 +177,7 @@ class _ContainerFormPageState extends State { items: ContainerType.values.map((type) { return DropdownMenuItem( value: type, - child: Text(containerTypeLabel(type)), + child: Text(type.label), ); }).toList(), onChanged: (value) { diff --git a/em2rp/lib/views/container_management_page.dart b/em2rp/lib/views/container_management_page.dart index 0ab6cf2..1eda72f 100644 --- a/em2rp/lib/views/container_management_page.dart +++ b/em2rp/lib/views/container_management_page.dart @@ -190,7 +190,7 @@ class _ContainerManagementPageState extends State ...ContainerType.values.map((type) { return Padding( padding: const EdgeInsets.only(right: 8), - child: _buildTypeChip(type, containerTypeLabel(type)), + child: _buildTypeChip(type, type.label), ); }), ], @@ -201,8 +201,19 @@ class _ContainerManagementPageState extends State Widget _buildTypeChip(ContainerType? type, String label) { final isSelected = _selectedType == type; + final color = isSelected ? Colors.white : AppColors.noir; + return ChoiceChip( - label: Text(label), + label: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (type != null) ...[ + type.getIcon(size: 16, color: color), + const SizedBox(width: 8), + ], + Text(label), + ], + ), selected: isSelected, onSelected: (selected) { setState(() { @@ -212,7 +223,7 @@ class _ContainerManagementPageState extends State }, selectedColor: AppColors.rouge, labelStyle: TextStyle( - color: isSelected ? Colors.white : AppColors.noir, + color: color, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, ), ); @@ -244,7 +255,7 @@ class _ContainerManagementPageState extends State const SizedBox(height: 8), _buildFilterOption(null, 'Tous les types'), ...ContainerType.values.map((type) { - return _buildFilterOption(type, containerTypeLabel(type)); + return _buildFilterOption(type, type.label); }), const Divider(height: 32), @@ -403,8 +414,7 @@ class _ContainerManagementPageState extends State ), // Icône du type de container - Icon( - _getTypeIcon(container.type), + container.type.getIcon( size: 40, color: AppColors.rouge, ), @@ -434,7 +444,7 @@ class _ContainerManagementPageState extends State Row( children: [ _buildInfoChip( - containerTypeLabel(container.type), + container.type.label, Icons.category, ), const SizedBox(width: 8), @@ -534,42 +544,17 @@ class _ContainerManagementPageState extends State } Widget _buildStatusBadge(EquipmentStatus status) { - Color color; - String label; - - switch (status) { - case EquipmentStatus.available: - color = Colors.green; - label = 'Disponible'; - break; - case EquipmentStatus.inUse: - color = Colors.orange; - label = 'En prestation'; - break; - case EquipmentStatus.maintenance: - color = Colors.blue; - label = 'Maintenance'; - break; - case EquipmentStatus.outOfService: - color = Colors.red; - label = 'Hors service'; - break; - default: - color = Colors.grey; - label = 'Autre'; - } - return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( - color: color.withOpacity(0.1), + color: status.color.withOpacity(0.1), borderRadius: BorderRadius.circular(16), - border: Border.all(color: color), + border: Border.all(color: status.color), ), child: Text( - label, + status.label, style: TextStyle( - color: color, + color: status.color, fontWeight: FontWeight.bold, fontSize: 12, ), @@ -577,21 +562,6 @@ class _ContainerManagementPageState extends State ); } - IconData _getTypeIcon(ContainerType type) { - switch (type) { - case ContainerType.flightCase: - return Icons.work; - case ContainerType.pelicase: - return Icons.work_outline; - case ContainerType.bag: - return Icons.shopping_bag; - case ContainerType.openCrate: - return Icons.inventory_2; - case ContainerType.toolbox: - return Icons.handyman; - } - } - void _handleMenuAction(String action, ContainerModel container) { switch (action) { diff --git a/em2rp/lib/views/equipment_detail_page.dart b/em2rp/lib/views/equipment_detail_page.dart index e625a36..69e4410 100644 --- a/em2rp/lib/views/equipment_detail_page.dart +++ b/em2rp/lib/views/equipment_detail_page.dart @@ -7,7 +7,6 @@ import 'package:em2rp/providers/local_user_provider.dart'; import 'package:em2rp/services/equipment_service.dart'; import 'package:em2rp/services/qr_code_service.dart'; import 'package:em2rp/utils/colors.dart'; -import 'package:em2rp/utils/permission_gate.dart'; import 'package:em2rp/views/widgets/nav/custom_app_bar.dart'; import 'package:em2rp/views/equipment_form_page.dart'; import 'package:em2rp/views/widgets/equipment/equipment_parent_containers.dart'; @@ -144,10 +143,9 @@ class _EquipmentDetailPageState extends State { CircleAvatar( backgroundColor: Colors.white, radius: 30, - child: Icon( - _getCategoryIcon(widget.equipment.category), - color: AppColors.rouge, + child: widget.equipment.category.getIcon( size: 32, + color: AppColors.rouge, ), ), const SizedBox(width: 16), @@ -187,7 +185,7 @@ class _EquipmentDetailPageState extends State { } Widget _buildStatusBadge() { - final statusInfo = _getStatusInfo(widget.equipment.status); + final status = widget.equipment.status; return Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), decoration: BoxDecoration( @@ -201,17 +199,17 @@ class _EquipmentDetailPageState extends State { width: 8, height: 8, decoration: BoxDecoration( - color: statusInfo.$2, + color: status.color, shape: BoxShape.circle, ), ), const SizedBox(width: 8), Text( - statusInfo.$1, + status.label, style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, - color: statusInfo.$2, + color: status.color, ), ), ], @@ -240,14 +238,14 @@ class _EquipmentDetailPageState extends State { ], ), const Divider(height: 24), - _buildInfoRow('Catégorie', _getCategoryName(widget.equipment.category)), + _buildInfoRow('Catégorie', widget.equipment.category.label), if (widget.equipment.brand != null && widget.equipment.brand!.isNotEmpty) _buildInfoRow('Marque', widget.equipment.brand!), if (widget.equipment.model != null && widget.equipment.model!.isNotEmpty) _buildInfoRow('Modèle', widget.equipment.model!), if (widget.equipment.category != EquipmentCategory.consumable && widget.equipment.category != EquipmentCategory.cable) - _buildInfoRow('Statut', _getStatusInfo(widget.equipment.status).$1), + _buildInfoRow('Statut', widget.equipment.status.label), ], ), ), @@ -808,65 +806,6 @@ class _EquipmentDetailPageState extends State { ); } - IconData _getCategoryIcon(EquipmentCategory category) { - switch (category) { - case EquipmentCategory.lighting: - return Icons.light_mode; - case EquipmentCategory.sound: - return Icons.volume_up; - case EquipmentCategory.video: - return Icons.videocam; - case EquipmentCategory.effect: - return Icons.auto_awesome; - case EquipmentCategory.structure: - return Icons.construction; - case EquipmentCategory.consumable: - return Icons.inventory_2; - case EquipmentCategory.cable: - return Icons.cable; - case EquipmentCategory.other: - return Icons.more_horiz; - } - } - - String _getCategoryName(EquipmentCategory category) { - switch (category) { - case EquipmentCategory.lighting: - return 'Lumière'; - case EquipmentCategory.sound: - return 'Son'; - case EquipmentCategory.video: - return 'Vidéo'; - case EquipmentCategory.effect: - return 'Effets'; - case EquipmentCategory.structure: - return 'Structure'; - case EquipmentCategory.consumable: - return 'Consommable'; - case EquipmentCategory.cable: - return 'Câble'; - case EquipmentCategory.other: - return 'Autre'; - } - } - - (String, Color) _getStatusInfo(EquipmentStatus status) { - switch (status) { - case EquipmentStatus.available: - return ('Disponible', Colors.green); - case EquipmentStatus.inUse: - return ('En prestation', Colors.blue); - case EquipmentStatus.rented: - return ('Loué', Colors.orange); - case EquipmentStatus.lost: - return ('Perdu', Colors.red); - case EquipmentStatus.outOfService: - return ('HS', Colors.red[900]!); - case EquipmentStatus.maintenance: - return ('Maintenance', Colors.amber); - } - } - (String, IconData) _getMaintenanceTypeInfo(MaintenanceType type) { switch (type) { case MaintenanceType.preventive: diff --git a/em2rp/lib/views/equipment_form_page.dart b/em2rp/lib/views/equipment_form_page.dart index 3a1d53a..3adf584 100644 --- a/em2rp/lib/views/equipment_form_page.dart +++ b/em2rp/lib/views/equipment_form_page.dart @@ -275,7 +275,7 @@ class _EquipmentFormPageState extends State { items: EquipmentCategory.values.map((category) { return DropdownMenuItem( value: category, - child: Text(_getCategoryLabel(category)), + child: Text(category.label), ); }).toList(), onChanged: (value) { @@ -301,7 +301,7 @@ class _EquipmentFormPageState extends State { items: EquipmentStatus.values.map((status) { return DropdownMenuItem( value: status, - child: Text(_getStatusLabel(status)), + child: Text(status.label), ); }).toList(), onChanged: (value) { @@ -654,47 +654,4 @@ class _EquipmentFormPageState extends State { if (mounted) setState(() => _isLoading = false); } } - - // Correction des enums dans _getCategoryLabel - String _getCategoryLabel(EquipmentCategory category) { - switch (category) { - case EquipmentCategory.lighting: - return 'Lumière'; - case EquipmentCategory.sound: - return 'Son'; - case EquipmentCategory.video: - return 'Vidéo'; - case EquipmentCategory.effect: - return 'Effet'; - case EquipmentCategory.structure: - return 'Structure'; - case EquipmentCategory.consumable: - return 'Consommable'; - case EquipmentCategory.cable: - return 'Câble'; - case EquipmentCategory.other: - default: - return 'Autre'; - } - } - - // Correction des enums dans _getStatusLabel - String _getStatusLabel(EquipmentStatus status) { - switch (status) { - case EquipmentStatus.available: - return 'Disponible'; - case EquipmentStatus.inUse: - return 'En prestation'; - case EquipmentStatus.rented: - return 'Loué'; - case EquipmentStatus.lost: - return 'Perdu'; - case EquipmentStatus.outOfService: - return 'HS'; - case EquipmentStatus.maintenance: - return 'Maintenance'; - default: - return 'Autre'; - } - } } diff --git a/em2rp/lib/views/equipment_management_page.dart b/em2rp/lib/views/equipment_management_page.dart index 72f25ed..0888af5 100644 --- a/em2rp/lib/views/equipment_management_page.dart +++ b/em2rp/lib/views/equipment_management_page.dart @@ -293,7 +293,6 @@ class _EquipmentManagementPageState extends State }, ), ), - const Divider(), // Filtres par catégorie Padding( padding: @@ -353,44 +352,34 @@ class _EquipmentManagementPageState extends State } List _buildCategoryChips() { - final categories = [ - (EquipmentCategory.lighting, Icons.light_mode, 'Lumière'), - (EquipmentCategory.sound, Icons.volume_up, 'Son'), - (EquipmentCategory.video, Icons.videocam, 'Vidéo'), - (EquipmentCategory.effect, Icons.auto_awesome, 'Effets'), - (EquipmentCategory.structure, Icons.construction, 'Structure'), - (EquipmentCategory.consumable, Icons.inventory_2, 'Consommable'), - (EquipmentCategory.cable, Icons.cable, 'Câble'), - (EquipmentCategory.other, Icons.more_horiz, 'Autre'), - ]; + return EquipmentCategory.values.map((category) { + final isSelected = _selectedCategory == category; + final color = isSelected ? Colors.white : AppColors.rouge; - return categories.map((cat) { - final isSelected = _selectedCategory == cat.$1; return Padding( padding: const EdgeInsets.symmetric(horizontal: 4.0), child: ChoiceChip( label: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon( - cat.$2, + category.getIcon( size: 16, - color: isSelected ? Colors.white : AppColors.rouge, + color: color, ), const SizedBox(width: 8), - Text(cat.$3), + Text(category.label), ], ), selected: isSelected, onSelected: (selected) { if (selected) { - setState(() => _selectedCategory = cat.$1); - context.read().setSelectedCategory(cat.$1); + setState(() => _selectedCategory = category); + context.read().setSelectedCategory(category); } }, selectedColor: AppColors.rouge, labelStyle: TextStyle( - color: isSelected ? Colors.white : AppColors.rouge, + color: color, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, ), ), @@ -399,26 +388,17 @@ class _EquipmentManagementPageState extends State } List _buildCategoryListTiles() { - final categories = [ - (EquipmentCategory.lighting, Icons.light_mode, 'Lumière'), - (EquipmentCategory.sound, Icons.volume_up, 'Son'), - (EquipmentCategory.video, Icons.videocam, 'Vidéo'), - (EquipmentCategory.effect, Icons.auto_awesome, 'Effets'), - (EquipmentCategory.structure, Icons.construction, 'Structure'), - (EquipmentCategory.consumable, Icons.inventory_2, 'Consommable'), - (EquipmentCategory.cable, Icons.cable, 'Câble'), - (EquipmentCategory.other, Icons.more_horiz, 'Autre'), - ]; + return EquipmentCategory.values.map((category) { + final isSelected = _selectedCategory == category; + final color = isSelected ? AppColors.rouge : Colors.grey[600]!; - return categories.map((cat) { - final isSelected = _selectedCategory == cat.$1; return ListTile( - leading: Icon( - cat.$2, - color: isSelected ? AppColors.rouge : Colors.grey[600], + leading: category.getIcon( + size: 24, + color: color, ), title: Text( - cat.$3, + category.label, style: TextStyle( color: isSelected ? AppColors.rouge : Colors.black87, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, @@ -427,8 +407,8 @@ class _EquipmentManagementPageState extends State selected: isSelected, selectedTileColor: AppColors.rouge.withOpacity(0.1), onTap: () { - setState(() => _selectedCategory = cat.$1); - context.read().setSelectedCategory(cat.$1); + setState(() => _selectedCategory = category); + context.read().setSelectedCategory(category); }, ); }).toList(); @@ -506,10 +486,10 @@ class _EquipmentManagementPageState extends State ) : CircleAvatar( backgroundColor: - _getStatusColor(equipment.status).withOpacity(0.2), - child: Icon( - _getCategoryIcon(equipment.category), - color: _getStatusColor(equipment.status), + equipment.status.color.withOpacity(0.2), + child: equipment.category.getIcon( + size: 20, + color: Colors.black, ), ), title: Row( @@ -659,67 +639,24 @@ class _EquipmentManagementPageState extends State } Widget _buildStatusBadge(EquipmentStatus status) { - final statusInfo = _getStatusInfo(status); return Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: statusInfo.$2.withOpacity(0.2), + color: status.color.withOpacity(0.2), borderRadius: BorderRadius.circular(12), - border: Border.all(color: statusInfo.$2), + border: Border.all(color: status.color), ), child: Text( - statusInfo.$1, + status.label, style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, - color: statusInfo.$2, + color: status.color, ), ), ); } - (String, Color) _getStatusInfo(EquipmentStatus status) { - switch (status) { - case EquipmentStatus.available: - return ('Disponible', Colors.green); - case EquipmentStatus.inUse: - return ('En prestation', Colors.blue); - case EquipmentStatus.rented: - return ('Loué', Colors.orange); - case EquipmentStatus.lost: - return ('Perdu', Colors.red); - case EquipmentStatus.outOfService: - return ('HS', Colors.red[900]!); - case EquipmentStatus.maintenance: - return ('Maintenance', Colors.amber); - } - } - - Color _getStatusColor(EquipmentStatus status) { - return _getStatusInfo(status).$2; - } - - IconData _getCategoryIcon(EquipmentCategory category) { - switch (category) { - case EquipmentCategory.lighting: - return Icons.light_mode; - case EquipmentCategory.sound: - return Icons.volume_up; - case EquipmentCategory.video: - return Icons.videocam; - case EquipmentCategory.effect: - return Icons.auto_awesome; - case EquipmentCategory.structure: - return Icons.construction; - case EquipmentCategory.consumable: - return Icons.inventory_2; - case EquipmentCategory.cable: - return Icons.cable; - case EquipmentCategory.other: - return Icons.more_horiz; - } - } - // Actions void _createNewEquipment() { Navigator.push( diff --git a/em2rp/lib/views/widgets/containers/container_header_card.dart b/em2rp/lib/views/widgets/containers/container_header_card.dart index b46e89b..92d1d9e 100644 --- a/em2rp/lib/views/widgets/containers/container_header_card.dart +++ b/em2rp/lib/views/widgets/containers/container_header_card.dart @@ -25,8 +25,7 @@ class ContainerHeaderCard extends StatelessWidget { children: [ Row( children: [ - Icon( - _getTypeIcon(container.type), + container.type.getIcon( size: 60, color: AppColors.rouge, ), @@ -62,7 +61,7 @@ class ContainerHeaderCard extends StatelessWidget { child: _buildInfoItem( context, 'Type', - containerTypeLabel(container.type), + container.type.label, Icons.category, ), ), @@ -70,9 +69,9 @@ class ContainerHeaderCard extends StatelessWidget { child: _buildInfoItem( context, 'Statut', - _getStatusLabel(container.status), + container.status.label, Icons.info, - statusColor: _getStatusColor(container.status), + statusColor: container.status.color, ), ), ], @@ -148,50 +147,5 @@ class ContainerHeaderCard extends StatelessWidget { final totalWeight = container.calculateTotalWeight(equipmentList); return '${totalWeight.toStringAsFixed(1)} kg'; } - - IconData _getTypeIcon(ContainerType type) { - switch (type) { - case ContainerType.flightCase: - return Icons.work; - case ContainerType.pelicase: - return Icons.work_outline; - case ContainerType.bag: - return Icons.shopping_bag; - case ContainerType.openCrate: - return Icons.inventory_2; - case ContainerType.toolbox: - return Icons.handyman; - } - } - - String _getStatusLabel(EquipmentStatus status) { - switch (status) { - case EquipmentStatus.available: - return 'Disponible'; - case EquipmentStatus.inUse: - return 'En prestation'; - case EquipmentStatus.maintenance: - return 'Maintenance'; - case EquipmentStatus.outOfService: - return 'Hors service'; - default: - return 'Autre'; - } - } - - Color _getStatusColor(EquipmentStatus status) { - switch (status) { - case EquipmentStatus.available: - return Colors.green; - case EquipmentStatus.inUse: - return Colors.orange; - case EquipmentStatus.maintenance: - return Colors.blue; - case EquipmentStatus.outOfService: - return Colors.red; - default: - return Colors.grey; - } - } } diff --git a/em2rp/pubspec.yaml b/em2rp/pubspec.yaml index 5d63db6..2026466 100644 --- a/em2rp/pubspec.yaml +++ b/em2rp/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: http: ^1.1.2 flutter_dotenv: ^6.0.0 google_fonts: ^6.1.0 - flutter_svg: ^2.0.9 + flutter_svg: ^2.2.1 cached_network_image: ^3.3.1 flutter_staggered_grid_view: ^0.7.0 shimmer: ^3.0.0 @@ -67,3 +67,5 @@ flutter: assets: - assets/ - assets/images/ + - assets/logos/ + - assets/icons/