284 lines
14 KiB
Plaintext
284 lines
14 KiB
Plaintext
@using EnVisage.Code
|
|
@using EnVisage.Code.HtmlHelpers
|
|
@model EnVisage.Models.VacationModel
|
|
@{
|
|
ViewBag.Title = (Model != null && !Guid.Empty.Equals(Model.Id) ? "Edit " : "Add ") + " Vacation";
|
|
var weekEndsStr = string.Empty;
|
|
foreach (var dateTime in Model.Weekends)
|
|
{
|
|
if (!string.IsNullOrEmpty(weekEndsStr))
|
|
{
|
|
weekEndsStr += ",";
|
|
}
|
|
weekEndsStr += "'" + dateTime.ToShortDateString() + "'";
|
|
}
|
|
}
|
|
@section Scripts
|
|
{
|
|
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/URIjs.min.js")" type="text/javascript"></script>
|
|
<script type="text/javascript">
|
|
var datePickerOptions = {
|
|
format: 'm/d/yyyy',
|
|
autoclose: true,
|
|
startDate: '@(Constants.MIN_SELECTABLE_DATE)', // SA. ENV-1235
|
|
endDate: '@(Constants.MAX_SELECTABLE_DATE)' // SA. ENV-1235
|
|
};
|
|
|
|
emulateNavUrl = "/PeopleResource/Details?@Model.PeopleResourceId";
|
|
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
var multik;
|
|
init.push(function() {
|
|
@if (!Guid.Empty.Equals(Model.Id))
|
|
{
|
|
@:StartEdit('Vacations', '@Model.Id', "#btnDelete", "#btnsave", "erorMsgPlaceholder");
|
|
}
|
|
$('#bs-datepicker-range').datepicker(datePickerOptions).on('changeDate', function (evt) {
|
|
if (evt.target.id == 'StartDate') {
|
|
var _tmpValue = $('#StartDate').val();
|
|
var _sDate = new Date(_tmpValue);
|
|
$('#EndDate').data('datepicker').setStartDate(_sDate);
|
|
}
|
|
});
|
|
$('#bs-datepicker-range span.input-group-addon').hide();
|
|
|
|
$('#@Html.ClientIdFor(model => model.StartDate)').change(onDateChange);
|
|
$('#@Html.ClientIdFor(model => model.EndDate)').change(onDateChange);
|
|
var slider = $('#@Html.ClientIdFor(model => model.HoursOff)_container').slider({
|
|
'range': 'min',
|
|
'min': 0,
|
|
'max': 100,
|
|
'value': $('#@Html.ClientIdFor(model => model.HoursOff)_container .sliderValue').val(),
|
|
change: onDependentChange,
|
|
slide: onDependentSlide
|
|
});
|
|
multik = $("#@Html.ClientIdFor(model => model.Weekends)").select2({
|
|
placeholder: "Select weekends",
|
|
onSelect: function(a, b) {
|
|
}
|
|
}).on('change', updateSliderTitle);
|
|
var weekEnds = [@Html.Raw(weekEndsStr)];
|
|
fillWeekDays(weekEnds);
|
|
updateSliderTitle();
|
|
|
|
$('#btnsave').click(function () {
|
|
if ($(this).parents('form').valid())
|
|
blockUI();
|
|
});
|
|
if (URI().query(true).viewId)
|
|
$("#@Html.ClientIdFor(model => model.ParentViewId)").val(URI().query(true).viewId)
|
|
});
|
|
function onDateChange(ctrl, e) {
|
|
var sd = new Date($('#@Html.ClientIdFor(model => model.StartDate)').val());
|
|
var ed = new Date($('#@Html.ClientIdFor(model => model.EndDate)').val());
|
|
$('#@Html.ClientIdFor(model => model.Duration)').val(Math.round((ed - sd) / (1000 * 60 * 60 * 24)) + 1);
|
|
updateSliderTitle();
|
|
fillWeekDays();
|
|
}
|
|
function onDependentSlide(event, ui) {
|
|
var value = ui.value;
|
|
$(this).children(".sliderValue").val(value);
|
|
$(this).children(".sliderTitle").html(value + '%' + getSliderTitle(value));
|
|
}
|
|
function onDependentChange(event, ui) {
|
|
var value = ui.value;
|
|
$(this).children(".sliderValue").val(value);
|
|
$(this).children(".sliderTitle").html(value + '%' + getSliderTitle(value));
|
|
}
|
|
function updateSliderTitle() {
|
|
var txt = getSliderTitle($('#@Html.ClientIdFor(model => model.HoursOff)_container .sliderValue').val());
|
|
$('#@Html.ClientIdFor(model => model.HoursOff)_container').children('.sliderTitle').html($('#@Html.ClientIdFor(model => model.HoursOff)_container .sliderValue').val() + '%' + txt);
|
|
}
|
|
function getSliderTitle(value) {
|
|
var uomValue = parseInt($('#@Html.ClientIdFor(model => model.UOMValue)').val());
|
|
if (isNaN(uomValue))
|
|
uomValue = 0;
|
|
var sd = new Date($('#@Html.ClientIdFor(model => model.StartDate)').val());
|
|
var ed = new Date($('#@Html.ClientIdFor(model => model.EndDate)').val());
|
|
var selectedWeekends = multik.select2('val');
|
|
var weekEndingDay = parseInt($('#@Html.ClientIdFor(model => model.WeekendingDay)').val());
|
|
if (isNaN(sd))
|
|
return '';
|
|
if (isNaN(ed))
|
|
return '';
|
|
var weekEndingDate = new Date(sd);
|
|
if (weekEndingDate.getDay() != weekEndingDay) {
|
|
weekEndingDate = addDays(weekEndingDate, Math.abs(weekEndingDate.getDay() - weekEndingDay));
|
|
}
|
|
var rangeEndDate = new Date(ed);
|
|
if (rangeEndDate.getDay() != weekEndingDay) {
|
|
rangeEndDate = addDays(rangeEndDate, Math.abs(rangeEndDate.getDay() - weekEndingDay));
|
|
}
|
|
var dt = new Date(addDays(weekEndingDate, -6));
|
|
var hours = 0;
|
|
var businessDays = 0;
|
|
var wkEndDts = 0;
|
|
while (dt <= rangeEndDate) {
|
|
if (dt > weekEndingDate) {
|
|
hours += Math.round(businessDays * uomValue * value / ((7 - wkEndDts) * 100));
|
|
weekEndingDate = addDays(weekEndingDate, 7);
|
|
businessDays = 0;
|
|
wkEndDts = 0;
|
|
}
|
|
if (sd <= dt && dt <= ed)
|
|
businessDays++;
|
|
for (var i = 0; i < selectedWeekends.length; i++) {
|
|
if ((dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear() == selectedWeekends[i]) {
|
|
wkEndDts++;
|
|
if (sd <= dt && dt <= ed)
|
|
businessDays--;
|
|
break;
|
|
}
|
|
}
|
|
dt = addDays(dt, 1);
|
|
}
|
|
if (wkEndDts != 7)
|
|
hours += Math.round(businessDays * uomValue * value / ((7 - wkEndDts) * 100));
|
|
if (isNaN(hours))
|
|
hours = 0;
|
|
return ' (' + hours + ' hours)';
|
|
}
|
|
function fillWeekDays(preselected) {
|
|
var selected = [];
|
|
if (preselected != null)
|
|
selected = preselected;
|
|
else {
|
|
$('#@Html.ClientIdFor(model => model.Weekends) :selected').each(function(ind, s){
|
|
selected[ind] = $(s).val();
|
|
});
|
|
}
|
|
multik.select2('val', '');
|
|
$('#@Html.ClientIdFor(model => model.Weekends) optgroup').remove();
|
|
|
|
var sd = new Date($('#@Html.ClientIdFor(model => model.StartDate)').val());
|
|
var ed = new Date($('#@Html.ClientIdFor(model => model.EndDate)').val());
|
|
var weekEndingDay = parseInt($('#@Html.ClientIdFor(model => model.WeekendingDay)').val());
|
|
|
|
if (isNaN(sd))
|
|
return;
|
|
if (isNaN(ed))
|
|
return;
|
|
var weekEndingDate = new Date(sd);
|
|
if (weekEndingDate.getDay() != weekEndingDay) {
|
|
//debugger;
|
|
if (weekEndingDate.getDay() > weekEndingDay) {
|
|
weekEndingDate = addDays(weekEndingDate, weekEndingDay - weekEndingDate.getDay());
|
|
} else {
|
|
weekEndingDate = addDays(weekEndingDate, - weekEndingDate.getDay() - (7 - weekEndingDay));
|
|
}
|
|
weekEndingDate = addDays(weekEndingDate, 7);
|
|
}
|
|
if (ed.getDay() != weekEndingDay) {
|
|
ed = addDays(ed, Math.abs(ed.getDay() - weekEndingDay));
|
|
}
|
|
var dt = new Date(addDays(weekEndingDate, -6));
|
|
var optgroup = $('<optgroup>');
|
|
optgroup.attr('label', 'Week ' + (weekEndingDate.getMonth() + 1) + '/' + weekEndingDate.getDate() + '/' + weekEndingDate.getFullYear());
|
|
while (dt <= ed) {
|
|
if (dt > weekEndingDate) {
|
|
weekEndingDate = addDays(weekEndingDate, 7);
|
|
multik.append(optgroup);
|
|
optgroup = $('<optgroup>');
|
|
optgroup.attr('label', 'Week ' + (weekEndingDate.getMonth() + 1) + '/' + weekEndingDate.getDate() + '/' + weekEndingDate.getFullYear());
|
|
}
|
|
var option = $("<option></option>");
|
|
option.val((dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear());
|
|
option.text(days[dt.getDay()] + ', ' + (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear());
|
|
optgroup.append(option);
|
|
dt = addDays(dt, 1);
|
|
}
|
|
multik.append(optgroup);
|
|
multik.select2('val', selected);
|
|
}
|
|
function addDays(date, days) {
|
|
return new Date(date.getTime() + days*24*60*60*1000);
|
|
}
|
|
</script>
|
|
}
|
|
<div class="page-header"><h1>@ViewBag.Title</h1></div>
|
|
<div id="erorMsgPlaceholder"></div>
|
|
@using (Html.BeginForm("EditVacation", "PeopleResource", FormMethod.Post, new { @class = "panel form-horizontal" }))
|
|
{
|
|
@Html.AntiForgeryToken()
|
|
@Html.HiddenFor(t => t.Id)
|
|
@Html.HiddenFor(t => t.PeopleResourceId)
|
|
@Html.HiddenFor(t=>t.UOMValue)
|
|
@Html.HiddenFor(t=>t.WeekendingDay)
|
|
@Html.HiddenFor(t=>t.ParentViewId)
|
|
<div class="panel-body row">
|
|
<div class="col-sm-4">
|
|
<div class="form-group">
|
|
<label class="control-label col-sm-3">Start/End Dates</label>
|
|
<div class="col-sm-9">
|
|
<div class="input-daterange input-group" id="bs-datepicker-range">
|
|
@Html.EditorFor(t => t.StartDate)
|
|
<div class="input-group-addon">to</div>
|
|
@Html.EditorFor(model => model.EndDate)
|
|
</div>
|
|
@Html.ValidationMessageFor(model => model.StartDate)
|
|
@Html.ValidationMessageFor(model => model.EndDate)
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
@* <div class="form-group no-margin-hr">
|
|
<label class="control-label">Scenario Dates</label>
|
|
<div class="input-daterange input-group" id="bs-datepicker-scenario-range">
|
|
@Html.EditorFor(t => t.StartDate)
|
|
<div class="input-group-addon">to</div>
|
|
@Html.EditorFor(model => model.EndDate)
|
|
</div>
|
|
<div>
|
|
<input type="hidden" name="@Html.NameFor(t=>t.StartDate).ToString()" class="hdn" value="@(Model.StartDate.HasValue ? Model.StartDate.Value.ToShortDateString() : string.Empty)"/>
|
|
<input type="hidden" name="@Html.NameFor(t=>t.EndDate).ToString()" class="hdn" value="@(Model.EndDate.HasValue ? Model.EndDate.Value.ToShortDateString() : string.Empty)"/>
|
|
</div>
|
|
@Html.ValidationMessageFor(model => model.StartDate)
|
|
@Html.ValidationMessageFor(model => model.EndDate)
|
|
@if (Model.ProjectDeadline != null)
|
|
{
|
|
<i>(Project Deadline: @Model.ProjectDeadline.Value.ToShortDateString())</i>
|
|
}
|
|
</div>
|
|
*@
|
|
|
|
|
|
<div class="form-group">
|
|
<label class="col-sm-3 control-label" for="Duration">Duration</label>
|
|
<div class="col-sm-9">
|
|
<div class="input-group">
|
|
<input class="form-control" id="Duration" name="Duration" type="number" disabled="disabled" value="@Model.Duration">
|
|
<span class="input-group-addon">days</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
@Html.LabelFor(model => model.HoursOff, new { @class = "col-sm-3 control-label" })
|
|
<div class="col-sm-9">
|
|
@Html.EditorFor(model => model.HoursOff)
|
|
@Html.ValidationMessageFor(model => model.HoursOff)
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
@Html.LabelFor(model => model.Weekends, new { @class = "col-sm-3 control-label" })
|
|
<div class="col-sm-9 select2-primary">
|
|
@Html.EditorFor(model => model.Weekends)
|
|
@Html.ValidationMessageFor(model => model.Weekends)
|
|
<p class="help-block text-sm">Make sure you select weekend days for the whole weeks but not only within vacation's date range.</p>
|
|
</div>
|
|
</div>
|
|
@Html.ValidationSummary(false, "The client could not be saved due to the following errors:")
|
|
<div class="form-group" style="margin-bottom: 0;">
|
|
<div class="col-sm-offset-2 col-sm-10">
|
|
<a class="btn btn-primary" href="@(Request.QueryString["viewId"] != null ? Url.Action("Details", "PeopleResource", new {peopleResourceId=Model.PeopleResourceId , viewId = Request.QueryString["viewId"]}) : Url.Action("Details", "PeopleResource", new {peopleResourceId=Model.PeopleResourceId}))"><i class="fa fa-backward"></i> Back to list</a>
|
|
<button type="submit" class="btn btn-success" id="btnsave"><i class="fa fa-save"></i> Save</button>
|
|
@if (Model != null && !Guid.Empty.Equals(Model.Id))
|
|
{
|
|
<a id="btnDelete" class="btn btn-danger" href="@(Request.QueryString["viewId"] != null ? Url.Action("DeleteVacation", "PeopleResource", new {@id = Model.Id, viewId = Request.QueryString["viewId"]}) : Url.Action("DeleteVacation", "PeopleResource", new {@id = Model.Id}))"><i class="fa fa-trash-o"></i> Delete</a>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
} |