From c1944f6262362e3b7e449b8cf18d5d427905786e Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Sat, 22 Dec 2012 10:48:34 -0500 Subject: [PATCH] Restyle login, change password works --- Notes/Header white.psd | Bin 0 -> 206853 bytes .../ViewModels/CreateLogViewModelTests.cs | 1 + Web/Content/Account.Login.css | 39 +++++++ Web/Content/Site.admin.css | 37 +++++++ Web/Content/images/Header.login.png | Bin 0 -> 8187 bytes Web/Controllers/AccountController.cs | 3 +- Web/Controllers/CreateLogController.cs | 1 + Web/Controllers/LogController.cs | 2 + Web/Controllers/VehicleController.cs | 1 + Web/DAL/DataService.cs | 3 +- Web/Membership/CodeFirstMembershipProvider.cs | 104 ++++++++---------- Web/Membership/CodeFirstRoleProvider.cs | 10 +- Web/Membership/WebSecurity.cs | 17 ++- .../201212191949311_AddMembership.cs | 8 +- Web/Models/User.cs | 10 ++ Web/Scripts/Shared/Site.js | 3 + .../Account/ChangePasswordViewModel.cs | 24 ++++ Web/ViewModels/Account/LoginViewModel.cs | 21 ++++ Web/ViewModels/Account/RegisterModel.cs | 23 ++++ Web/ViewModels/AccountModels.cs | 57 ---------- .../ConfirmCreateLogViewModel.cs | 2 +- .../{ => CreateLog}/CreateLogViewModel.cs | 12 +- Web/ViewModels/EmployeeMileageItem.cs | 3 +- Web/ViewModels/EmployeeMileageViewModel.cs | 1 + Web/ViewModels/{ => Log}/LogIndexViewModel.cs | 6 +- Web/ViewModels/{ => Log}/LogPartialDetails.cs | 6 +- Web/ViewModels/{ => Log}/LogQueryViewModel.cs | 2 +- .../{ => Log}/LogResultsViewModel.cs | 2 +- .../{ => Vehicle}/VehicleMileageItem.cs | 5 +- .../{ => Vehicle}/VehicleMileageViewModel.cs | 3 +- .../{ => Vehicle}/VehiclePartialDetails.cs | 8 +- Web/Views/Account/Login.cshtml | 25 +++-- Web/Views/Account/Manage.cshtml | 11 +- Web/Views/Account/Register.cshtml | 4 +- .../Account/_ChangePasswordPartial.cshtml | 24 +--- Web/Views/Account/_SetPasswordPartial.cshtml | 25 ----- Web/Views/CreateLog/Confirm.cshtml | 2 +- Web/Views/CreateLog/Index.cshtml | 4 +- Web/Views/CreateLog/Success.cshtml | 2 +- Web/Views/Log/Create.cshtml | 4 +- Web/Views/Log/DetailsPartial.cshtml | 3 +- Web/Views/Log/Edit.cshtml | 4 +- Web/Views/Log/Index.cshtml | 2 +- Web/Views/Log/MonthlyVehicleMileage.cshtml | 2 +- .../Shared/EditorTemplates/Boolean.cshtml | 5 +- .../LogResultsViewModel.cshtml | 2 +- Web/Views/Shared/_Layout.admin.cshtml | 2 +- ...l.cshtml => _Layout.authentication.cshtml} | 2 +- Web/Views/Shared/_Layout.login.cshtml | 1 - Web/Views/Shared/_ValidationSummary.cshtml | 7 ++ Web/Views/Vehicle/Create.cshtml | 3 +- Web/Views/Vehicle/DetailsPartial.cshtml | 2 +- Web/Views/Vehicle/Edit.cshtml | 4 +- Web/Web.csproj | 28 +++-- 54 files changed, 327 insertions(+), 255 deletions(-) create mode 100644 Notes/Header white.psd create mode 100644 Web/Content/Account.Login.css create mode 100644 Web/Content/images/Header.login.png create mode 100644 Web/ViewModels/Account/ChangePasswordViewModel.cs create mode 100644 Web/ViewModels/Account/LoginViewModel.cs create mode 100644 Web/ViewModels/Account/RegisterModel.cs delete mode 100644 Web/ViewModels/AccountModels.cs rename Web/ViewModels/{ => CreateLog}/ConfirmCreateLogViewModel.cs (97%) rename Web/ViewModels/{ => CreateLog}/CreateLogViewModel.cs (92%) rename Web/ViewModels/{ => Log}/LogIndexViewModel.cs (82%) rename Web/ViewModels/{ => Log}/LogPartialDetails.cs (87%) rename Web/ViewModels/{ => Log}/LogQueryViewModel.cs (81%) rename Web/ViewModels/{ => Log}/LogResultsViewModel.cs (89%) rename Web/ViewModels/{ => Vehicle}/VehicleMileageItem.cs (70%) rename Web/ViewModels/{ => Vehicle}/VehicleMileageViewModel.cs (85%) rename Web/ViewModels/{ => Vehicle}/VehiclePartialDetails.cs (78%) delete mode 100644 Web/Views/Account/_SetPasswordPartial.cshtml rename Web/Views/Shared/{_Layout.authentication.cshtml.cshtml => _Layout.authentication.cshtml} (88%) create mode 100644 Web/Views/Shared/_ValidationSummary.cshtml diff --git a/Notes/Header white.psd b/Notes/Header white.psd new file mode 100644 index 0000000000000000000000000000000000000000..578ae740083b95a79a6f3b0f03da381355bc136c GIT binary patch literal 206853 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 z�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 literal 0 HcmV?d00001 diff --git a/Web.Tests/ViewModels/CreateLogViewModelTests.cs b/Web.Tests/ViewModels/CreateLogViewModelTests.cs index 5b95c22..cd5e05c 100644 --- a/Web.Tests/ViewModels/CreateLogViewModelTests.cs +++ b/Web.Tests/ViewModels/CreateLogViewModelTests.cs @@ -1,6 +1,7 @@ using System; using MileageTraker.Web.Models; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.CreateLog; using NUnit.Framework; namespace Web.Tests.ViewModels diff --git a/Web/Content/Account.Login.css b/Web/Content/Account.Login.css new file mode 100644 index 0000000..7d6c6a7 --- /dev/null +++ b/Web/Content/Account.Login.css @@ -0,0 +1,39 @@ +body { + padding-top: 40px; + padding-bottom: 40px; + background-color: #f5f5f5; +} + +.header { + background: url(images/Header.login.png) no-repeat; + height: 54px; + width: 300px; +} + +.form-login { + max-width: 300px; + padding: 19px 29px 29px; + margin: 0 auto 20px; + background-color: #fff; + border: 1px solid #e5e5e5; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,.05); + box-shadow: 0 1px 2px rgba(0,0,0,.05); +} + +.validation-summary-errors ul { + list-style-type: none; + margin: 0; +} + +.rememberMe { + margin-bottom: 20px; +} + +legend { + border-bottom: 0; + margin-bottom: 0; +} \ No newline at end of file diff --git a/Web/Content/Site.admin.css b/Web/Content/Site.admin.css index 38d80d8..5c7e47c 100644 --- a/Web/Content/Site.admin.css +++ b/Web/Content/Site.admin.css @@ -2,6 +2,10 @@ padding-top: 60px; } +.navbar.navbar-fixed-top { + min-width: 979px +} + .brand { background: url(images/Header.png) no-repeat left center; @@ -18,6 +22,29 @@ line-height: 29px; } +.nav > li button.btn-link { + display: block; +} + +.navbar .nav > li button.btn-link { + float: none; + padding: 12px 15px 0; + color: #777; + text-decoration: none; +} + +.navbar-inverse .nav > li button.btn-link { + color: #999; +} + +.navbar-inverse .nav > li button.btn-link:hover { + color: white; +} + +.navbar .nav > li form { + margin: 0; +} + footer { background-color: #101010; color: #666; @@ -35,6 +62,16 @@ footer { margin-left: 120px; } +fieldset legend { + margin: 0; + border: 0; +} + +.validation-summary-errors ul { + list-style-type: none; + margin: 0; +} + .report-calculation { display: none; diff --git a/Web/Content/images/Header.login.png b/Web/Content/images/Header.login.png new file mode 100644 index 0000000000000000000000000000000000000000..6198e9df84cc1dc19d28a53989559cee3c26ba20 GIT binary patch literal 8187 zcmd^kWmH?;)-I)jJEfE&DOOs7OMoK9rMNT!Qc8dT!2$$|7K#=qQXGmyvEp7Fio3hJ zyB0}4-gDmf-23B<@5lXn*B*N>o6mganrqIn_ZmA;T~(e4p9UWb3yVlmK}Hh`>mKl~ zEr@&n?x_^7O?+29b&!QPXdz7twuCzXjNoPn8!^U%+D1kI!bFS_ETF=zVk-?d zM<}@3!?j#hwT)dZjfG7ZCBy-u&LVdTtlv4RbL9{w3mI zDaQD3qaZ5k0BNK>93a5S&0)+f$O91M=j7q%7UmZQ0(iN3xVdg&C(_=Gi$_>kn2Vd2idr4a&uW*|Fy1vNuwMz;s3{s|0<2rcCm$XX~I!RM|b2 z)a(&=n*y_vK^i++!)+WCWyBcoW;jg{CL+Aty!^t_yxbsOAz@i=9v(?)UO^#{w6rXr zFb|)A4Co&n{|(D0z$Yam#VgG(B`L(iBg-qy&o3(}#3v^x0FsmC7nb@5t7wCAfY}(s z|KUa4@&1jK`d_gk()Mte1JYg_iM0AB0@Tfs4oH+a(iR}CCBVr803&QnkWQ$-w&&lg zm4VwMKEh4p?2*=hfB9Dg@n84_gyaMzd3l8;h4`gpd3kuGc=`FHg+Rg}VQzjQUVd4| zzp*C&FFxbCGluK0;P}6S<)5Lu2>h%0pU}VS{3m(fHg_3gf0r7^ZA#O38Hc5=tSvkA zL#waytFDgn%*;&B-0{y?yK+BngfaN?^0G8SJ0=L(+}u38bUZpba(s!Yudf$^L?g^h z%FD~9cW!^?<-fB@E35CxObF=d=^2?@OGrpq+&;U#z1>`%scRpuF3aj^Ex*`W-9G+P zKf1rZzV7Pc+!`y_K7Dv}bhx^@)moD=HPU{5epda7rloiE_U06gzKn%a9v|(_u54VO z(M$6aZ5khbW<>4p?~knhsmk(c4`MnxzuMf~Y#Q5NT3Vu~ryuF6OiN4i^Y!XqJRA0l zwD2z2ohX>7aBLfxG1S*w-n$v=Ys<+mSvy8o(hpknaY)&tx zMt$;gH*4~tU0z<_J3Mx|nVTLhca6rA?^>hx&1 z(6WDKuc$CTKlRIylW$8yIR^&^27O&6tT>V={L__rcJnOPo_Z*T^Uu}wQHxcrv}RvZ z_B95L{)2AIb!?qHNVj^tx4C3vg}6QYb8v&+%;E3(#@7AAV0CjZJ0~{*$@F{TU}s~Y z!4!3Kb+tIzQ&&@Zwmy!&LC#d=z1Z0w9G#AMPte!he0_s1EGeHF zADT#)N;4;}uCDGLUC7AH=901fEue6HecjpBwY|O5)Yd)T7@7Ywqj%z<@jc@7^u!bO zerav<27O(|CQ?#aTjoeUv3Wf$*kH&o4|)PHqOJ%zb~+;6} zSy}051{wn|TH3zA>|Y(893QW5ACG-czC2jU@|HZB zuUSmaUTpOIi6kqrCE6Jo+iPsS7#cmA9$8-)zT>Ps(LB0)XJI*Ls%qVJ|9>u6S{FDh zSXk5)iZYVg&eOXIBoGR4WfPAiE-TL?b*5lhYiu&?2M>ubgi_`BYboVl*)l5(bx6~V z%E)CiWXWWo>`afdsZ6n!RO04ozt`2%Xz_lTrM~~>^Xk|WJC`>{Z3T1N4ew9-mAxNY zUK><-%p8n}rI_y5qt^R-!%zca7Xw05$;^^rg`ZMrqtkp)15ObF=H|Gx8W; zeWk6nl30RelW%PdQ5cyXsm?7tGe2AAkwbhVBT70ts(Yz4M|!2^oiL2QfSfrn`T2NR zE}*^Xq3y3}4InBkb7ZiQ!?Ij|+cxa0mLqjvEWzg(Di|*f^^>K7&FXYbF>lIH+I1F6 zCB*Rhel``=@Ay|GLjm8wl9CiG{wmV^0?jyBE9s=IxMeELPhq?hGG6$<7DYg4DZOOdTX1+xaR2XrytM8+-4`V%-; zs}XZBNHLuopn0kF{6 zaJ9f8(oam6++I3wG7!cpxbdQWrYa3?%j}UaR19v8m#*GN&QM{T+6D;d8lIsrex)iuCsH&r0>6|t4;hl$$KYyJ^f=rMejyuYWPHINdo6B)x-4i zDbq||YCkvhS$>r52mh+8jV5o?>{p!v*h#%TtV~&~ZsO@X6sy}I0kSO1_yVozkLU1; z$}1{3R0U!tmL-V4qG)8=p29}e0tf*-_RM$;Ggcae5*q}-@T-kRkBNNr7nbcW6+HfB zDJC={S7rXM6Is;&-gTUOc$}*;_m4j8;!$M{M}|KPt*LxB${8n$w+f%a2+USHHn+4G zPw-g;|6-cwvO7nqVmnYg?eBl0in69i`g$u$9$%h9Lcsn&AEvPQ$fLiX9M6Z$;KJ^V z1Wgu2*l4tIah2}L2xOY-55Ob|8EHb^&rut_AE&k({%H&K=N7QoXmTkAejeih#&%n} zWs&8xR@4uZsFdM2VgNv7W9dV<2mPz>D`Y(YRPTdg<_Lm7<A|u$iX4T z`qE&LHVX2vOH=J?BkU>Fc;?#vV*flvy*xWTZqUy^BW5YBI!Q%=g@1O-B*reV=xBA^ zG{|E8AtJRz3qPX(l2v8ZVVq$=}Q59KYMeKDmwOyV4eZS8!-Le+4%-d>NR|d3>C6u#a0I zpJX_WQq2Pz!{8djBOPG_kGkGADtGnws4|eauyvxuh6&L4@pUGNlf(lsyM@kGWwTqO z;rcH&L{#&xnbtvdb=MuRXuq=7IO`Zxd`qbnMI}KQH$~S#}z@h>w_xQ0a>gj!Fw?)FU23}z>Eb|u*y8N~_rc4{F`z!Rw{KAbt!+o4Qi(y3S7otO zlBa;fRi?V^s;Xxy(Amn#3}^cp%ilrkdYQ%UW(9RPMcn6%8MJ2~B}Si7aXAQ%GX zdr!jU=G=@eK~4qJAfc_(6(n=LIUFgGv^`8UuKe*srs(HS89cV6!RhTl&1Z@skclN}j|G_u9`bFWcT@{=JjS_50^`Rwe zN>GY77#c)BNX`=H`56sD&gl{OuL1X9%HPY0a}(I5qV*SE#e%Ik7XEyxT1`{hg+btN zpHMz=WBxd*kQghz0v5z32$D05&r$rm5)Vy!MT<^-t1{_AH)ph-(9#psk`1}^OQkee zE984IelK6<=hJeQ0q5xopVmnTWUCG)k|DloHGzX2!n_3mn#o>};FyQz%PYhhJH?HLHM|vGWRmb7G z%7NhYGAk;w7oP`CSDSu)i#y9e@yG0QW@=9oykF{>QwVIZ(5IaR5)cXO->jq`&nK@p z-gpeDX4dV%AmkS>BY3+s`!p4ujdbRiVBw!2(Q?cRpXJK6%__S1^GAMCEG_P4ZML?u zH*P3yOwY3#Mr#V&ev1k1T4jCK3ab=&T%KqpAi9pMC+SLxV)q3imoJx9 zb9>~81vZn{Hl3_hX>-!j4Yd;nJYMi-znE?Lrcyyck0k*iq0X-#@DBRGCIbD4^<0w@ zA0InPAL=fnB0__wIa1n{&xy+)VQx||(M7Trj@EwK{nv9%hKXuU$TCsqp%~By*R2Dt zu2-&Z^8T_|J60M^4U^`51=4=>^c2P%`GL89iq);QF9aN^AXIkB-I?|jnosBVGKmo> zI&s@{+Dh3Ilv%8agYkxgvE|x09E`7;XWWb)kBzGJ;S1?Ht}0kr?S?>{M$92+4G9OK ze$gHGvd1evj-2li830{-=A1zH^IaEe4;psXKRR8XH(3t`uhoJY-7fmOp2;h`6xiUL z@t9yaxGt`V$Nx?Y923kh$UwdMP(mhYL*`n(q)yB#5U6rkEZCj5(JJlpqk9;4t ze%DS@tokU)7xjXLc^4aU?BRTC%(~8rJYWt{{qbby5B4*5{^v_nNpSKntSo!jkYzEq zR;{CahUM3*HO#Rk=y_FMz z=WKm#!rbf`zj`gmA!Dg`u8(NS7CqL~=k(qvqr#{pMr{Oq4V-bWdVZi0lNmQc-P<+0 z4Iz}?pwvZi;`8aEpxIfODvoOz11l#0SPnzzh2q;D|B^x9@&I;~Pjk2j%N=SeZ&fo^ zGfXqdZ(%JJmd~j62#KQ44A+=qDww%#SBQQVz;)&1;5AA+C%=D@7$m7x6yV_!)H*-- zzVbp*G3`Ykzl(%zNwJAwGt1+oS}vf~)o<~)$9YAe*QtJvN4wK=4GpSO(nMx&1he?` z8v_XmgL@l%r%d?VBN%7^SINQ@LaW93a=#cO%7Iqai}8F!@}Vz4v$am`psI}7i{5%Z zX@?ZJ`bw!uZ`L`HD8*(1p&U(&gvaDZ+U~dXcwgy0dM;!t(?pCfKLCm+pfKoOsbK^`_cjll>(cfk0E=rR4b8uyop%j!B5!P!3(K*w;=5DKc+LFh8}nDf{@L%Y1PO+i;J@U3J%x) ze7)P*Ai+YRhaDcqN9n^th>hwqCcZ+Pm|auTOsvGF&fwr+zKcR+qD8Jbv=qox{DZt) zOEd9-vE0&!*YF2&#KNvE3s;XGaef7S8b|eD-{+%o2bn@8?miT|mPLnqJ&kTyF@PjRL?CO+$vE99fo0DDi%pWU0wu-L`QQM`KlfxdZHEM=8ri0z z7npdNpFC!Hrgv6|mL;ucMC{Hid{P_EYB7u3%We* zj7?T|iohcE^iQjSELBF2!UKRubTuAHpIHFqpy>*&k0TwY{vV1s1KmHhmNw)D1E&=9 zV)k~dqt$)tyE~&qEm(4_cPMnYUV06W$y@iKRilgKr9z6pS;`^jih;fzSK|5fWjidq zY%GGN_X_sqDhGZ)HJfrEo5?m$3-bzl_w?oo=P7K0MEcbAqlYPn1vrsIq;{6zY_xRa z#S;!_95R)0ZM+Z!vZ}6BxExQv<&vab*!g@m8&UB#G!BN^@LV4$p}~k=mP{Fh%yWo=Ex@3-IqV; zAficoSjIUp;EEQyHgxh+u0~JCTx|61&R1`S+5fo@8B@N1I$_5s14whMhs|Bx+!!b# z_l+wyYWT*aI$Ofc72}fE=I7@Nhqr|2Dv8y#hJ;P&patIH*6cY$9MUXL!=qo|K`PgW zrZfDIb_3RCQ!vL5zHv2kNB!98oHhOVTRyLZp>N%6ILW+-%BBNfe11`GfA!{>_NMl< z>~cwyZzBnN2(>~=_v#TZAI>HBY?meCsafg(jG>RF!Gzl>ZY9issCHG)+Qo^u{nvK}nFrKl65&97Zsh3Wz zVMot19F>)G0tqfHmit}v3TSwt-u}_~{yAFj=~O6#7Q>W8S;2W8xKyE`TCC7`?xj%` zTmscL&?o==Bhqs<^WnhBUb+t^C44UUvXf7)_KRI^D60v~O77Ou0wQ}6J=S#f2 zdg;I$P$TdK4W<&_;!iYz9tO(G8H3J+p6E8B9oLGUL!r0ru`D05lVa&~hC5ARB&j?SJNZyE!e-7cN?!U3GEvTgm1AY7bYVI}^P4_6ztq`eAYL_O@Je z^}DRLXay6*^x^v`9Z@_l4fU#HGcq^q6WBfWM# zf%8RaVnE-=wPe1Ke#Llh2Qavn3>4G-nLZMqV%&%eydGz#T{<)(SqFu*C(|2)!Lc-m zshF+n&{8lgrSyK5nnbs_**jmAh47R>aX#9G64P%JEIryKYW{RTeD@MOMvG5&I4~Kz z5g6l^gyTU@!j`Tno*TR72)uk~y#aFg1l~B=PHJSG{Kh{rVRV$2roaFoRAsUDQzuX4 z=b8W8dpO5LC~!O>AMqP0OPB9RDMue7s zew5qBZM^i`I!sq5zl`xTI zYXQ`axrhxJx}h>K7IPE7+d2L+j)^Q$6Qlp@M@RHp?%x|dOP2&A|efY^jp6#&lxM#x*CM}@$5~zJd zEomzvU{JSV%ozTJq&PxfZ+NN-SvI1t7x7*PRHUBMt;72YE}kfOa|9M(H}y2Cxvjco z-J6vtp!N?qR-EpAlwn$-^Y*v|)B90@i27aM-qPi1K)~r`o?DhiySzzu$3mt0F(V^u zF|w*OR^FuQm+3sT5b`i6&qhkn+dfdjO?IhBT(@N9&j;CoBmx+SsC`XMov$2eNCA=6 zOV1nn+QxoLGFY(5-3HQNQ=zo`@+(j|-$;<`?N!j!Mjax&!5I3Qx=0#LQLNUGjWu`Bd)T8IV%7En+YG(7H zt4-9#y8@9arQWr#m+X14MRp5o>w+hpCQ9saqy^Ir?7k3=XZ2}lJRgDX@4l*Nk2Shi&kgbiI@uiRzlT_*n2N1phg7GE|@yd>4oY2 zt`laGh=7$I6{7+@MUNWqNQ8`yL>ujo!xx7u$}>)VgY-R4AD1-=o!r}egd1!%S2WYq zUqwwfHUbc53a>LYU)o??{UDtsmJvSpXx#=2Q~Z%X7-HYtV%VFoveW#a8T==&{`wuS MD61+{C}rsVKNVSF0{{R3 literal 0 HcmV?d00001 diff --git a/Web/Controllers/AccountController.cs b/Web/Controllers/AccountController.cs index 7458469..523e42e 100644 --- a/Web/Controllers/AccountController.cs +++ b/Web/Controllers/AccountController.cs @@ -3,6 +3,7 @@ using System.Web.Mvc; using System.Web.Security; using MileageTraker.Web.Membership; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.Account; namespace MileageTraker.Web.Controllers { @@ -97,7 +98,7 @@ namespace MileageTraker.Web.Controllers { changePasswordSucceeded = WebSecurity.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword); } - catch (Exception) + catch (Exception ex) { changePasswordSucceeded = false; } diff --git a/Web/Controllers/CreateLogController.cs b/Web/Controllers/CreateLogController.cs index d9bc81e..1289cc7 100644 --- a/Web/Controllers/CreateLogController.cs +++ b/Web/Controllers/CreateLogController.cs @@ -4,6 +4,7 @@ using MileageTraker.Web.DAL; using MileageTraker.Web.Models; using MileageTraker.Web.Utility; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.CreateLog; namespace MileageTraker.Web.Controllers { diff --git a/Web/Controllers/LogController.cs b/Web/Controllers/LogController.cs index b0326a9..57c9490 100644 --- a/Web/Controllers/LogController.cs +++ b/Web/Controllers/LogController.cs @@ -5,6 +5,8 @@ using MileageTraker.Web.DAL; using MileageTraker.Web.Models; using MileageTraker.Web.Utility; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.Log; +using MileageTraker.Web.ViewModels.Vehicle; namespace MileageTraker.Web.Controllers { diff --git a/Web/Controllers/VehicleController.cs b/Web/Controllers/VehicleController.cs index 7c27029..582de87 100644 --- a/Web/Controllers/VehicleController.cs +++ b/Web/Controllers/VehicleController.cs @@ -3,6 +3,7 @@ using System.Web.Mvc; using MileageTraker.Web.DAL; using MileageTraker.Web.Models; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.Vehicle; namespace MileageTraker.Web.Controllers { diff --git a/Web/DAL/DataService.cs b/Web/DAL/DataService.cs index a813ab5..e2dbed1 100644 --- a/Web/DAL/DataService.cs +++ b/Web/DAL/DataService.cs @@ -8,6 +8,8 @@ using MileageTraker.Web.Context; using MileageTraker.Web.Models; using MileageTraker.Web.Utility; using MileageTraker.Web.ViewModels; +using MileageTraker.Web.ViewModels.Log; +using MileageTraker.Web.ViewModels.Vehicle; namespace MileageTraker.Web.DAL { @@ -172,7 +174,6 @@ namespace MileageTraker.Web.DAL }); } - public IEnumerable GetMonthlyEmployeeMileageItems(LogQueryViewModel query) { var items = diff --git a/Web/Membership/CodeFirstMembershipProvider.cs b/Web/Membership/CodeFirstMembershipProvider.cs index a035f56..ccbe291 100644 --- a/Web/Membership/CodeFirstMembershipProvider.cs +++ b/Web/Membership/CodeFirstMembershipProvider.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Data.SqlTypes; using System.Linq; using System.Security.Cryptography; using System.Web; @@ -18,7 +18,11 @@ namespace MileageTraker.Web.Membership public override string ApplicationName { get { return GetType().Assembly.GetName().Name; } - set { ApplicationName = GetType().Assembly.GetName().Name; } + set + { + if (value == null) throw new ArgumentNullException("value"); + ApplicationName = GetType().Assembly.GetName().Name; + } } public override int MaxInvalidPasswordAttempts @@ -113,24 +117,19 @@ namespace MileageTraker.Web.Membership PasswordFailuresSinceLastSuccess = 0, LastLoginDate = DateTime.UtcNow, LastActivityDate = DateTime.UtcNow, - LastLockoutDate = DateTime.UtcNow, + LastLockoutDate = SqlDateTime.MinValue.Value, IsLockedOut = false, - LastPasswordFailureDate = DateTime.UtcNow + LastPasswordFailureDate = SqlDateTime.MinValue.Value }; context.Users.Add(newUser); context.SaveChanges(); status = MembershipCreateStatus.Success; - return new MembershipUser(System.Web.Security.Membership.Provider.Name, newUser.Username, newUser.UserId, - newUser.Email, null, null, - newUser.IsApproved, newUser.IsLockedOut, newUser.CreateDate.Value, - newUser.LastLoginDate.Value, newUser.LastActivityDate.Value, - newUser.LastPasswordChangedDate.Value, newUser.LastLockoutDate.Value); + return newUser.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name); } } - public string CreateUserAndAccount(string userName, string password, bool requireConfirmation, - IDictionary values) + public string CreateUserAndAccount(string userName, string password, bool requireConfirmation) { return CreateAccount(userName, password, requireConfirmation); } @@ -196,7 +195,7 @@ namespace MileageTraker.Web.Membership } using (var context = new MileageTrakerContext()) { - User user = context.Users.FirstOrDefault(Usr => Usr.Username == username); + var user = context.Users.FirstOrDefault(usr => usr.Username == username); if (user == null) { return null; @@ -207,12 +206,7 @@ namespace MileageTraker.Web.Membership user.LastActivityDate = DateTime.UtcNow; context.SaveChanges(); } - - return new MembershipUser(System.Web.Security.Membership.Provider.Name, user.Username, user.UserId, user.Email, - null, null, - user.IsApproved, user.IsLockedOut, user.CreateDate.Value, user.LastLoginDate.Value, - user.LastActivityDate.Value, user.LastPasswordChangedDate.Value, - user.LastLockoutDate.Value); + return user.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name); } } @@ -228,8 +222,7 @@ namespace MileageTraker.Web.Membership using (var context = new MileageTrakerContext()) { - User user; - user = context.Users.Find(providerUserKey); + var user = context.Users.Find(providerUserKey); if (user == null) { return null; @@ -240,12 +233,7 @@ namespace MileageTraker.Web.Membership user.LastActivityDate = DateTime.UtcNow; context.SaveChanges(); } - - return new MembershipUser(System.Web.Security.Membership.Provider.Name, user.Username, user.UserId, user.Email, - null, null, - user.IsApproved, user.IsLockedOut, user.CreateDate.Value, user.LastLoginDate.Value, - user.LastActivityDate.Value, user.LastPasswordChangedDate.Value, - user.LastLockoutDate.Value); + return user.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name); } } @@ -265,7 +253,7 @@ namespace MileageTraker.Web.Membership } using (var context = new MileageTrakerContext()) { - User user = context.Users.FirstOrDefault(Usr => Usr.Username == username); + User user = context.Users.FirstOrDefault(usr => usr.Username == username); if (user == null) { return false; @@ -309,7 +297,7 @@ namespace MileageTraker.Web.Membership { using (var context = new MileageTrakerContext()) { - var user = context.Users.FirstOrDefault(Usr => Usr.Username == userName); + var user = context.Users.FirstOrDefault(usr => usr.Username == userName); if (user != null) { user.IsLockedOut = false; @@ -325,7 +313,9 @@ namespace MileageTraker.Web.Membership { var dateActive = DateTime.UtcNow.Subtract( - TimeSpan.FromMinutes(Convert.ToDouble(System.Web.Security.Membership.UserIsOnlineTimeWindow))); + TimeSpan.FromMinutes( + Convert.ToDouble( + System.Web.Security.Membership.UserIsOnlineTimeWindow))); using (var context = new MileageTrakerContext()) { return context.Users.Count(usr => usr.LastActivityDate > dateActive); @@ -338,13 +328,13 @@ namespace MileageTraker.Web.Membership { return false; } - using (var Context = new MileageTrakerContext()) + using (var context = new MileageTrakerContext()) { - var user = Context.Users.FirstOrDefault(Usr => Usr.Username == username); + var user = context.Users.FirstOrDefault(usr => usr.Username == username); if (user != null) { - Context.Users.Remove(user); - Context.SaveChanges(); + context.Users.Remove(user); + context.SaveChanges(); return true; } return false; @@ -378,11 +368,8 @@ namespace MileageTraker.Web.Membership .Take(pageSize); foreach (var user in users) { - membershipUsers.Add(new MembershipUser(System.Web.Security.Membership.Provider.Name, user.Username, user.UserId, - user.Email, null, null, - user.IsApproved, user.IsLockedOut, user.CreateDate.Value, - user.LastLoginDate.Value, user.LastActivityDate.Value, - user.LastPasswordChangedDate.Value, user.LastLockoutDate.Value)); + membershipUsers.Add( + user.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name)); } } return membershipUsers; @@ -402,11 +389,7 @@ namespace MileageTraker.Web.Membership .Take(pageSize); foreach (var user in users) { - membershipUsers.Add(new MembershipUser(System.Web.Security.Membership.Provider.Name, user.Username, user.UserId, - user.Email, null, null, - user.IsApproved, user.IsLockedOut, user.CreateDate.Value, - user.LastLoginDate.Value, user.LastActivityDate.Value, - user.LastPasswordChangedDate.Value, user.LastLockoutDate.Value)); + membershipUsers.Add(user.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name)); } } return membershipUsers; @@ -414,21 +397,22 @@ namespace MileageTraker.Web.Membership public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) { - var MembershipUsers = new MembershipUserCollection(); - using (var Context = new MileageTrakerContext()) + var membershipUsers = new MembershipUserCollection(); + using (var context = new MileageTrakerContext()) { - totalRecords = Context.Users.Count(); - var Users = Context.Users.OrderBy(Usrn => Usrn.Username).Skip(pageIndex*pageSize).Take(pageSize); - foreach (var user in Users) + totalRecords = context.Users.Count(); + var users = + context.Users + .OrderBy(usrn => usrn.Username) + .Skip(pageIndex*pageSize) + .Take(pageSize); + + foreach (var user in users) { - MembershipUsers.Add(new MembershipUser(System.Web.Security.Membership.Provider.Name, user.Username, user.UserId, - user.Email, null, null, - user.IsApproved, user.IsLockedOut, user.CreateDate.Value, - user.LastLoginDate.Value, user.LastActivityDate.Value, - user.LastPasswordChangedDate.Value, user.LastLockoutDate.Value)); + membershipUsers.Add(user.CloneToMembershipUser(System.Web.Security.Membership.Provider.Name)); } } - return MembershipUsers; + return membershipUsers; } public string CreateAccount(string userName, string password, bool requireConfirmationToken) @@ -451,7 +435,7 @@ namespace MileageTraker.Web.Membership using (var context = new MileageTrakerContext()) { - if (context.Users.Any(Usr => Usr.Username == userName)) + if (context.Users.Any(usr => usr.Username == userName)) { throw new MembershipCreateUserException(MembershipCreateStatus.DuplicateUserName); } @@ -462,7 +446,7 @@ namespace MileageTraker.Web.Membership token = GenerateToken(); } - var NewUser = new User + var newUser = new User { UserId = Guid.NewGuid(), Username = userName, @@ -474,13 +458,13 @@ namespace MileageTraker.Web.Membership PasswordFailuresSinceLastSuccess = 0, LastLoginDate = DateTime.UtcNow, LastActivityDate = DateTime.UtcNow, - LastLockoutDate = DateTime.UtcNow, + LastLockoutDate = SqlDateTime.MinValue.Value, IsLockedOut = false, - LastPasswordFailureDate = DateTime.UtcNow, + LastPasswordFailureDate = SqlDateTime.MinValue.Value, ConfirmationToken = token }; - context.Users.Add(NewUser); + context.Users.Add(newUser); context.SaveChanges(); return token; } @@ -494,7 +478,7 @@ namespace MileageTraker.Web.Membership } } - internal static string GenerateToken(RandomNumberGenerator generator) + private static string GenerateToken(RandomNumberGenerator generator) { var tokenBytes = new byte[TokenSizeInBytes]; generator.GetBytes(tokenBytes); diff --git a/Web/Membership/CodeFirstRoleProvider.cs b/Web/Membership/CodeFirstRoleProvider.cs index 83b0d5e..4af432b 100644 --- a/Web/Membership/CodeFirstRoleProvider.cs +++ b/Web/Membership/CodeFirstRoleProvider.cs @@ -11,7 +11,11 @@ namespace MileageTraker.Web.Membership public override string ApplicationName { get { return GetType().Assembly.GetName().Name; } - set { ApplicationName = GetType().Assembly.GetName().Name; } + set + { + if (value == null) throw new ArgumentNullException("value"); + ApplicationName = GetType().Assembly.GetName().Name; + } } public override bool RoleExists(string roleName) @@ -86,7 +90,7 @@ namespace MileageTraker.Web.Membership } using (var context = new MileageTrakerContext()) { - User user = context.Users.FirstOrDefault(Usr => Usr.Username == username); + var user = context.Users.FirstOrDefault(usr => usr.Username == username); if (user != null) { return user.Roles.Select(rl => rl.RoleName).ToArray(); @@ -122,7 +126,7 @@ namespace MileageTraker.Web.Membership { using (var context = new MileageTrakerContext()) { - Role role = context.Roles.FirstOrDefault(rl => rl.RoleName == roleName); + var role = context.Roles.FirstOrDefault(rl => rl.RoleName == roleName); if (role == null) { var newRole = new Role diff --git a/Web/Membership/WebSecurity.cs b/Web/Membership/WebSecurity.cs index f60d5b0..1c81827 100644 --- a/Web/Membership/WebSecurity.cs +++ b/Web/Membership/WebSecurity.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Principal; using System.Web; -using System.Web.Routing; using System.Web.Security; using MileageTraker.Web.Context; @@ -47,7 +46,7 @@ namespace MileageTraker.Web.Membership { using (var context = new MileageTrakerContext()) { - var user = context.Users.FirstOrDefault(usr => usr.Username == username); + var user = context.Users.First(usr => usr.Username == username); user.FirstName = firstName; user.LastName = lastName; context.SaveChanges(); @@ -134,18 +133,18 @@ namespace MileageTraker.Web.Membership return CreateUserAndAccount(userName, password, values, requireConfirmationToken: false); } - public static string CreateUserAndAccount(string userName, string password, object propertyValues = null, + private static string CreateUserAndAccount(string userName, string password, object propertyValues = null, bool requireConfirmationToken = false) { var codeFirstMembership = System.Web.Security.Membership.Provider as CodeFirstMembershipProvider; - IDictionary values = null; - if (propertyValues != null) - { - values = new RouteValueDictionary(propertyValues); - } + //IDictionary values = null; + //if (propertyValues != null) + //{ + // values = new RouteValueDictionary(propertyValues); + //} - return codeFirstMembership.CreateUserAndAccount(userName, password, requireConfirmationToken, values); + return codeFirstMembership.CreateUserAndAccount(userName, password, requireConfirmationToken); } public static List FindUsersByEmail(string email, int pageIndex, int pageSize) diff --git a/Web/Migrations/201212191949311_AddMembership.cs b/Web/Migrations/201212191949311_AddMembership.cs index 88168aa..a04fced 100644 --- a/Web/Migrations/201212191949311_AddMembership.cs +++ b/Web/Migrations/201212191949311_AddMembership.cs @@ -97,14 +97,14 @@ namespace MileageTraker.Web.Migrations ,NULL ,1 ,0 - ,NULL - ,NULL - ,NULL + ,'1753-1-1' + ,GETDATE() + ,'1753-1-1' ,NULL ,NULL ,GETDATE() ,0 - ,NULL + ,GETDATE() ,NULL ,NULL)"); diff --git a/Web/Models/User.cs b/Web/Models/User.cs index 2e9bad0..0d39a2b 100644 --- a/Web/Models/User.cs +++ b/Web/Models/User.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Web.Security; namespace MileageTraker.Web.Models { @@ -37,5 +38,14 @@ namespace MileageTraker.Web.Models public virtual DateTime? PasswordVerificationTokenExpirationDate { get; set; } public virtual ICollection Roles { get; set; } + + public MembershipUser CloneToMembershipUser(string providerName) + { + return new MembershipUser(providerName, Username, UserId, + Email, null, null, + IsApproved, IsLockedOut, CreateDate.Value, + LastLoginDate.Value, LastActivityDate.Value, + LastPasswordChangedDate.Value, LastLockoutDate.Value); + } } } \ No newline at end of file diff --git a/Web/Scripts/Shared/Site.js b/Web/Scripts/Shared/Site.js index 809342d..90e584b 100644 --- a/Web/Scripts/Shared/Site.js +++ b/Web/Scripts/Shared/Site.js @@ -139,6 +139,9 @@ $(function () { $("a:contains('" + text + "')") .prepend(' '); }); + + $(".navbar-inverse a[title='Manage']") + .prepend(' '); }); $(function() { diff --git a/Web/ViewModels/Account/ChangePasswordViewModel.cs b/Web/ViewModels/Account/ChangePasswordViewModel.cs new file mode 100644 index 0000000..c66eccd --- /dev/null +++ b/Web/ViewModels/Account/ChangePasswordViewModel.cs @@ -0,0 +1,24 @@ +using System.ComponentModel.DataAnnotations; +using System.Web.Mvc; + +namespace MileageTraker.Web.ViewModels.Account +{ + public class ChangePasswordViewModel + { + [Required] + [DataType(DataType.Password)] + [Display(Name = "Current password")] + public string OldPassword { get; set; } + + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "New password")] + public string NewPassword { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm new password")] + [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } + } +} diff --git a/Web/ViewModels/Account/LoginViewModel.cs b/Web/ViewModels/Account/LoginViewModel.cs new file mode 100644 index 0000000..e6d1805 --- /dev/null +++ b/Web/ViewModels/Account/LoginViewModel.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using MileageTraker.Web.Utility; + +namespace MileageTraker.Web.ViewModels.Account +{ + public class LoginViewModel + { + [Required] + [Display(Name = "Email Address")] + public string EmailAddress { get; set; } + + [Required] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string Password { get; set; } + + [Display(Name = "Remember me?")] + [NoEditLabel] + public bool RememberMe { get; set; } + } +} \ No newline at end of file diff --git a/Web/ViewModels/Account/RegisterModel.cs b/Web/ViewModels/Account/RegisterModel.cs new file mode 100644 index 0000000..59ae3a6 --- /dev/null +++ b/Web/ViewModels/Account/RegisterModel.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; +using System.Web.Mvc; + +namespace MileageTraker.Web.ViewModels.Account +{ + public class RegisterModel + { + [Required] + [Display(Name = "User name")] + public string UserName { get; set; } + + [Required] + [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "Password")] + public string Password { get; set; } + + [DataType(DataType.Password)] + [Display(Name = "Confirm password")] + [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] + public string ConfirmPassword { get; set; } + } +} \ No newline at end of file diff --git a/Web/ViewModels/AccountModels.cs b/Web/ViewModels/AccountModels.cs deleted file mode 100644 index 709274d..0000000 --- a/Web/ViewModels/AccountModels.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.Web.Mvc; - -namespace MileageTraker.Web.ViewModels -{ - public class ChangePasswordViewModel - { - [Required] - [DataType(DataType.Password)] - [Display(Name = "Current password")] - public string OldPassword { get; set; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "New password")] - public string NewPassword { get; set; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm new password")] - [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")] - public string ConfirmPassword { get; set; } - } - - public class LoginViewModel - { - [Required] - [Display(Name = "Email Address")] - public string EmailAddress { get; set; } - - [Required] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } - - [Display(Name = "Remember me?")] - public bool RememberMe { get; set; } - } - - public class RegisterModel - { - [Required] - [Display(Name = "User name")] - public string UserName { get; set; } - - [Required] - [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] - [DataType(DataType.Password)] - [Display(Name = "Password")] - public string Password { get; set; } - - [DataType(DataType.Password)] - [Display(Name = "Confirm password")] - [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] - public string ConfirmPassword { get; set; } - } -} diff --git a/Web/ViewModels/ConfirmCreateLogViewModel.cs b/Web/ViewModels/CreateLog/ConfirmCreateLogViewModel.cs similarity index 97% rename from Web/ViewModels/ConfirmCreateLogViewModel.cs rename to Web/ViewModels/CreateLog/ConfirmCreateLogViewModel.cs index 40b7d7a..490085d 100644 --- a/Web/ViewModels/ConfirmCreateLogViewModel.cs +++ b/Web/ViewModels/CreateLog/ConfirmCreateLogViewModel.cs @@ -3,7 +3,7 @@ using AutoMapper; using MileageTraker.Web.DAL; using MileageTraker.Web.Utility; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.CreateLog { public class ConfirmCreateLogViewModel : CreateLogViewModel { diff --git a/Web/ViewModels/CreateLogViewModel.cs b/Web/ViewModels/CreateLog/CreateLogViewModel.cs similarity index 92% rename from Web/ViewModels/CreateLogViewModel.cs rename to Web/ViewModels/CreateLog/CreateLogViewModel.cs index 9218dc9..714b526 100644 --- a/Web/ViewModels/CreateLogViewModel.cs +++ b/Web/ViewModels/CreateLog/CreateLogViewModel.cs @@ -7,7 +7,7 @@ using MileageTraker.Web.DAL; using MileageTraker.Web.Models; using MileageTraker.Web.Utility; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.CreateLog { public class CreateLogViewModel : IValidatableObject { @@ -66,8 +66,8 @@ namespace MileageTraker.Web.ViewModels Mapper.CreateMap().ConvertUsing(Convert.ToInt32); Mapper.CreateMap().ConvertUsing(Convert.ToDouble); Mapper.CreateMap().ConvertUsing(new DateTimeTypeConverter()); - Mapper.CreateMap(); - Mapper.CreateMap() + Mapper.CreateMap(); + Mapper.CreateMap() .ForMember(vm => vm.Date, opt => opt.MapFrom(m => m.Date.ToString("d"))); } @@ -75,14 +75,14 @@ namespace MileageTraker.Web.ViewModels { } - public CreateLogViewModel(Log log) + public CreateLogViewModel(Models.Log log) { Mapper.Map(log, this); } - public Log GetLog() + public Models.Log GetLog() { - var log = new Log(); + var log = new Models.Log(); Mapper.Map(this, log); return log; } diff --git a/Web/ViewModels/EmployeeMileageItem.cs b/Web/ViewModels/EmployeeMileageItem.cs index b614597..5c7810d 100644 --- a/Web/ViewModels/EmployeeMileageItem.cs +++ b/Web/ViewModels/EmployeeMileageItem.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using MileageTraker.Web.Models; namespace MileageTraker.Web.ViewModels { @@ -10,7 +9,7 @@ namespace MileageTraker.Web.ViewModels public string EmployeeName { get; set; } public int Miles { get; set; } public double GasPurchased { get; set; } - public IEnumerable> LogPairs { get; set; } + public IEnumerable> LogPairs { get; set; } public int TripCount { get { return LogPairs.Count(); } } } } \ No newline at end of file diff --git a/Web/ViewModels/EmployeeMileageViewModel.cs b/Web/ViewModels/EmployeeMileageViewModel.cs index 1d742a5..6dfe686 100644 --- a/Web/ViewModels/EmployeeMileageViewModel.cs +++ b/Web/ViewModels/EmployeeMileageViewModel.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using MileageTraker.Web.ViewModels.Log; namespace MileageTraker.Web.ViewModels { diff --git a/Web/ViewModels/LogIndexViewModel.cs b/Web/ViewModels/Log/LogIndexViewModel.cs similarity index 82% rename from Web/ViewModels/LogIndexViewModel.cs rename to Web/ViewModels/Log/LogIndexViewModel.cs index d44afff..c68198a 100644 --- a/Web/ViewModels/LogIndexViewModel.cs +++ b/Web/ViewModels/Log/LogIndexViewModel.cs @@ -2,7 +2,7 @@ using System; using AutoMapper; using MileageTraker.Web.Models; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Log { public class LogIndexViewModel { @@ -29,10 +29,10 @@ namespace MileageTraker.Web.ViewModels static LogIndexViewModel() { - Mapper.CreateMap(); + Mapper.CreateMap(); } - public LogIndexViewModel(Log log, Log previousLog) + public LogIndexViewModel(Models.Log log, Models.Log previousLog) { Mapper.Map(log, this); if (previousLog != null) diff --git a/Web/ViewModels/LogPartialDetails.cs b/Web/ViewModels/Log/LogPartialDetails.cs similarity index 87% rename from Web/ViewModels/LogPartialDetails.cs rename to Web/ViewModels/Log/LogPartialDetails.cs index dd39772..6f044ad 100644 --- a/Web/ViewModels/LogPartialDetails.cs +++ b/Web/ViewModels/Log/LogPartialDetails.cs @@ -4,7 +4,7 @@ using System.Web.Mvc; using AutoMapper; using MileageTraker.Web.Models; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Log { public class LogPartialDetails { @@ -33,13 +33,13 @@ namespace MileageTraker.Web.ViewModels static LogPartialDetails() { - Mapper.CreateMap(); + Mapper.CreateMap(); } public LogPartialDetails() {} - public LogPartialDetails(Log log) + public LogPartialDetails(Models.Log log) { Mapper.Map(log, this); } diff --git a/Web/ViewModels/LogQueryViewModel.cs b/Web/ViewModels/Log/LogQueryViewModel.cs similarity index 81% rename from Web/ViewModels/LogQueryViewModel.cs rename to Web/ViewModels/Log/LogQueryViewModel.cs index 041b7a4..19013ec 100644 --- a/Web/ViewModels/LogQueryViewModel.cs +++ b/Web/ViewModels/Log/LogQueryViewModel.cs @@ -1,6 +1,6 @@ using MileageTraker.Web.Models; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Log { public class LogQueryViewModel { diff --git a/Web/ViewModels/LogResultsViewModel.cs b/Web/ViewModels/Log/LogResultsViewModel.cs similarity index 89% rename from Web/ViewModels/LogResultsViewModel.cs rename to Web/ViewModels/Log/LogResultsViewModel.cs index 9d75f66..d2cd54d 100644 --- a/Web/ViewModels/LogResultsViewModel.cs +++ b/Web/ViewModels/Log/LogResultsViewModel.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Log { public class LogResultsViewModel { diff --git a/Web/ViewModels/VehicleMileageItem.cs b/Web/ViewModels/Vehicle/VehicleMileageItem.cs similarity index 70% rename from Web/ViewModels/VehicleMileageItem.cs rename to Web/ViewModels/Vehicle/VehicleMileageItem.cs index 241a94d..e226d54 100644 --- a/Web/ViewModels/VehicleMileageItem.cs +++ b/Web/ViewModels/Vehicle/VehicleMileageItem.cs @@ -1,9 +1,8 @@ using System; using System.Linq; using System.Collections.Generic; -using MileageTraker.Web.Models; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Vehicle { public class VehicleMileageItem { @@ -11,7 +10,7 @@ namespace MileageTraker.Web.ViewModels public int Miles { get; set; } public double GasPurchased { get; set; } public string Prog { get; set; } - public IEnumerable> LogPairs { get; set; } + public IEnumerable> LogPairs { get; set; } public int TripCount { get { return LogPairs.Count(); } } } } \ No newline at end of file diff --git a/Web/ViewModels/VehicleMileageViewModel.cs b/Web/ViewModels/Vehicle/VehicleMileageViewModel.cs similarity index 85% rename from Web/ViewModels/VehicleMileageViewModel.cs rename to Web/ViewModels/Vehicle/VehicleMileageViewModel.cs index bee90d2..48938bb 100644 --- a/Web/ViewModels/VehicleMileageViewModel.cs +++ b/Web/ViewModels/Vehicle/VehicleMileageViewModel.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Linq; +using MileageTraker.Web.ViewModels.Log; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Vehicle { public class VehicleMileageViewModel { diff --git a/Web/ViewModels/VehiclePartialDetails.cs b/Web/ViewModels/Vehicle/VehiclePartialDetails.cs similarity index 78% rename from Web/ViewModels/VehiclePartialDetails.cs rename to Web/ViewModels/Vehicle/VehiclePartialDetails.cs index 3ff7e55..43cc8cb 100644 --- a/Web/ViewModels/VehiclePartialDetails.cs +++ b/Web/ViewModels/Vehicle/VehiclePartialDetails.cs @@ -1,9 +1,7 @@ using System.ComponentModel.DataAnnotations; using AutoMapper; -using MileageTraker.Web.Models; -using MileageTraker.Web.Utility; -namespace MileageTraker.Web.ViewModels +namespace MileageTraker.Web.ViewModels.Vehicle { public class VehiclePartialDetails { @@ -33,13 +31,13 @@ namespace MileageTraker.Web.ViewModels static VehiclePartialDetails() { - Mapper.CreateMap(); + Mapper.CreateMap(); } public VehiclePartialDetails() {} - public VehiclePartialDetails(Vehicle vehicle) + public VehiclePartialDetails(Models.Vehicle vehicle) { Mapper.Map(vehicle, this); } diff --git a/Web/Views/Account/Login.cshtml b/Web/Views/Account/Login.cshtml index 1577b45..bd14d73 100644 --- a/Web/Views/Account/Login.cshtml +++ b/Web/Views/Account/Login.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.LoginViewModel +@model MileageTraker.Web.ViewModels.Account.LoginViewModel @{ ViewBag.Title = "Log in"; @@ -9,20 +9,23 @@ } +@section Styles +{ + +} -

@ViewBag.Title

- -@using (Html.BeginForm("Login", "Account", new { ViewBag.ReturnUrl }, FormMethod.Post)) { +@using (Html.BeginForm("Login", "Account", new { ViewBag.ReturnUrl }, FormMethod.Post, new {@class = "form-login"})) { + +
+ +

@ViewBag.Title

+ @Html.AntiForgeryToken() - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary")
- + @Html.EditorForModel() -
-
- -
-
+
} diff --git a/Web/Views/Account/Manage.cshtml b/Web/Views/Account/Manage.cshtml index 2fc5f58..59fa26f 100644 --- a/Web/Views/Account/Manage.cshtml +++ b/Web/Views/Account/Manage.cshtml @@ -1,11 +1,14 @@ -@model MileageTraker.Web.ViewModels.ChangePasswordViewModel +@model MileageTraker.Web.ViewModels.Account.ChangePasswordViewModel @{ ViewBag.Title = "Manage Account"; } +@section Scripts +{ + + +} -
-

@ViewBag.Title

-
+

@ViewBag.Title

@ViewBag.StatusMessage

diff --git a/Web/Views/Account/Register.cshtml b/Web/Views/Account/Register.cshtml index 0937e1a..53a132e 100644 --- a/Web/Views/Account/Register.cshtml +++ b/Web/Views/Account/Register.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.RegisterModel +@model MileageTraker.Web.ViewModels.Account.RegisterModel @{ ViewBag.Title = "Register"; } @@ -10,7 +10,7 @@ @using (Html.BeginForm()) { @Html.AntiForgeryToken() - @Html.ValidationSummary() + @Html.Partial("_ValidationSummary")
Registration Form diff --git a/Web/Views/Account/_ChangePasswordPartial.cshtml b/Web/Views/Account/_ChangePasswordPartial.cshtml index f28e70f..2eb2abf 100644 --- a/Web/Views/Account/_ChangePasswordPartial.cshtml +++ b/Web/Views/Account/_ChangePasswordPartial.cshtml @@ -1,27 +1,13 @@ -@model MileageTraker.Web.ViewModels.ChangePasswordViewModel +@model MileageTraker.Web.ViewModels.Account.ChangePasswordViewModel

Change password

@using (Html.BeginForm("Manage", "Account")) { + @Html.Partial("_ValidationSummary") @Html.AntiForgeryToken() - @Html.ValidationSummary() -
- Change Password Form -
    -
  1. - @Html.LabelFor(m => m.OldPassword) - @Html.PasswordFor(m => m.OldPassword) -
  2. -
  3. - @Html.LabelFor(m => m.NewPassword) - @Html.PasswordFor(m => m.NewPassword) -
  4. -
  5. - @Html.LabelFor(m => m.ConfirmPassword) - @Html.PasswordFor(m => m.ConfirmPassword) -
  6. -
- + + @Html.EditorForModel() +
} diff --git a/Web/Views/Account/_SetPasswordPartial.cshtml b/Web/Views/Account/_SetPasswordPartial.cshtml deleted file mode 100644 index 6f1f78a..0000000 --- a/Web/Views/Account/_SetPasswordPartial.cshtml +++ /dev/null @@ -1,25 +0,0 @@ -@model MileageTraker.Web.ViewModels.ChangePasswordViewModel - -

- You do not have a password for this site. -

- -@using (Html.BeginForm("Manage", "Account")) { - @Html.AntiForgeryToken() - @Html.ValidationSummary() - -
- Set Password Form -
    -
  1. - @Html.LabelFor(m => m.NewPassword) - @Html.PasswordFor(m => m.NewPassword) -
  2. -
  3. - @Html.LabelFor(m => m.ConfirmPassword) - @Html.PasswordFor(m => m.ConfirmPassword) -
  4. -
- -
-} diff --git a/Web/Views/CreateLog/Confirm.cshtml b/Web/Views/CreateLog/Confirm.cshtml index a167090..94c2fc2 100644 --- a/Web/Views/CreateLog/Confirm.cshtml +++ b/Web/Views/CreateLog/Confirm.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.ConfirmCreateLogViewModel +@model MileageTraker.Web.ViewModels.CreateLog.ConfirmCreateLogViewModel @{ ViewBag.Title = "Confirm"; diff --git a/Web/Views/CreateLog/Index.cshtml b/Web/Views/CreateLog/Index.cshtml index 48befc3..31978fd 100644 --- a/Web/Views/CreateLog/Index.cshtml +++ b/Web/Views/CreateLog/Index.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.CreateLogViewModel +@model MileageTraker.Web.ViewModels.CreateLog.CreateLogViewModel @{ ViewBag.Title = "Enter Mileage Log"; @@ -19,7 +19,7 @@ {
@ViewBag.Title - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary") @Html.EditorForModel()
diff --git a/Web/Views/CreateLog/Success.cshtml b/Web/Views/CreateLog/Success.cshtml index e7d3306..9f3613a 100644 --- a/Web/Views/CreateLog/Success.cshtml +++ b/Web/Views/CreateLog/Success.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.CreateLogViewModel +@model MileageTraker.Web.ViewModels.CreateLog.CreateLogViewModel @{ ViewBag.Title = "Success"; diff --git a/Web/Views/Log/Create.cshtml b/Web/Views/Log/Create.cshtml index 0c77c66..f6f56ec 100644 --- a/Web/Views/Log/Create.cshtml +++ b/Web/Views/Log/Create.cshtml @@ -19,9 +19,9 @@

@ViewBag.Title

@using (Html.BeginForm("Create", "Log", FormMethod.Post, new { @class = "form-horizontal" })) { - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary")
- Log + @Html.EditorForModel()
diff --git a/Web/Views/Log/DetailsPartial.cshtml b/Web/Views/Log/DetailsPartial.cshtml index ed5abf9..122ad2b 100644 --- a/Web/Views/Log/DetailsPartial.cshtml +++ b/Web/Views/Log/DetailsPartial.cshtml @@ -1,5 +1,4 @@ -@using MileageTraker.Web.ViewModels -@model LogPartialDetails +@model MileageTraker.Web.ViewModels.Log.LogPartialDetails @{ Layout = null; } diff --git a/Web/Views/Log/Edit.cshtml b/Web/Views/Log/Edit.cshtml index d4d8f7f..8b67996 100644 --- a/Web/Views/Log/Edit.cshtml +++ b/Web/Views/Log/Edit.cshtml @@ -20,9 +20,9 @@ @using (Html.BeginForm("Edit", "Log", FormMethod.Post, new { @class = "form-horizontal" })) { - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary")
- + @Html.EditorForModel() diff --git a/Web/Views/Log/Index.cshtml b/Web/Views/Log/Index.cshtml index 90ab4f4..52c4153 100644 --- a/Web/Views/Log/Index.cshtml +++ b/Web/Views/Log/Index.cshtml @@ -1,6 +1,6 @@ @using MileageTraker.Web.Utility @using MileageTraker.Web.ViewModels -@model LogResultsViewModel +@model MileageTraker.Web.ViewModels.Log.LogResultsViewModel @{ ViewBag.Title = "Logs"; diff --git a/Web/Views/Log/MonthlyVehicleMileage.cshtml b/Web/Views/Log/MonthlyVehicleMileage.cshtml index 3792103..b9891c7 100644 --- a/Web/Views/Log/MonthlyVehicleMileage.cshtml +++ b/Web/Views/Log/MonthlyVehicleMileage.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.VehicleMileageViewModel +@model MileageTraker.Web.ViewModels.Vehicle.VehicleMileageViewModel @{ ViewBag.Title = "Vehicle Mileage Report"; } diff --git a/Web/Views/Shared/EditorTemplates/Boolean.cshtml b/Web/Views/Shared/EditorTemplates/Boolean.cshtml index 15f65c1..37c2657 100644 --- a/Web/Views/Shared/EditorTemplates/Boolean.cshtml +++ b/Web/Views/Shared/EditorTemplates/Boolean.cshtml @@ -1,4 +1,7 @@ -
diff --git a/Web/Views/Shared/_Layout.authentication.cshtml.cshtml b/Web/Views/Shared/_Layout.authentication.cshtml similarity index 88% rename from Web/Views/Shared/_Layout.authentication.cshtml.cshtml rename to Web/Views/Shared/_Layout.authentication.cshtml index 91655d3..c98dca3 100644 --- a/Web/Views/Shared/_Layout.authentication.cshtml.cshtml +++ b/Web/Views/Shared/_Layout.authentication.cshtml @@ -6,7 +6,7 @@
  • @using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "form-logout" })) { @Html.AntiForgeryToken() - } diff --git a/Web/Views/Shared/_Layout.login.cshtml b/Web/Views/Shared/_Layout.login.cshtml index 5b6a01d..9322e29 100644 --- a/Web/Views/Shared/_Layout.login.cshtml +++ b/Web/Views/Shared/_Layout.login.cshtml @@ -10,7 +10,6 @@ -
    @RenderBody()
    diff --git a/Web/Views/Shared/_ValidationSummary.cshtml b/Web/Views/Shared/_ValidationSummary.cshtml new file mode 100644 index 0000000..2fc18e7 --- /dev/null +++ b/Web/Views/Shared/_ValidationSummary.cshtml @@ -0,0 +1,7 @@ +@if (ViewData.ModelState[""] != null && ViewData.ModelState[""].Errors.Any()) +{ +
    + × + @Html.ValidationSummary(true) +
    +} \ No newline at end of file diff --git a/Web/Views/Vehicle/Create.cshtml b/Web/Views/Vehicle/Create.cshtml index 4d3e44d..f863362 100644 --- a/Web/Views/Vehicle/Create.cshtml +++ b/Web/Views/Vehicle/Create.cshtml @@ -20,8 +20,9 @@ @using (Html.BeginForm("Create", "Vehicle", FormMethod.Post, new { @class = "form-horizontal" })) { - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary")
    + @Html.EditorForModel()
    diff --git a/Web/Views/Vehicle/DetailsPartial.cshtml b/Web/Views/Vehicle/DetailsPartial.cshtml index cda801d..67279f9 100644 --- a/Web/Views/Vehicle/DetailsPartial.cshtml +++ b/Web/Views/Vehicle/DetailsPartial.cshtml @@ -1,4 +1,4 @@ -@model MileageTraker.Web.ViewModels.VehiclePartialDetails +@model MileageTraker.Web.ViewModels.Vehicle.VehiclePartialDetails @{ Layout = null; } diff --git a/Web/Views/Vehicle/Edit.cshtml b/Web/Views/Vehicle/Edit.cshtml index 728c883..f206ff0 100644 --- a/Web/Views/Vehicle/Edit.cshtml +++ b/Web/Views/Vehicle/Edit.cshtml @@ -20,9 +20,9 @@ @using (Html.BeginForm("Edit", "Vehicle", FormMethod.Post, new { @class = "form-horizontal" })) { - @Html.ValidationSummary(true) + @Html.Partial("_ValidationSummary")
    - + @Html.EditorForModel()
    diff --git a/Web/Web.csproj b/Web/Web.csproj index 5eb39e7..56b30cc 100644 --- a/Web/Web.csproj +++ b/Web/Web.csproj @@ -133,14 +133,16 @@ - + + + - - - - - + + + + + @@ -162,14 +164,15 @@ - - + + - - + + + @@ -181,6 +184,7 @@ + @@ -248,11 +252,11 @@ - - + +