354 lines
16 KiB
Plaintext
354 lines
16 KiB
Plaintext
@using EnVisage.Code
|
|
|
|
@model EnVisage.Models.ImportActualsModel
|
|
@{
|
|
ViewBag.Title = "Import Actuals";
|
|
}
|
|
@section Scripts
|
|
{
|
|
@Scripts.Render(String.Format("{0}/{1}", Constants.C_BUNDLE_SCRIPTS_BASE_PATH, "prevu-importactualspage"))
|
|
<script type="text/javascript">
|
|
// Structs and scalar values combined inside object to pass values to js-functions by ref
|
|
var slidersData = new Object();
|
|
slidersData.allocations = [];
|
|
slidersData.sliders = [];
|
|
slidersData.movableSliders = [];
|
|
slidersData.warnMessage = "By moving this slider, you will adjust previously set values for other parts.";
|
|
|
|
var first = true;
|
|
|
|
init.push(function() {
|
|
first = true;
|
|
$('#btnsave').click(function () {
|
|
if ($(this).parents('form').valid())
|
|
blockUI();
|
|
});
|
|
$('#uomHours').switcher({
|
|
on_state_content: '# Hours',
|
|
off_state_content: '# Resources'
|
|
});
|
|
$('#uomHours').parent().css("width", "93px");
|
|
|
|
$('#firstRowHeaders').switcher({
|
|
on_state_content: 'Yes',
|
|
off_state_content: 'No'
|
|
});
|
|
$('#firstRowHeaders').parent().css("width", "93px");
|
|
|
|
$('#resetActuals').switcher({
|
|
on_state_content: 'Yes',
|
|
off_state_content: 'No'
|
|
});
|
|
$('#resetActuals').parent().css("width", "93px");
|
|
@if(Model != null){
|
|
int i = 0; int j = 0;
|
|
foreach (var project in Model.Projects)
|
|
{
|
|
j = 0;
|
|
<text>
|
|
first = true;
|
|
slidersData.allocations['@i'] = {};
|
|
slidersData.sliders['@i'] = {};
|
|
slidersData.movableSliders['@i'] = {};
|
|
</text>
|
|
foreach (var part in project.ProjectParts)
|
|
{
|
|
<text>
|
|
var options@(i.ToString() + j.ToString()) = {
|
|
orientation: $('body').hasClass('right-to-left') ? "auto right" : 'auto auto',
|
|
startDate: '@Html.ValueFor(x => x.Projects[i].ProjectParts[j].StartDate)',
|
|
endDate: '@Html.ValueFor(x => x.Projects[i].ProjectParts[j].EndDate)'
|
|
};
|
|
$('#@Html.IdFor(x => x.Projects[i].ProjectParts[j].StartDate)').parent().datepicker(@("options" + i.ToString() + j.ToString()));
|
|
|
|
slidersData.allocations['@i']['@part.PartId.ToString()'] = (first) ? 100 : 0;
|
|
first = false;
|
|
</text>
|
|
j++;
|
|
}
|
|
<text>
|
|
first = true;
|
|
$('.ui-slider'+'@i').each(function (i, div) {
|
|
$(this).slider({
|
|
'range': 'min',
|
|
'min': 0,
|
|
'max': 100,
|
|
'value': (first) ? 100 : 0,
|
|
change: onDependentChange,
|
|
slide: onDependentSlide,
|
|
start: onSliderStarted,
|
|
stop: onSliderStopped
|
|
});
|
|
first = false;
|
|
});
|
|
first = true;
|
|
slidersData.sliders['@i'] = $('.ui-slider' + '@i');
|
|
slidersData.movableSliders['@i'] = slidersData.sliders['@i'];
|
|
</text>
|
|
i++;
|
|
}
|
|
}
|
|
|
|
$('[id^=Projects_].single-line').addClass('form-control date');
|
|
|
|
$('.projectclick').click(function (event) {
|
|
onProjectClicked(this);
|
|
});
|
|
$('.partclick').click(function (event) {
|
|
onPartClicked(this);
|
|
});
|
|
});
|
|
|
|
// Event handler for start moving slider event
|
|
function onSliderStarted(event, ui) {
|
|
registerSliderStartMovement(slidersData);
|
|
}
|
|
|
|
// Event handler for stop moving slider event
|
|
function onSliderStopped(event, ui) {
|
|
var index = ui.handle.parentElement.childNodes[1].id.split("_")[1];
|
|
slidersData.activeSliderId = ui.handle.parentElement.id.split("_")[0];
|
|
slidersData.activeIndex = index;
|
|
|
|
registerSliderStopMovement(slidersData);
|
|
}
|
|
|
|
function onDependentSlide(event, ui) {
|
|
var index = ui.handle.parentElement.childNodes[1].id.split("_")[1];
|
|
slidersData.activeSliderId = ui.handle.parentElement.id.split("_")[0];
|
|
slidersData.newActiveSliderValue = parseInt(ui.value);
|
|
slidersData.activeIndex = index;
|
|
recalculateDependentSliders(slidersData);
|
|
}
|
|
|
|
function onDependentChange(event, ui) {
|
|
var value = parseInt(ui.value);
|
|
showSliderValue(this, value);
|
|
}
|
|
|
|
function onPartClicked(ui) {
|
|
var id = $(ui).prev().attr('value');
|
|
var index = $(ui).attr('id').split('_')[1];
|
|
var partindex = $(ui).attr('id').split('_')[4];
|
|
if ($(ui).prop('checked')) {
|
|
$('.ui-slider' + index + partindex).show();
|
|
$('.ui-slider' + index + partindex).slider('enable');
|
|
$('[id^=Projects_' + index + '__ProjectParts_' + partindex + '].single-line').prop('disabled', false);
|
|
slidersData.sliders[index].push($('.ui-slider' + index + partindex)[0]);
|
|
slidersData.movableSliders[index].push($('.ui-slider' + index + partindex)[0]);
|
|
if ($('[id^=Projects_' + index + '].projectclick').prop('checked') == false)
|
|
$('[id^=Projects_' + index + '].projectclick').prop('checked', true);
|
|
}
|
|
else {
|
|
slidersData.sliders[index] = slidersData.sliders[index].not($('.ui-slider' + index + partindex));
|
|
slidersData.movableSliders[index] = slidersData.movableSliders[index].not($('.ui-slider' + index + partindex));
|
|
if ($('[id^=Projects_' + index + '].projectclick').prop('checked') == true)
|
|
{
|
|
var anychecked = false;
|
|
$('[id^=Projects_' + index + '].partclick').each(function (i, div) {
|
|
if ($(this).prop("checked")) anychecked = true;
|
|
});
|
|
if (!anychecked) $('[id^=Projects_' + index + '].projectclick').prop('checked', false);
|
|
}
|
|
// distributing among others
|
|
if ($('.ui-slider' + index + partindex).children(".sliderValue").val() > 0 && slidersData.sliders[index].length > 0) {
|
|
var valToDistribute = $('.ui-slider' + index + partindex).children(".sliderValue").val();
|
|
$(slidersData.sliders[index]).each(function (i, sldr) {
|
|
var currid = $(this).attr('id').split('_')[0];
|
|
var valToAdd = (slidersData.sliders[index].length == i) ? valToDistribute : Math.ceil(valToDistribute / (slidersData.sliders[index].length - i));
|
|
$(this).slider('value', parseInt($(this).children(".sliderValue").val()) + valToAdd);
|
|
slidersData.allocations[index][currid] += valToAdd;
|
|
valToDistribute -= valToAdd;
|
|
});
|
|
$('.ui-slider' + index + partindex).slider('value', 0);
|
|
slidersData.allocations[index][id] = 0;
|
|
}
|
|
$('.ui-slider' + index + partindex).slider('disable');
|
|
$('.ui-slider' + index + partindex).hide();
|
|
$('[id^=Projects_' + index + '__ProjectParts_' + partindex + '].single-line').prop('disabled', true);
|
|
}
|
|
}
|
|
|
|
function onProjectClicked(ui) {
|
|
var index = $(ui).attr('id').split('_')[1];
|
|
$('[id^=Projects_' + index + '].partclick').prop('checked', $(ui).prop('checked'));
|
|
if ($(ui).prop('checked')) {
|
|
$('.ui-slider' + index).show();
|
|
$('.ui-slider' + index).slider('enable');
|
|
$('[id^=Projects_' + index + '].single-line').prop('disabled', false);
|
|
}
|
|
else {
|
|
$('.ui-slider' + index).slider('disable');
|
|
$('.ui-slider' + index).hide();
|
|
$('[id^=Projects_' + index + '].single-line').prop('disabled', true);
|
|
}
|
|
}
|
|
|
|
function datesOverlap() {
|
|
var index = $(ui).attr('id').split('_')[1];
|
|
$('[id^=Projects_' + index + '].partclick').prop('checked', $(ui).prop('checked'));
|
|
if ($(ui).prop('checked')) {
|
|
$('.ui-slider' + index).show();
|
|
$('.ui-slider' + index).slider('enable');
|
|
$('[id^=Projects_' + index + '].single-line').prop('disabled', false);
|
|
}
|
|
else {
|
|
$('.ui-slider' + index).slider('disable');
|
|
$('.ui-slider' + index).hide();
|
|
$('[id^=Projects_' + index + '].single-line').prop('disabled', true);
|
|
}
|
|
return true;
|
|
}
|
|
</script>
|
|
}
|
|
<div id="erorMsgPlaceholder"></div>
|
|
@using (Html.BeginForm("ImportActuals", "Project", FormMethod.Post, new { @class = "panel form-horizontal", enctype = "multipart/form-data" }))
|
|
{
|
|
@Html.AntiForgeryToken()
|
|
<div class="panel-body">
|
|
@if (ViewBag.ImportResult == null && ViewBag.ComletedImport == null)
|
|
{
|
|
<div class="form-group">
|
|
<label class="col-sm-2 control-label" for="Name">Actuals Data File</label>
|
|
<div class="col-sm-10">
|
|
<input type="file" accept="csv" name="fileUpload" id="fileUpload" data-val="true" data-val-required="Please select the file to process" />
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="col-sm-2 control-label" for="Name">First row contains column headers</label>
|
|
<div class="col-sm-10">
|
|
<input type="checkbox" name="firstRowHeaders" id="firstRowHeaders">
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="col-sm-2 control-label" for="Name">Replace original values</label>
|
|
<div class="col-sm-10">
|
|
<input type="checkbox" name="zeroOut" id="resetActuals">
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label class="col-sm-2 control-label" for="Name">Import quantity as</label>
|
|
<div class=" col-sm-10">
|
|
<input type="checkbox" name="uomHours" id="uomHours">
|
|
</div>
|
|
</div>
|
|
@Html.ValidationSummary(false, "")
|
|
<div class="form-group" style="margin-bottom: 0;">
|
|
<div class="col-sm-offset-2 col-sm-10">
|
|
@if (SecurityManager.CheckSecurityObjectPermission(Areas.ImportActuals, AccessLevel.Write))
|
|
{
|
|
<button type="submit" class="btn btn-success" id="btnsave"><i class="fa fa-save"></i> Import</button>
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
int _i = 0;
|
|
if(Model != null && ViewBag.ComletedImport == null){
|
|
@Html.HiddenFor(x => x.Id)
|
|
@Html.HiddenFor(x => x.ResetActuals)
|
|
@Html.HiddenFor(x => x.SessionId)
|
|
@Html.HiddenFor(x => x.ImportSuccessful)
|
|
<div class="table-light table-responsive">
|
|
<table class="table dataTable" cellspacing="0" cellpadding="0" border="0">
|
|
<thead>
|
|
<tr>
|
|
<th style="width:2%"> </th>
|
|
<th style="width:30%;">Project Name</th>
|
|
<th style="width:25%;">Dates</th>
|
|
<th style="width:43%;">Distribution</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@foreach (var project in Model.Projects)
|
|
{
|
|
var _j = 0;
|
|
<tr>
|
|
<td>
|
|
@Html.HiddenFor(x => x.Projects[_i].ActualsScenarioId)
|
|
@Html.HiddenFor(x => x.Projects[_i].ProjectId)
|
|
@Html.CheckBoxFor(x => x.Projects[_i].Checked, new { @class = "projectclick" })
|
|
</td>
|
|
<td>
|
|
@Html.DisplayTextFor(x => x.Projects[_i].ProjectName)
|
|
</td>
|
|
<td>
|
|
@Html.DisplayTextFor(x => x.Projects[_i].StartDate)
|
|
-
|
|
@Html.DisplayTextFor(x => x.Projects[_i].EndDate)
|
|
</td>
|
|
<td>
|
|
|
|
</td>
|
|
</tr>
|
|
foreach (var part in project.ProjectParts)
|
|
{
|
|
<tr>
|
|
<td>
|
|
@Html.HiddenFor(x => x.Projects[_i].ProjectParts[_j].PartId)
|
|
@Html.HiddenFor(x => x.Projects[_i].ProjectParts[_j].ActualsScenarioId)
|
|
@Html.CheckBoxFor(x => x.Projects[_i].ProjectParts[_j].Checked, new { @class = "partclick" })
|
|
</td>
|
|
<td style="padding-left: 30px;">
|
|
@Html.DisplayTextFor(x => x.Projects[_i].ProjectParts[_j].PartName)
|
|
</td>
|
|
<td>
|
|
<div style="overflow: hidden;">
|
|
<div class="input-daterange input-group date floatdaterange">
|
|
@Html.EditorFor(x => x.Projects[_i].ProjectParts[_j].StartDate)
|
|
</div>
|
|
|
|
<div class="pull-left floatdaterange-addon" >To</div>
|
|
<div class="input-daterange input-group date floatdaterange">
|
|
@Html.EditorFor(x => x.Projects[_i].ProjectParts[_j].EndDate)
|
|
</div>
|
|
|
|
</div>
|
|
</td>
|
|
<td>
|
|
<div id="@part.PartId.ToString()_container" class="ui-slider@_i ui-slider@_i@_j ui-slider">
|
|
@Html.HiddenFor(x => x.Projects[_i].ProjectParts[_j].Distribution, new { @class = "sliderValue" })
|
|
<span class="sliderTitle">@((_j == 0) ? "100" : "0") %</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
_j++;
|
|
}
|
|
_i++;
|
|
}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<a href="@Url.Action("ImportActuals", "Project")" class="btn btn-primary" style="margin: 10px 0px;"><i class="fa fa-backward"></i> Back</a>
|
|
if (SecurityManager.CheckSecurityObjectPermission(Areas.ImportActuals, AccessLevel.Write))
|
|
{
|
|
<button type="submit" class="btn btn-success" id="btncomplete" style="margin: 10px 0px;" @((!ViewBag.ImportResult)? "disabled" : "")><i class="fa fa-save"></i> Complete Import</button>
|
|
}
|
|
}
|
|
if (ViewBag.ImportResult != null)
|
|
{
|
|
if (ViewBag.ImportResult == true)
|
|
{
|
|
<div class="note note-success"><h4 class="note-title">Data loaded successfully</h4><pre>@ViewBag.ImportLog</pre></div>
|
|
}
|
|
else
|
|
{
|
|
<div class="note note-danger"><h4 class="note-title">Data load failed</h4><pre>@ViewBag.ImportLog</pre></div>
|
|
}
|
|
}
|
|
if (ViewBag.ComletedImport != null)
|
|
{
|
|
if (ViewBag.ComletedImport == true)
|
|
{
|
|
<div class="note note-success"><h4 class="note-title">Data saved successfully</h4><pre>@ViewBag.ImportLog</pre></div>
|
|
}
|
|
else
|
|
{
|
|
<div class="note note-danger"><h4 class="note-title">Data save failed</h4><pre>@ViewBag.ImportLog</pre></div>
|
|
}
|
|
}
|
|
}
|
|
</div>
|
|
}
|