diff --git a/Sevomin.Models/Enums/MuSCoW.cs b/Sevomin.Models/Enums/MuSCoW.cs new file mode 100644 index 0000000..ab4d9ac --- /dev/null +++ b/Sevomin.Models/Enums/MuSCoW.cs @@ -0,0 +1,19 @@ +using Sevomin.Models.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sevomin.Models.Enums +{ + public enum MuSCoW + { + [StringValue("الزامی")] + Must = 4, + [StringValue("خیلی مهم")] + Should = 3, + [StringValue("مفید")] + Could = 2 + } +} diff --git a/Sevomin.Models/Enums/ResumeTypes.cs b/Sevomin.Models/Enums/ResumeTypes.cs new file mode 100644 index 0000000..a8a5843 --- /dev/null +++ b/Sevomin.Models/Enums/ResumeTypes.cs @@ -0,0 +1,19 @@ +using Sevomin.Models.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Sevomin.Models.Enums +{ + public enum ResumeTypes + { + [StringValue("انگلیسی")] + English = 2, + [StringValue("فارسی")] + Persian = 1, + [StringValue("تفاوت ندارد")] + Any = 0 + } +} diff --git a/Sevomin.Models/Helpers/Make Use Of Enums (They are pretty useless without this file!).cs b/Sevomin.Models/Helpers/Make Use Of Enums (They are pretty useless without this file!).cs new file mode 100644 index 0000000..31b9193 --- /dev/null +++ b/Sevomin.Models/Helpers/Make Use Of Enums (They are pretty useless without this file!).cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Web.Mvc; + +namespace Sevomin.Models.Helpers +{ + public class StringValue : System.Attribute + { + private string _value; + + public StringValue(string value) + { + _value = value; + } + + public string Value + { + get { return _value; } + } + + } + + public static class StringEnum + { + public static SelectList GetSelectList(Type inputEnum, bool textAsValue) + { + List retList = new List(); + if (inputEnum.IsEnum) + { + foreach (Enum property in Enum.GetValues(inputEnum)) + { + retList.Add(new SelectListItem + { + Text = GetStringValue(property), + Value = Convert.ToInt16(inputEnum.GetField(property.ToString()).GetValue(null)).ToString() //textAsValue ? GetStringValue(property) : property.ToString() + }); + } + + return new SelectList(retList, "Value", "Text"); + } + else + throw new InvalidOperationException("The input type is not an enum."); + } + + public static string GetStringValue(Enum value) + { + Type type = value.GetType(); + + //Check first in our cached results... + //Look for our 'StringValueAttribute' + //in the field's custom attributes + FieldInfo fi = type.GetField(value.ToString()); + StringValue[] attrs = + fi.GetCustomAttributes(typeof(StringValue), + true) as StringValue[]; + foreach (var item in attrs) + { + if (!string.IsNullOrEmpty(item.Value)) + return item.Value; + } + + return string.Empty; + } + } +} diff --git a/Sevomin.Models/JobMiniViewModel.cs b/Sevomin.Models/JobMiniViewModel.cs index b7f0420..6a46c22 100644 --- a/Sevomin.Models/JobMiniViewModel.cs +++ b/Sevomin.Models/JobMiniViewModel.cs @@ -13,7 +13,7 @@ namespace Sevomin.Models public class JobMiniViewModel { - private const int MaxNumberOfMiniParams = 6; + private int MaxNumberOfMiniParams = 6; [Key] public long Id { get; set; } @@ -21,11 +21,11 @@ namespace Sevomin.Models [StringLength(128)] public string AvalinId { get; set; } - [DisplayName("تاریخ انقضا")] + [DisplayName("آخرین مهلت اعلام آمادگی")] [DataType(DataType.Date)] public DateTime ExpireDate { get; set; } - [DisplayName("تاریخ انقضا")] + [DisplayName("آخرین مهلت اعلام آمادگی")] [DataType(DataType.Date)] public string JalaliExpireDate { @@ -42,15 +42,27 @@ namespace Sevomin.Models [DisplayName("کار تمام وقت")] public bool IsFullTime { get; set; } + public bool ShowCompanyLogo { get; set; } + public bool ShowCompanyName { get; set; } + + public string CompanyName { get; set; } + public string CompanyLogo { get; set; } + public IList> Parameters; - public JobMiniViewModel(Job job) + public JobMiniViewModel(Job job, int maxNumberOfMiniParams = 6) { + this.MaxNumberOfMiniParams = maxNumberOfMiniParams; this.Id = job.Id; this.AvalinId = job.AvalinId; this.ExpireDate = job.ExpireDate == DateTime.MinValue ? DateTime.Now.AddDays(14) : job.ExpireDate; this.IsFullTime = job.IsFullTime; + this.ShowCompanyLogo = job.ShowCompanyLogo; + this.ShowCompanyName = job.ShowCompanyName; + if (this.ShowCompanyName) + this.CompanyName = job.Avalin.DisplayName; + if (job.JobParameters == null) return; @@ -67,7 +79,6 @@ namespace Sevomin.Models string value = jpz[i].StringValue; if (jpz[i].Parameter.DisplayMethod == 4) { - value = jpz[i].Parameter.ParameterValues.ToList().Where(x =>x.NumbericValue == jpz[i].NumericValue).Select(x => x.Value) .FirstOrDefault(); } diff --git a/Sevomin.Models/JobParameterViewModel.cs b/Sevomin.Models/JobParameterViewModel.cs index ba13a92..18d319f 100644 --- a/Sevomin.Models/JobParameterViewModel.cs +++ b/Sevomin.Models/JobParameterViewModel.cs @@ -20,6 +20,7 @@ namespace Sevomin.Models public string ParameterName { get; set; } public bool HasMoscow { get; set; } public byte DisplayMethod { get; set; } + public string DisplayFormat { get; set; } public string GroupName { get; set; } public string CommentAvalin { get; set; } @@ -40,6 +41,7 @@ namespace Sevomin.Models ParameterName = jp.Parameter.Name; HasMoscow = jp.Parameter.Moscow; DisplayMethod = jp.Parameter.DisplayMethod; + DisplayFormat = jp.Parameter.DisplayFormat; GroupName = jp.Parameter.GroupName; CommentAvalin = jp.Parameter.CommentAvalin; @@ -52,4 +54,4 @@ namespace Sevomin.Models } } } -} +} \ No newline at end of file diff --git a/Sevomin.Models/Sevomin.Models.csproj b/Sevomin.Models/Sevomin.Models.csproj index 8e01228..d26eca6 100644 --- a/Sevomin.Models/Sevomin.Models.csproj +++ b/Sevomin.Models/Sevomin.Models.csproj @@ -67,8 +67,11 @@ + + + diff --git a/Sevomin.WebFrontend.Controllers/JobController.cs b/Sevomin.WebFrontend.Controllers/JobController.cs index 94513ac..c544a45 100644 --- a/Sevomin.WebFrontend.Controllers/JobController.cs +++ b/Sevomin.WebFrontend.Controllers/JobController.cs @@ -10,13 +10,13 @@ using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Sevomin.Models.Helpers; using System.Web; +using Sevomin.Models.Enums; namespace Sevomin.WebFrontend.Controllers { public class JobController : AuthorizedController { - IJobRepository _JobRepository; - public SevominUserManager UserManager { get; private set; } + IJobRepository _JobRepository; private HttpContextBase _httpContext; public JobController() @@ -31,10 +31,9 @@ namespace Sevomin.WebFrontend.Controllers _httpContext = requestContext.HttpContext; } - public JobController(IJobRepository jobRepository, SevominUserManager userManager, HttpContextBase httpContext) + public JobController(IJobRepository jobRepository, SevominUserManager userManager, HttpContextBase httpContext) : base(userManager) { - _JobRepository = jobRepository; - UserManager = userManager; + _JobRepository = jobRepository; _httpContext = httpContext; } @@ -60,14 +59,14 @@ namespace Sevomin.WebFrontend.Controllers [HttpPost] public async Task NewJob(string JalaliExpireDate, string ContactPersonName, string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime, - bool ShowCompanyName, string Description, bool ShowCompanyLogo, FormCollection form) + bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form) { Job job = await GetEmptyJob(); try { UpdateFields(JalaliExpireDate, ContactPersonName, ContactPersonPhone, ContactPersonEMail, IsFullTime, ShowCompanyName, - Description, ShowCompanyLogo, form, job); + Description, ShowCompanyLogo, ResumeType, form, job); JobRepository.Current.Save(); } catch (Exception) @@ -100,14 +99,14 @@ namespace Sevomin.WebFrontend.Controllers [HttpPost] public async Task Edit(long id, string JalaliExpireDate, string ContactPersonName, string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime, - bool ShowCompanyName, string Description, bool ShowCompanyLogo, FormCollection form) + bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form) { Job job = await FetchJob(id); try { UpdateFields(JalaliExpireDate, ContactPersonName, ContactPersonPhone, ContactPersonEMail, IsFullTime, ShowCompanyName, - Description, ShowCompanyLogo, form, job); + Description, ShowCompanyLogo, ResumeType, form, job); JobRepository.Current.Save(); } catch (Exception) @@ -127,9 +126,27 @@ namespace Sevomin.WebFrontend.Controllers .ToList() .Select(j => new JobMiniViewModel(j)).ToList()); } + + public ActionResult SingleJob(long jobId) + { + Job job = _JobRepository.Find(jobId); + if (job == null) + return HttpNotFound(); + + JobViewModel viewModel = new JobViewModel(job); + JobMiniViewModel jvm = new JobMiniViewModel(job, 3); + StringBuilder sb = new StringBuilder("کارشناس برنامه ریزی و کنترل پروژه "); + foreach (var param in jvm.Parameters) + sb.Append(string.Format(param.Item1 + " ", param.Item2)); + + ViewBag.ShortJobDescription = sb.ToString(); + + return View(viewModel); + } + - private static void UpdateFields(string JalaliExpireDate, string ContactPersonName, string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime, bool ShowCompanyName, string Description, bool ShowCompanyLogo, FormCollection form, Job job) + private static void UpdateFields(string JalaliExpireDate, string ContactPersonName, string ContactPersonPhone, string ContactPersonEMail, bool IsFullTime, bool ShowCompanyName, string Description, bool ShowCompanyLogo, ResumeTypes ResumeType, FormCollection form, Job job) { job.ExpireDate = DateAssist.ToMiladi(JalaliExpireDate); job.ContactPersonEMail = ContactPersonEMail; @@ -139,6 +156,7 @@ namespace Sevomin.WebFrontend.Controllers job.IsFullTime = IsFullTime; job.ShowCompanyLogo = ShowCompanyLogo; job.ShowCompanyName = ShowCompanyName; + job.ResumeType = (byte)ResumeType; foreach (var jp in job.JobParameters) { string value = form[string.Format("value-{0}", jp.Parameter.Id)]; diff --git a/Sevomin.WebFrontend/App_Start/RouteConfig.cs b/Sevomin.WebFrontend/App_Start/RouteConfig.cs index 1d3b6ba..a87dfba 100644 --- a/Sevomin.WebFrontend/App_Start/RouteConfig.cs +++ b/Sevomin.WebFrontend/App_Start/RouteConfig.cs @@ -56,6 +56,12 @@ namespace Sevomin.WebFrontend url: "jobs/new-job", defaults: new { controller = "Job", action = "NewJob" } ); + + routes.MapRoute( + name: "SingleJob", + url: "jobs/{jobId}", + defaults: new { controller = "Job", action = "SingleJob" } + ); #endregion routes.MapRoute( diff --git a/Sevomin.WebFrontend/Content/common.css b/Sevomin.WebFrontend/Content/common.css index 5edb24b..8522d99 100644 --- a/Sevomin.WebFrontend/Content/common.css +++ b/Sevomin.WebFrontend/Content/common.css @@ -16,24 +16,27 @@ body{ padding: 60px; } -.h1, .h2, .h3, .h4, .h5, .h6{ - font-family: Koodak, "Helvetica Neue",Helvetica,Arial,sans-serif; +h1, h2, h3, h4, h5, h6{ + font-family: Koodak, "Helvetica Neue",Helvetica,Arial,sans-serif; } .rtl{ - direction: rtl; - text-align: right; + direction: rtl !important; + text-align: right !important; } .ltr{ - direction: ltr; - text-align: left; + direction: ltr !important; + text-align: left !important; +} + +th{ + text-align: right; } .navbar{ height: 30px; - background: #5B9BD5; - height: 30px; + background: #5B9BD5; border-radius: 0px !important; } @@ -52,4 +55,23 @@ body{ .navbar-brand img{ height: 25px; +} + +.job-list-top-toolbar, .job-list-bottom-toolbar{ + text-align: left !important; +} + +.job-list-top-toolbar{ + border-bottom: 1px solid #E0E0E0; + padding: 0px 10px 10px 0px; + margin-bottom: 5px; +} + +.job-list-bottom-toolbar{ + border-top: 1px solid #E0E0E0; + padding: 10px 10px 0px 0px; +} + +.job-list-bottom-toolbar .date{ + float: right; } \ No newline at end of file diff --git a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj index 56b45e9..d4f590c 100644 --- a/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj +++ b/Sevomin.WebFrontend/Sevomin.WebFrontend.csproj @@ -259,6 +259,7 @@ + Web.config @@ -277,6 +278,7 @@ + diff --git a/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml b/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml index a8a5666..305edf1 100644 --- a/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobEditor.cshtml @@ -10,6 +10,12 @@
مشخصات اصلی آگهی
+
+ @Html.LabelFor(model => model.ResumeType) + @Html.DropDownListFor(model => model.ResumeType, + Sevomin.Models.Helpers.StringEnum.GetSelectList(typeof(Sevomin.Models.Enums.ResumeTypes), false), + new { @class = "form-control" }) +
-
+
diff --git a/Sevomin.WebFrontend/Views/Job/JobList.cshtml b/Sevomin.WebFrontend/Views/Job/JobList.cshtml index 47d6095..ac17853 100644 --- a/Sevomin.WebFrontend/Views/Job/JobList.cshtml +++ b/Sevomin.WebFrontend/Views/Job/JobList.cshtml @@ -1,17 +1,27 @@ @model IList
- @foreach (var job in Model) - { -
-
-

کارشناس برنامه ریزی و کنترل پروژه +

+ @foreach (var job in Model) + { +
+
+ +

+ کارشناس برنامه ریزی و کنترل پروژه @foreach (var param in job.Parameters) - { + { @MvcHtmlString.Create(string.Format(param.Item1, param.Item2) + " ") - } -

+ } +

+
+ آخرین مهلت اعلام آمادگی: @job.JalaliExpireDate + اعلام آمادگی +
+
-
- } -
\ No newline at end of file + } + +
diff --git a/Sevomin.WebFrontend/Views/Job/NewJob.cshtml b/Sevomin.WebFrontend/Views/Job/NewJob.cshtml index 0f2ef55..1e22818 100644 --- a/Sevomin.WebFrontend/Views/Job/NewJob.cshtml +++ b/Sevomin.WebFrontend/Views/Job/NewJob.cshtml @@ -1,5 +1,4 @@ - -@{ +@{ ViewBag.Title = "انتشار آگهی جدید"; } diff --git a/Sevomin.WebFrontend/Views/Job/SingleJob.cshtml b/Sevomin.WebFrontend/Views/Job/SingleJob.cshtml new file mode 100644 index 0000000..d2594b2 --- /dev/null +++ b/Sevomin.WebFrontend/Views/Job/SingleJob.cshtml @@ -0,0 +1,57 @@ +@model Sevomin.Models.JobViewModel + +@{ + ViewBag.Title = string.Format("{0} {1}", "جزییات آگهی جذب نیروی برنامه ریزی پروژه", ViewBag.ShortJobDescription); +} + +
+
+

جذب نیروی برنامه ریزی پروژه

+

@ViewBag.ShortJobDescription

+ +
+

+ اعلام آمادگی +

+ + + + + + + + + + + + + + + + + +
@Html.DisplayNameFor(m => m.JalaliCreateDate)@Html.DisplayNameFor(m => m.JalaliExpireDate)@Html.DisplayNameFor(m => m.ResumeType)@Html.DisplayNameFor(m => m.IsFullTime)
@Html.DisplayFor(m => m.JalaliCreateDate)@Html.DisplayFor(m => m.JalaliExpireDate)@Sevomin.Models.Helpers.StringEnum.GetStringValue((Sevomin.Models.Enums.ResumeTypes)Model.ResumeType)@(Model.IsFullTime ? "بله" : "خیر")
+ + + + + + + + + @foreach (var param in Model.Parameters) + { + if (!string.IsNullOrWhiteSpace(param.StringValue)) + { + + + + + + } + } + +
ویژگیمیزان اهمیت
@param.ParameterName@(param.DisplayMethod == 4 ? param.ParameterValues.FirstOrDefault(v => v.Item1.ToString() == param.StringValue).Item2 : param.StringValue)@Sevomin.Models.Helpers.StringEnum.GetStringValue((Sevomin.Models.Enums.MuSCoW)param.MoscowValue)
+
+
+
diff --git a/Sevomin.WebFrontend/Views/Shared/JobParameterViewModel.cshtml b/Sevomin.WebFrontend/Views/Shared/JobParameterViewModel.cshtml index ea2e950..97bb37a 100644 --- a/Sevomin.WebFrontend/Views/Shared/JobParameterViewModel.cshtml +++ b/Sevomin.WebFrontend/Views/Shared/JobParameterViewModel.cshtml @@ -1,7 +1,7 @@ @model Sevomin.Models.JobParameterViewModel @{ string paramId = string.Format("value-{0}", Model.ParameterId.ToString()); string muscowId = string.Format("moscow-{0}", Model.ParameterId.ToString()); - var MuSCoWList = new List>() { new Tuple("الزامی", "4"), new Tuple("خیلی مهم", "3"), new Tuple("مفید", "2") }; } + var MuSCoWList = Sevomin.Models.Helpers.StringEnum.GetSelectList(typeof(Sevomin.Models.Enums.MuSCoW), false); }
@@ -34,7 +34,7 @@
@if (Model.HasMoscow) { - @Html.DropDownList(muscowId, new SelectList(MuSCoWList, "item2", "item1", string.IsNullOrWhiteSpace(Model.StringValue) ? "2" : Model.StringValue), new { @class = "form-control" }) + @Html.DropDownList(muscowId, new SelectList(MuSCoWList, "Value", "Text", Model.MoscowValue == 0 ? 2 : Model.MoscowValue), new { @class = "form-control" }) }