1216 lines
56 KiB
Plaintext
1216 lines
56 KiB
Plaintext
@using EnVisage.Code
|
|
@using EnVisage.Code.HtmlHelpers
|
|
@using Microsoft.AspNet.Identity
|
|
@using EnVisage.Models
|
|
@model EnVisage.Models.ForecastDashboardOptionsModel
|
|
|
|
@{
|
|
bool displayedInTeamDashboard = Model.SourcePageModel.Equals(typeof(TeamboardModel).Name);
|
|
bool displayedInViewDashboard = Model.SourcePageModel.Equals(typeof(ViewBoardModel).Name);
|
|
}
|
|
|
|
<div class="@(displayedInTeamDashboard || displayedInViewDashboard ? "" : "panel") form-horizontal" id="criteria-container">
|
|
<input type="hidden" id="scenarioId" name="scenarioId" />
|
|
<input type="hidden" id="groupId" name="groupId" />
|
|
<input type="hidden" id="pieChartColor" name="pieChartColor" />
|
|
<div class="@(displayedInTeamDashboard ? "" : "panel-body")">
|
|
<div class="@(displayedInTeamDashboard || displayedInViewDashboard ? "row padding-sm" : "row")"
|
|
style="@(displayedInTeamDashboard || displayedInViewDashboard ? "padding-bottom:0px!important;" : "")">
|
|
<div class="@(displayedInTeamDashboard ? "col-sm-12 col-md-6" : "col-lg-3 col-md-4 col-sm-5")">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Start/End Date</label>
|
|
@*env-716 start *@
|
|
<div style="overflow: hidden;">
|
|
|
|
<div class="input-daterange input-group" id="bs-datepicker-rangeChart">
|
|
<input class="form-control valid" data-key="foreecastFilterStartDate" id="filterStartDateChart" name="filterStartDateChart" type="text" value="@DateTime.Today.AddMonths(-1).ToString("MM/dd/yyyy")">
|
|
<div class="input-group-addon">to</div>
|
|
<input class="form-control" data-key="foreecastFilterEndDate" id="filterEndDateChart" name="filterEndDateChart" type="text" value="@DateTime.Today.AddMonths(11).ToString("MM/dd/yyyy")">
|
|
</div>
|
|
|
|
@*<div class="input-daterange input-group date floatdaterange" id="bs-datepicker-rangeChartStart">
|
|
<input class="form-control valid" data-key="foreecastFilterStartDate" id="filterStartDateChart" name="filterStartDateChart" type="text" value="@DateTime.Today.AddMonths(-1).ToString("MM/dd/yyyy")">
|
|
</div>
|
|
<div class="pull-left floatdaterange-addon">To</div>
|
|
<div class="input-daterange input-group date floatdaterange" id="bs-datepicker-rangeChartEnd">
|
|
<input class="form-control" data-key="foreecastFilterEndDate" id="filterEndDateChart" name="filterEndDateChart" type="text" value="@DateTime.Today.AddMonths(11).ToString("MM/dd/yyyy")">
|
|
</div>*@
|
|
|
|
</div>
|
|
@* <div class="input-daterange input-group" id="bs-datepicker-rangeChart">
|
|
<input class="form-control valid" data-key="foreecastFilterStartDate" id="filterStartDateChart" name="filterStartDateChart" type="text" value="@DateTime.Today.AddMonths(-1).ToString("MM/dd/yyyy")">
|
|
<span class="input-group-addon">to</span>
|
|
<input class="form-control" data-key="foreecastFilterEndDate" id="filterEndDateChart" name="filterEndDateChart" type="text" value="@DateTime.Today.AddMonths(11).ToString("MM/dd/yyyy")">
|
|
</div>
|
|
env-716 end *@
|
|
</div>
|
|
</div>
|
|
@*<div class="@(displayedInTeamDashboard ? "col-sm-12 col-md-6" : "col-lg-2 col-md-3 col-sm-4")">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Scenario Type</label>
|
|
@Html.DropDownList("filterType", Utils.GetScenarioTypesPortfAndSched(),
|
|
new
|
|
{
|
|
@id = "filterType",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterScenarioType"
|
|
})
|
|
</div>
|
|
</div>*@
|
|
@*<div class="col-lg-2 col-md-3 col-sm-3" id="filterGroupContainer">
|
|
<div class="form-group no-margin-hr select2-primary">
|
|
<label class="control-label">Scenario Groups</label>
|
|
@Html.DropDownList("filterGroup", Utils.GetScenarioGroup(includeEmpty: false),
|
|
new
|
|
{
|
|
@id = "group",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterScenarioGroup",
|
|
@multiple = "multiple"
|
|
})
|
|
</div>
|
|
</div>*@
|
|
<div class="@(displayedInTeamDashboard ? "col-sm-12 col-md-6" : "col-lg-2 col-md-3 col-sm-5")">
|
|
<div class="form-group no-margin-hr select2-primary">
|
|
<label class="control-label">Project Types</label>
|
|
@Html.DropDownList("filterClassification", Utils.GetProjectClassificationDropdown(includeEmpty: false),
|
|
new
|
|
{
|
|
@id = "filterClassification",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterClassification",
|
|
@multiple = "multiple"
|
|
})
|
|
</div>
|
|
</div>
|
|
<div class="@(displayedInTeamDashboard ? "col-sm-12 col-md-6" : "col-lg-2 col-md-3 col-sm-4")">
|
|
<div class="form-group no-margin-hr select2-primary">
|
|
<label class="control-label">Project Statuses</label>
|
|
@Html.DropDownList("filterStatus", Utils.GetProjectStatusDropdown(includeEmpty: false),
|
|
new
|
|
{
|
|
@id = "filterStatus",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterStatus",
|
|
@multiple = "multiple"
|
|
})
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-2 col-md-3 col-sm-4" style="@((Request.Path == "/") ? "" : "display:none")">
|
|
<div class="form-group no-margin-hr select2-primary">
|
|
<label class="control-label">Teams/Views</label>
|
|
@Html.DropDownList("filterTeam", Utils.GetViewsAndTeams(User.Identity.GetID(), false),
|
|
new
|
|
{
|
|
@id = "filterTeam",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterTeam",
|
|
@multiple = "multiple"
|
|
})
|
|
</div>
|
|
</div>
|
|
|
|
<div class="@(displayedInTeamDashboard ? "col-sm-12 col-md-6" : "col-lg-2 col-md-3 col-sm-5")">
|
|
<div class="form-group no-margin-hr select2-primary">
|
|
<label class="control-label">Strategic Goals</label>
|
|
@Html.DropDownList("filterTeam", Utils.GetStrategicGoalsDropdown(false),
|
|
new
|
|
{
|
|
@id = "filterGoal",
|
|
@class = "form-control fcboard-criteria-select2",
|
|
@data_key = "forecastFilterGoal",
|
|
@multiple = "multiple"
|
|
})
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="@(displayedInTeamDashboard ? "padding-sm" : "panel-footer") text-right"
|
|
style="@(displayedInTeamDashboard ? "padding-top:0px!important;" : "height:60px;")">
|
|
<div id="filter_processing" style="float:left;visibility: hidden;vertical-align:middle;">
|
|
<span ><img class="valign-middle" src="@Url.Content("~/Content/images/loadFA.gif")" /> loading...</span>
|
|
</div>
|
|
<div style="float:right;">
|
|
<a class="btn btn-primary" onclick="applyForecastDashboardFilter(false);" id="filterForecastDataBtn">Filter</a>
|
|
</div>
|
|
</div>
|
|
@Html.HiddenFor(t => t.AdditionalFilterParams)
|
|
</div>
|
|
<div class="bs-example" id="uom_container">
|
|
<table class="table table-striped table-bordered dataTable-tight" id="uomtbl"></table>
|
|
</div>
|
|
|
|
<script type="text/javascript">
|
|
var _dataForChart;
|
|
var _pagePreferences = [];
|
|
var _allScenarioGroups = [];
|
|
var _evdttbl;
|
|
var _menu;
|
|
var _dataSectionName; // SA. ENV-815
|
|
var _scenDetailsUrl = '@Url.Action("Details", "Scenarios", new { @id = "_rplcmnt_", @backUrl = "/", @backName = "dashboard" })';
|
|
var _projectUrl = '@Url.Action("Edit", "Project", new { @id = "_rplcmnt_", @backUrl = "/", @backName = "dashboard" })';
|
|
var _loadingGifUrl = '@Url.Content("~/Content/images/load.gif")';
|
|
var _additionalFiltersId = '@Html.IdFor(t => t.AdditionalFilterParams)';
|
|
var _hideTeamGroupping = (document.location.pathname == '@(Url.Action("Board", "Team"))'); // SA. ENV-913. Hide groupping for Teams Dashboard. Check the page by Url
|
|
var _forecastPageState = null;
|
|
|
|
@foreach (var item in Utils.GetScenarioGroup().Where(item => !item.Text.Equals("Default")))
|
|
{
|
|
@:_allScenarioGroups.push("@item.Value" + ":" + "@item.Text");
|
|
}
|
|
|
|
function ToggleStatus(scenarioId, control) {
|
|
if (scenarioId == null || scenarioId == "")
|
|
return "";
|
|
var url = "/ForecastDashboard/CheckIfActive/";
|
|
var request = {
|
|
'scenarioId': scenarioId
|
|
};
|
|
$.get(url, request, function (data) {
|
|
if (data == null || data == "") {
|
|
ToggleStatusConfirmed(scenarioId, control);
|
|
return '';
|
|
} else {
|
|
bootbox.confirm({
|
|
message: "There is an active scenario for this project already. Are you sure you want to activate this scenario instead of active one?",
|
|
callback: function (result) {
|
|
if (result) {
|
|
ToggleStatusConfirmed(scenarioId, control);
|
|
}
|
|
},
|
|
className: "bootbox-sm"
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function CopyToGroup(scenarioId, groupId, element) {
|
|
$(element).children('input[type="checkbox"]').addClass('hide');
|
|
$(element).children('span.glyphicon').removeClass('hide');
|
|
var isChecked = $(element).children('input[type="hidden"]').val() == 'checked';
|
|
var url = '';
|
|
if (!isChecked)
|
|
url = '/ForecastDashboard/CopyScenarioToGroup';
|
|
else
|
|
url = '/ForecastDashboard/ExtractFromGroup';
|
|
var request = {
|
|
'scenarioId': scenarioId,
|
|
'groupId': groupId
|
|
};
|
|
$.post(url, request, function (data) {
|
|
var result = data;
|
|
if (data.Status == 'Ok') {
|
|
$(element).children('input[type="hidden"]').val(isChecked ? "unchecked" : "checked");
|
|
} else if (data.Status == 'Error') { // Show error message
|
|
showErrorModal('An error occurred while try to change scenario group.', data.ErrorMsg);
|
|
console.log(data.ErrorDetails);
|
|
}
|
|
$(element).children('span.glyphicon').addClass('hide');
|
|
$(element).children('input[type="checkbox"]').removeClass('hide');
|
|
});
|
|
}
|
|
|
|
function onMenuItemClick(e, element) {
|
|
if ($(element).hasClass('dropdown-menu-form')) {
|
|
e.stopPropagation();
|
|
}
|
|
if (e.target.className != 'hide' && e.target.type == 'checkbox') {
|
|
var li = $(e.target).parent()[0];
|
|
var scenarioId = li.getAttribute('data-scenarioid');
|
|
var groupId = li.getAttribute('data-groupid');
|
|
CopyToGroup(scenarioId, groupId, $(li));
|
|
}
|
|
}
|
|
|
|
function ToggleStatusConfirmed(scenarioId, control) {
|
|
if (scenarioId == null || scenarioId == "")
|
|
return "";
|
|
var url = "/ForecastDashboard/ToggleStatus/";
|
|
var request = {
|
|
'scenarioId': scenarioId
|
|
};
|
|
$.get(url, request, function (data) {
|
|
if (typeof LoadGraphData === 'function')
|
|
LoadGraphData();
|
|
if (typeof LoadPieData === 'function')
|
|
LoadPieData();
|
|
_evdttbl.DataTable().ajax.reload();
|
|
});
|
|
return '';
|
|
}
|
|
|
|
function formatFDDate(jsonDate) {
|
|
if (jsonDate == null || jsonDate == "")
|
|
return "";
|
|
var dt = new Date(parseInt(jsonDate.replace("/Date(", "").replace(")/", ""), 10));
|
|
return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
|
|
}
|
|
|
|
function switchFDGraph() {
|
|
changeUomModeForecastSwitcherState($('#expendituresMode').prop('checked'));
|
|
if (typeof DrawGraph === 'function')
|
|
DrawGraph();
|
|
}
|
|
|
|
function dropDownFixPosition(button, dropdown) {
|
|
var dropDownLeft = button.offset().left - window.pageXOffset - dropdown.width() + button.outerWidth();
|
|
var dropDownTop = button.offset().top + button.outerHeight() - window.pageYOffset;
|
|
dropdown.css('position', 'fixed');
|
|
dropdown.css('top', dropDownTop + "px");
|
|
dropdown.css('left', dropDownLeft + "px");
|
|
}
|
|
|
|
function ToggleChart() {
|
|
if ($('#graph-container').css('display') == 'none') {
|
|
$('#graph-container').css('display', 'block');
|
|
if (typeof DrawGraph === 'function')
|
|
DrawGraph();
|
|
if (typeof DrawPie === 'function')
|
|
DrawPie();
|
|
} else
|
|
$('#graph-container').css('display', 'none');
|
|
|
|
redrawFreezeColumn();
|
|
}
|
|
|
|
function ToggleCriteria() {
|
|
if ($('#criteria-container').css('display') == 'none')
|
|
$('#criteria-container').show();
|
|
else
|
|
$('#criteria-container').hide();
|
|
|
|
redrawFreezeColumn();
|
|
}
|
|
|
|
function switchExpenditureMode() {
|
|
if (!$('#expendituresMode').prop('checked')) {
|
|
$('#uomModeForecast').switcher('enable');
|
|
$('#uomModeForecast').switcher('on');
|
|
}
|
|
changeUomModeForecastSwitcherState($('#expendituresMode').prop('checked'));
|
|
if (typeof LoadGraphData === 'function')
|
|
LoadGraphData();
|
|
if (typeof LoadPieData === 'function')
|
|
LoadPieData();
|
|
}
|
|
|
|
function switchGroupByTeamMode() {
|
|
onPreferencesItemClick();
|
|
_evdttbl.DataTable().ajax.reload();
|
|
}
|
|
|
|
// SA. ENV-607
|
|
function switchPerformanceMode() {
|
|
setPerformanceMode();
|
|
|
|
if ($('#performanceMode').prop('checked')) {
|
|
if (typeof LoadPerformanceData === 'function') {
|
|
LoadPerformanceData();
|
|
}
|
|
}
|
|
}
|
|
|
|
function setPerformanceMode() {
|
|
if ($('#performanceMode').prop('checked')) {
|
|
$('#performanceChartMode').switcher('enable');
|
|
|
|
$('#uomtbl').dataTable().addClass("show-performance");
|
|
$('#stacked-container').css('display', 'block');
|
|
}
|
|
else {
|
|
$('#performanceChartMode').switcher('disable');
|
|
|
|
$('#uomtbl').dataTable().removeClass("show-performance");
|
|
$('#stacked-container').css('display', 'none');
|
|
}
|
|
|
|
redrawFreezeColumn();
|
|
}
|
|
|
|
// SA. ENV-608
|
|
function switchPerformanceChartMode() {
|
|
if (typeof LoadPerformanceData === 'function')
|
|
LoadPerformanceData();
|
|
}
|
|
|
|
function changeUomModeForecastSwitcherState(laborMode) {
|
|
if ($('#chFDGraphMode').prop('checked') && laborMode)
|
|
$('#uomModeForecast').switcher('enable');
|
|
else
|
|
$('#uomModeForecast').switcher('disable');
|
|
}
|
|
|
|
function applyForecastDashboardFilter(skipChart) {
|
|
$("#filter_processing").css({'visibility':'visible'});
|
|
// SA. ENV-815. Save user preferences
|
|
saveForecastDashboardPreferences();
|
|
|
|
filterForecastData(skipChart);
|
|
}
|
|
|
|
function filterForecastData(skipChart) {
|
|
if (!skipChart && typeof LoadGraphData === 'function')
|
|
LoadGraphData();
|
|
if (typeof LoadPieData === 'function')
|
|
LoadPieData();
|
|
|
|
_evdttbl.DataTable().ajax.reload(function () {
|
|
$("#filter_processing").css({ 'visibility': 'hidden' });
|
|
});
|
|
}
|
|
|
|
function dropDownInsideClick(event) {
|
|
console.log('fired');
|
|
if (!event)
|
|
event = window.event;
|
|
|
|
var container = null, button = null;
|
|
if ($(event.target).hasClass('dropdown-menu'))
|
|
container = $(event.target);
|
|
else {
|
|
button = $(event.target);
|
|
container = button.closest('.dropdown-menu');
|
|
}
|
|
hideRedundantPopovers(container, button);
|
|
|
|
if (event.stopPropagation)
|
|
event.stopPropagation();
|
|
else
|
|
window.event.cancelBubble = true;
|
|
}
|
|
|
|
function dropDownFixPositionCalendar(button, dropdown) {
|
|
console.log('fixing');
|
|
setDropdownProps(button, dropdown, liHeight);
|
|
|
|
|
|
hideRedundantPopovers($('#uomtbl'), null);
|
|
}
|
|
var liHeight = 30;
|
|
function hideRedundantPopovers(container, currentBtn) {
|
|
|
|
var id = null;
|
|
if (currentBtn) {
|
|
if (currentBtn.is('[data-toggle="popover"]'))
|
|
id = currentBtn.attr('id');
|
|
else
|
|
id = currentBtn.closest('[data-toggle="popover"]').attr('id');
|
|
}
|
|
container.find('[data-toggle="popover"]' + (id != null && id != undefined) ? '[id!="' + id + '"]' : '').popover('destroy');
|
|
}
|
|
|
|
|
|
function initDataTable() {
|
|
var additionalParams = $('#' + _additionalFiltersId).val();
|
|
var mode = "main";
|
|
if (additionalParams != null && additionalParams != "") {
|
|
var paramsObj = JSON.parse(additionalParams);
|
|
if (paramsObj != null && paramsObj.mode != null && paramsObj.mode != "") {
|
|
mode = paramsObj.mode;
|
|
}
|
|
}
|
|
var allColumns = [];
|
|
allColumns["ProjectName"] = {
|
|
"sTitle": "Project Name",
|
|
"sClass": "bigCol",
|
|
"mData": "ProjectName",
|
|
"sName": "ProjectName",
|
|
"mRender": function (data, type, full) {
|
|
var strA = '<a href="' + _projectUrl + '">' + data + '</a> ';
|
|
return strA.replace(/_rplcmnt_/g, full.ProjectId);
|
|
}
|
|
};
|
|
allColumns["Name"] = {
|
|
"sTitle": "Scenario Name",
|
|
"sClass": "bigCol",
|
|
"mData": "Name",
|
|
"sName": "Name",
|
|
"bVisible": isColumnVisible("Name"),
|
|
"mRender": function (data, type, full) {
|
|
var strA = '<div style="float:left;margin-right:5px;"><a id="aN__rplcmnt_" onclick="return CheckLock(this.id, \'Scenario\', \'_rplcmnt_\')" class="popover-warning popover-dark" href="' + _scenDetailsUrl + '">' + data + '</a></div>';
|
|
if (full.InactiveCount > 0) {
|
|
strA += '<div class="dropdown menuGroup " style="float:right;">'+
|
|
'<button type="button" title="Menu" style="margin-bottom:0px !important;" class="btn btn-xs dropdown-toggle" data-toggle="dropdown" onclick=\'dropDownFixPositionCalendar($(this), $(this).parent().find(".dropdown-menu"));\'><i class="fa fa-caret-down"></i></button>'+
|
|
'<ul id="ddm_'+ full.Id +'" class="dropdown-menu dropdown-menu-form dropdown-menu-right dropdown-menu-scroll-auto lioverflowh" style="text-align:left;padding:4px 0px!important;width:220px;overflow-x: hidden;" onclick="dropDownInsideClick(event);">';
|
|
$.map(full.InactiveScenarios, function (value, key) {
|
|
strA += '<li><div style="-ms-text-overflow: ellipsis; -o-text-overflow: ellipsis; text-overflow: ellipsis; overflow: hidden; max-width: 150px; float: left; padding-left: 15px;"><span title="' + value + '">'+ value + '</span></div>'+
|
|
'<div style="float: right;padding-right: 15px;"><a data-toggle="popover" title="Activate" onclick="ToggleStatus(\''+ key +'\', this)" class="btn btn-xs btn-primary popover-warning popover-dark" ><i class="fa fa-check-circle-o not-active"></i></a></div></li>';
|
|
});
|
|
strA += '</ul></div>';
|
|
}
|
|
return strA.replace(/_rplcmnt_/g, full.Id);
|
|
}
|
|
};
|
|
|
|
allColumns["ProjectedRevenue"] = {
|
|
"sTitle": "Projected Revenue",
|
|
"mData": "ProjectedRevenue",
|
|
"sName": "ProjectedRevenue",
|
|
"bVisible": isColumnVisible("ProjectedRevenue"),
|
|
"mRender": function (data, type, full) {
|
|
return (!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
|
|
}
|
|
};
|
|
allColumns["ExpectedGrossMargin"] = {
|
|
"sTitle": "Expected Margin",
|
|
"sClass": "smallCol",
|
|
"mData": "ExpectedGrossMargin",
|
|
"sName": "ExpectedGrossMargin",
|
|
"bVisible": isColumnVisible("ExpectedGrossMargin"),
|
|
"mRender": function (data, type, full) {
|
|
return ((full.UseLMMargin) ? Math.round(full.ExpectedGrossMargin_LM * 1000) / 10 + ' % (L&M)' : Math.round(full.ExpectedGrossMargin * 1000) / 10 + ' %');
|
|
}
|
|
};
|
|
allColumns["CalculatedGrossMargin"] = {
|
|
"sTitle": "Calculated Gross",
|
|
"sClass": "smallCol",
|
|
"mData": "CalculatedGrossMargin",
|
|
"sName": "CalculatedGrossMargin",
|
|
"bVisible": isColumnVisible("CalculatedGrossMargin"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "0%" : Math.round(data * 1000) / 10 + ' %'); }
|
|
};
|
|
allColumns["CalculatedGrossMargin_LM"] = {
|
|
"sTitle": "L&M Margin",
|
|
"sClass": "smallCol",
|
|
"mData": "CalculatedGrossMargin_LM",
|
|
"sName": "CalculatedGrossMargin_LM",
|
|
"bVisible": isColumnVisible("CalculatedGrossMargin_LM"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "0%" : Math.round(data * 1000) / 10 + ' %'); }
|
|
};
|
|
allColumns["CGSplit"] = {
|
|
"sTitle": "Labor / Materials",
|
|
"sClass": "smallCol",
|
|
"mData": "CGSplit",
|
|
"sName": "CGSplit",
|
|
"bVisible": isColumnVisible("CGSplit"),
|
|
"mRender": function (data, type, full) { return ((!full.CGSplit) ? "0%" : full.CGSplit * 100 + ' %') + " / " + ((!full.EFXSplit) ? "0%" : full.EFXSplit * 100 + ' %'); }
|
|
};
|
|
allColumns["StartDate"] = {
|
|
"sTitle": "Start Date",
|
|
"mData": "StartDate",
|
|
"sName": "StartDate",
|
|
"bVisible": isColumnVisible("StartDate"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "0" : formatFDDate(data)); }
|
|
};
|
|
allColumns["EndDate"] = {
|
|
"sTitle": "End Date",
|
|
"mData": "EndDate",
|
|
"sName": "EndDate",
|
|
"bVisible": isColumnVisible("EndDate"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "0" : formatFDDate(data)); }
|
|
};
|
|
allColumns["ProjectDeadline"] = {
|
|
"sTitle": "Project Deadline",
|
|
"mData": "ProjectDeadline",
|
|
"sName": "ProjectDeadline",
|
|
"bVisible": isColumnVisible("ProjectDeadline"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "N/A" : formatFDDate(data)); }
|
|
};
|
|
allColumns["Priority"] = {
|
|
"sTitle": "Priority",
|
|
"sClass": "smallCol",
|
|
"mData": "Priority",
|
|
"sName": "Priority",
|
|
"bVisible": isColumnVisible("Priority"),
|
|
"mRender": function (data, type, full) { return data; }
|
|
};
|
|
allColumns["Probability"] = {
|
|
"sTitle": "Probability",
|
|
"sClass": "smallCol",
|
|
"mData": "Probability",
|
|
"sName": "Probability",
|
|
"bVisible": isColumnVisible("Probability"),
|
|
"mRender": function (data, type, full) {
|
|
var txt = '';
|
|
if (data * 100 > 0 && data * 100 <= 25)
|
|
txt = " (Low)";
|
|
if (data * 100 > 25 && data * 100 <= 75)
|
|
txt = " (Medium)";
|
|
if (data * 100 > 75 && data * 100 <= 99)
|
|
txt = " (High)";
|
|
if (data * 100 == 100)
|
|
txt = " (Expected)";
|
|
return ((!data) ? "0%" : Math.round(data * 100) + ' %' + txt);
|
|
}
|
|
};
|
|
allColumns["TDDirectCosts"] = {
|
|
"sTitle": "Top Down Direct Costs",
|
|
"mData": "TDDirectCosts",
|
|
"sName": "TDDirectCosts",
|
|
"bVisible": isColumnVisible("TDDirectCosts"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,')); }
|
|
};
|
|
allColumns["TDDirectCosts_LM"] = {
|
|
"sTitle": "Top Down Direct Costs L&M",
|
|
"mData": "TDDirectCosts_LM",
|
|
"sName": "TDDirectCosts_LM",
|
|
"bVisible": isColumnVisible("TDDirectCosts_LM"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,')); }
|
|
};
|
|
allColumns["BUDirectCosts"] = {
|
|
"sTitle": "Bottom Up Direct Costs",
|
|
"mData": "BUDirectCosts",
|
|
"sName": "BUDirectCosts",
|
|
"bVisible": isColumnVisible("BUDirectCosts"),
|
|
"mRender": function (data, type, full) {
|
|
return ((!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,'));
|
|
}
|
|
};
|
|
allColumns["BUDirectCosts_LM"] = {
|
|
"sTitle": "Bottom Up Direct Costs L&M",
|
|
"mData": "BUDirectCosts_LM",
|
|
"sName": "BUDirectCosts_LM",
|
|
"bVisible": isColumnVisible("BUDirectCosts_LM"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,')); }
|
|
};
|
|
allColumns["CostSavings"] = {
|
|
"sTitle": "Cost Savings",
|
|
"mData": "CostSavings",
|
|
"sName": "CostSavings",
|
|
"bVisible": isColumnVisible("CostSavings"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "" : '$' + data.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,')); }
|
|
};
|
|
allColumns["CostSavingsDuration"] = {
|
|
"sTitle": "Cost Savings Duration",
|
|
"mData": "CostSavingsDuration",
|
|
"sName": "CostSavingsDuration",
|
|
"bVisible": isColumnVisible("CostSavingsDuration"),
|
|
"mRender": function (data, type, full) { return full.CostSavingsDuration; }
|
|
};
|
|
allColumns["ROIDate"] = {
|
|
"sTitle": "ROI Date",
|
|
"mData": "ROIDate",
|
|
"sName": "ROIDate",
|
|
"bVisible": isColumnVisible("ROIDate"),
|
|
"mRender": function (data, type, full) { return ((!data) ? "" : formatFDDate(data)); }
|
|
};
|
|
allColumns["HardSoftSavings"] = {
|
|
"sTitle": "Hard/Soft Savings",
|
|
"mData": "HardSoftSavings",
|
|
"sName": "HardSoftSavings",
|
|
"bVisible": isColumnVisible("HardSoftSavings"),
|
|
"mRender": function (data, type, full) { return full.HardSoftSavings; }
|
|
};
|
|
|
|
|
|
|
|
|
|
allColumns["ScenarioStatus"] = {
|
|
"sTitle": "",
|
|
"mData": "ScenarioStatus",
|
|
"sName": "ScenarioStatus",
|
|
"bVisible": isColumnVisible("ScenarioStatus"),
|
|
"sClass": "nowrap bigCol",
|
|
"mRender": function (data, type, full) {
|
|
var cellhtml = "";
|
|
if (full.ScenarioStatus != null) {
|
|
var options = "";
|
|
if (mode == "main") {
|
|
for (i = 0; i < _allScenarioGroups.length; i++) {
|
|
|
|
var arr = _allScenarioGroups[i].split(":");
|
|
var isFound = false;
|
|
for (j = 0; j < full.Groups.length; j++) {
|
|
if (arr[0] == full.Groups[j].substr(full.Groups[j].lastIndexOf(">") + 1)) {
|
|
isFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
options += "<li data-scenarioId='" + full.Id + "' data-groupId='" + arr[0] + "'>" +
|
|
"<input type='checkbox' style='margin-right: 5px;' id='" + full.Id + '_' + arr[0] + "' ";
|
|
if (isFound)
|
|
options += "checked";
|
|
options += "/><input type='hidden' value='";
|
|
if (isFound)
|
|
options += "checked";
|
|
else
|
|
options += "unchecked";
|
|
options += "'/><span class='glyphicon glyphicon-refresh glyphicon-refresh-animate hide'></span><label for='" + full.Id + '_' + arr[0] + "'>" + arr[1] + "</label></li>";
|
|
}
|
|
|
|
if (options.length > 0) {
|
|
options = "<div class=\"btn-group dropdown scenarioGroupDropdown\" id=\"copyto_" + full.Id + "\">" +
|
|
"<button type='button' class='btn btn-xs dropdown-toggle dropdown-fix-pos' data-toggle='dropdown'>Groups <i class='fa fa-caret-down'></i></button>" +
|
|
"<ul class='dropdown-menu dropdown-menu-form dropdown-menu-right' role='menu' onclick='onMenuItemClick(event, $(this))'>" + options + "</ul>" +
|
|
"</div>";
|
|
}
|
|
}
|
|
|
|
cellhtml = ((full.ScenarioStatus == 1) ? "<a class=\"btn btn-xs btn-warning popover-warning popover-dark\" id=\"" + full.Id + "\" onclick=\"if(CheckLock(this.id, 'Scenario', '" + full.Id + "')) {ToggleStatus('" + full.Id + "', this);}\" title=\"Deactivate\" data-toggle=\"popover\" data-placement=\"left\"><i class=\"fa fa-times-circle-o\"></i></a>" : "<a class=\"btn btn-xs btn-primary popover-warning popover-dark\" id=\"" + full.Id + "\" onclick=\"if(CheckLock(this.id, 'Scenario', '" + full.Id + "')) {ToggleStatus('" + full.Id + "', this);}\" title=\"Activate\" data-toggle=\"popover\" data-placement=\"left\"><i class=\"fa fa-check-circle-o\"></i></a>");
|
|
cellhtml += " " + options;
|
|
}
|
|
|
|
return cellhtml;
|
|
}
|
|
};
|
|
|
|
allColumns["TeamName"] = {
|
|
"sTitle": "Team Name",
|
|
"sClass": "bigCol",
|
|
"mData": "TeamName",
|
|
"sName": "TeamName",
|
|
"bVisible": false,
|
|
"mRender": function (data, type, full) { return data; }
|
|
};
|
|
|
|
// SA. ENV-607. Performance indication
|
|
allColumns["PerformanceColor"] = {
|
|
"sTitle": "Performance Color",
|
|
"sClass": "smallCol",
|
|
"mData": "PerformanceColor",
|
|
"sName": "PerformanceColor",
|
|
"bVisible": false,
|
|
"mRender": function (data, type, full) {
|
|
return data;
|
|
}
|
|
};
|
|
|
|
allColumns["ProjectStatus"] = {
|
|
"sTitle": "Project Status",
|
|
"mData": "ProjectStatus",
|
|
"sName": "ProjectStatus",
|
|
"bVisible": isColumnVisible("ProjectStatus"),
|
|
"mRender": function (data, type, full) { return data; }
|
|
};
|
|
|
|
allColumns["StrategicGoals"] = {
|
|
"sTitle": "Strategic Goals",
|
|
"sClass": "smallCol",
|
|
"mData": "StrategicGoals",
|
|
"sName": "StrategicGoals",
|
|
"bVisible": isColumnVisible("StrategicGoals"),
|
|
"mRender": function (data, type, full) { return data; }
|
|
};
|
|
|
|
var sortedColumns = [];
|
|
|
|
if (_pagePreferences && (_pagePreferences.length > 0)) {
|
|
var columnsText = "";
|
|
|
|
for (var index = 0; index < _pagePreferences.length; index++)
|
|
if (_pagePreferences[index].Key == "forecastGridColOrder") {
|
|
columnsText = _pagePreferences[index].Value;
|
|
break;
|
|
}
|
|
|
|
if (columnsText.length > 0) {
|
|
var columns = columnsText.split(";");
|
|
|
|
for (var index = 0; index < columns.length; index++) {
|
|
var colName = columns[index];
|
|
|
|
if (colName in allColumns) {
|
|
var colObj = allColumns[colName];
|
|
sortedColumns.push(colObj);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sortedColumns.indexOf(allColumns["ProjectName"]) == -1) sortedColumns.push(allColumns["ProjectName"]);
|
|
if (sortedColumns.indexOf(allColumns["Name"]) == -1) sortedColumns.push(allColumns["Name"]);
|
|
if (sortedColumns.indexOf(allColumns["TeamName"]) == -1) sortedColumns.push(allColumns["TeamName"]);
|
|
if (sortedColumns.indexOf(allColumns["ProjectedRevenue"]) == -1) sortedColumns.push(allColumns["ProjectedRevenue"]);
|
|
if (sortedColumns.indexOf(allColumns["ExpectedGrossMargin"]) == -1) sortedColumns.push(allColumns["ExpectedGrossMargin"]);
|
|
if (sortedColumns.indexOf(allColumns["CalculatedGrossMargin"]) == -1) sortedColumns.push(allColumns["CalculatedGrossMargin"]);
|
|
if (sortedColumns.indexOf(allColumns["CalculatedGrossMargin_LM"]) == -1) sortedColumns.push(allColumns["CalculatedGrossMargin_LM"]);
|
|
if (sortedColumns.indexOf(allColumns["CGSplit"]) == -1) sortedColumns.push(allColumns["CGSplit"]);
|
|
if (sortedColumns.indexOf(allColumns["StartDate"]) == -1) sortedColumns.push(allColumns["StartDate"]);
|
|
if (sortedColumns.indexOf(allColumns["EndDate"]) == -1) sortedColumns.push(allColumns["EndDate"]);
|
|
if (sortedColumns.indexOf(allColumns["Priority"]) == -1) sortedColumns.push(allColumns["Priority"]);
|
|
if (sortedColumns.indexOf(allColumns["Probability"]) == -1) sortedColumns.push(allColumns["Probability"]);
|
|
if (sortedColumns.indexOf(allColumns["TDDirectCosts"]) == -1) sortedColumns.push(allColumns["TDDirectCosts"]);
|
|
if (sortedColumns.indexOf(allColumns["TDDirectCosts_LM"]) == -1) sortedColumns.push(allColumns["TDDirectCosts_LM"]);
|
|
if (sortedColumns.indexOf(allColumns["BUDirectCosts"]) == -1) sortedColumns.push(allColumns["BUDirectCosts"]);
|
|
if (sortedColumns.indexOf(allColumns["BUDirectCosts_LM"]) == -1) sortedColumns.push(allColumns["BUDirectCosts_LM"]);
|
|
if (sortedColumns.indexOf(allColumns["CostSavings"]) == -1) sortedColumns.push(allColumns["CostSavings"]);
|
|
if (sortedColumns.indexOf(allColumns["CostSavingsDuration"]) == -1) sortedColumns.push(allColumns["CostSavingsDuration"]);
|
|
if (sortedColumns.indexOf(allColumns["ROIDate"]) == -1) sortedColumns.push(allColumns["ROIDate"]);
|
|
if (sortedColumns.indexOf(allColumns["HardSoftSavings"]) == -1) sortedColumns.push(allColumns["HardSoftSavings"]);
|
|
if (sortedColumns.indexOf(allColumns["ScenarioStatus"]) == -1) sortedColumns.push(allColumns["ScenarioStatus"]);
|
|
if (sortedColumns.indexOf(allColumns["ProjectDeadline"]) == -1) sortedColumns.push(allColumns["ProjectDeadline"]);
|
|
if (sortedColumns.indexOf(allColumns["PerformanceColor"]) == -1) sortedColumns.push(allColumns["PerformanceColor"]);
|
|
if (sortedColumns.indexOf(allColumns["ProjectStatus"]) == -1) sortedColumns.push(allColumns["ProjectStatus"]);
|
|
if (sortedColumns.indexOf(allColumns["StrategicGoals"]) == -1) sortedColumns.push(allColumns["StrategicGoals"]);
|
|
|
|
// SA. ENV-905
|
|
var firstVisibleRow = _forecastPageState.data('pageState').$dataset['page-start'] || 0;
|
|
var pageSize = _forecastPageState.data('pageState').$dataset['page-size'] || 25;
|
|
firstVisibleRow = firstVisibleRow * pageSize;
|
|
|
|
if (firstVisibleRow === undefined)
|
|
firstVisibleRow = 0;
|
|
|
|
_evdttbl = $('#uomtbl').dataTable({
|
|
"iDisplayStart": firstVisibleRow,
|
|
"iDisplayLength": pageSize,
|
|
"order": [[_forecastPageState.data('pageState').$dataset['sort-order'] || 0, _forecastPageState.data('pageState').$dataset['sort-dir'] || '']],
|
|
"bPaginate": true,
|
|
"dom": 'Rlfrtip',
|
|
"colReorder": {/*do not allow to reorder first column*/
|
|
"fixedColumnsLeft": 1,
|
|
"fixedColumnsRight": 0,
|
|
"reorderCallback": function () {
|
|
redrawFreezeColumn();
|
|
onPreferencesItemClick();
|
|
}
|
|
},
|
|
"bSort": true,
|
|
"bFilter": false,
|
|
"bInfo": true,
|
|
"sScrollY": "",
|
|
"sScrollX": "",
|
|
"bScrollCollapse": true,
|
|
"bProcessing": false,
|
|
"bServerSide": true,
|
|
"bAutoWidth": false,
|
|
"sAjaxSource": '/ForecastDashboard/',
|
|
"sServerMethod": "POST",
|
|
"fnServerParams": bindServerParams,
|
|
"lengthMenu": [[25, 50, 100], [25, 50, 100]],
|
|
"stateSave": true,
|
|
|
|
// SA. ENV-905
|
|
"stateSaveCallback": function (settings, data) {
|
|
var pageSize = settings._iDisplayLength;
|
|
var displayStart = 0;
|
|
|
|
if ((pageSize !== undefined) && (pageSize > 0))
|
|
displayStart = Math.floor(settings._iDisplayStart / pageSize);
|
|
|
|
_forecastPageState.pageState('setData', ['page-size', pageSize]);
|
|
_forecastPageState.pageState('setData', ['page-start', displayStart]);
|
|
_forecastPageState.pageState('setData', ['sort-order', settings.aLastSort[0].col]);
|
|
_forecastPageState.pageState('setData', ['sort-dir', settings.aLastSort[0].dir]);
|
|
_forecastPageState.pageState('saveData');
|
|
},
|
|
"drawCallback": function (settings) {
|
|
if (!_hideTeamGroupping && $('#groupByTeamMode').prop('checked')) {
|
|
var api = this.api();
|
|
var rows = api.rows({ page: 'current' }).nodes();
|
|
var last = null;
|
|
api.column(api.column(':contains(Team)')[0], { page: 'current' }).data().each(function (group, i) {
|
|
|
|
if (last !== group) {
|
|
|
|
$(rows).eq(i).before(
|
|
|
|
'<tr class="group"><td><strong>' + group + '</strong></td><td colspan="19"></td></tr>'
|
|
);
|
|
|
|
last = group;
|
|
}
|
|
});
|
|
}
|
|
|
|
$(window).scroll(function () {
|
|
$('.scenarioGroupDropdown').removeClass('open');
|
|
});
|
|
|
|
$('.dropdown-fix-pos').click(function () {
|
|
dropDownFixPosition($(this), $(this).parent().find('.dropdown-menu'));
|
|
});
|
|
|
|
$(window).resize(function () {
|
|
redrawFreezeColumn();
|
|
});
|
|
|
|
redrawFreezeColumn();
|
|
},
|
|
"aoColumns": sortedColumns
|
|
});
|
|
|
|
function bindServerParams(aoData) {
|
|
var additionalFilters = $('#' + _additionalFiltersId).val();
|
|
|
|
aoData.push({ "name": "StartDate", "value": $('#filterStartDateChart').val() });
|
|
aoData.push({ "name": "EndDate", "value": $('#filterEndDateChart').val() });
|
|
aoData.push({ "name": "Type", "value": $('#filterType').val() });
|
|
aoData.push({ "name": "ProjectStatuses", "value": $('#filterStatus').val() || [] });
|
|
aoData.push({ "name": "StrategicGoals", "value": $('#filterGoals').val() || [] });
|
|
aoData.push({ "name": "Teams", "value": getSelectedTeamsOrViews("Teams") });
|
|
aoData.push({ "name": "Views", "value": getSelectedTeamsOrViews("Views") });
|
|
aoData.push({ "name": "ProjectTypes", "value": $('#filterClassification').val() || [] });
|
|
aoData.push({ "name": "StrategicGoals", "value": $('#filterGoal').val() || [] });
|
|
aoData.push({ "name": "FilterGroups", "value": $('#group').val() || [] });
|
|
aoData.push({ "name": "FilterGroupByTeam", "value": (_hideTeamGroupping ? 'false' : $('#groupByTeamMode').prop('checked')) });
|
|
aoData.push({ "name": "AdditionalParams", "value": additionalFilters ? JSON.parse(additionalFilters) : {} });
|
|
}
|
|
|
|
//init column trigger
|
|
var menuForColumns = _menu.find("#forecastGridColumns").children("ul");
|
|
|
|
if (menuForColumns) {
|
|
var htmlToAppend = "";
|
|
|
|
$(_evdttbl.dataTable().fnSettings().aoColumns).each(function (i, e) {
|
|
var text = e.sTitle;
|
|
if (text != "Project Name" && text != "Team Name") {
|
|
if (text == "")
|
|
text = "Options";
|
|
htmlToAppend += '<li class="padding-xs-hr"><div class="checkbox"><nobr><label><input type="checkbox" data-key="forecastCol_' + e.sName + '" ' + (isColumnVisible(e.sName) ? 'checked' : '') + ' class="columnVisibilityTrigger px" data-column="' + e.sName + '"> <span class="lbl">' + text + '</span></label></nobr></div></li>';
|
|
}
|
|
});
|
|
menuForColumns.append(htmlToAppend);
|
|
}
|
|
|
|
_menu.find("input:checkbox").change(function () {
|
|
onPreferencesItemClick($(this));
|
|
var dtColumn = _evdttbl.DataTable().column($(this).attr('data-column') + ":name");
|
|
var checked = $(this).is(":checked");
|
|
if (dtColumn != null) {
|
|
dtColumn.visible(checked);
|
|
//also hide columns of expanded main rows
|
|
$(".inactv-" + $(this).attr('data-column')).css("display", checked ? "" : "none");
|
|
}
|
|
|
|
redrawFreezeColumn();
|
|
});
|
|
|
|
$('#uomtbl_wrapper .dataTables_processing').addClass("table-caption");
|
|
$(_evdttbl.dataTable()).attr("data-dashboardMode", mode);
|
|
$('#uomtbl_wrapper').append("<div class=\"table-footer clearfix\"><div id=\"prjcts_footer_label\" class=\"DT-label\"></div><div id=\"prjcts_footer_paging\" class=\"DT-pagination\"></div></div>");
|
|
$('#uomtbl_wrapper .dataTables_info').appendTo('#prjcts_footer_label');
|
|
$('#uomtbl_wrapper .dataTables_paginate').appendTo('#prjcts_footer_paging');
|
|
$('#uomtbl_wrapper .dataTables_length').prependTo("#uomtbl_wrapper .table-footer");
|
|
$('#uomtbl_wrapper .dataTables_length').css("float", "left");
|
|
$('#uomtbl_wrapper .dataTables_length').css("margin-right", "10px");
|
|
|
|
if (mode != "main") {
|
|
$('#filterGroupContainer').hide();
|
|
}
|
|
|
|
// SA. ENV-607
|
|
_evdttbl.on('draw.dt', function () {
|
|
$(_evdttbl.DataTable().rows()[0]).each(function (i, e) {
|
|
var row = _evdttbl.DataTable().row(e);
|
|
$(row.node()).removeClass();
|
|
|
|
if (row.data().PerformanceColor && row.data().PerformanceColor.length > 0)
|
|
$(row.node()).addClass(row.data().PerformanceColor);
|
|
});
|
|
|
|
switchPerformanceMode();
|
|
});
|
|
}
|
|
|
|
function createDatePickers() {
|
|
var options2 = {
|
|
orientation: $('body').hasClass('right-to-left') ? "auto right" : 'auto auto',
|
|
startDate: '@Constants.MIN_SELECTABLE_DATE', // SA. ENV-1235. Disable incorrect dates input
|
|
endDate: '@Constants.MAX_SELECTABLE_DATE' // SA. ENV-1235. Disable incorrect dates input
|
|
};
|
|
|
|
//$('#bs-datepicker-rangeChartStart').datepicker(options2);
|
|
//$('#bs-datepicker-rangeChartEnd').datepicker(options2);
|
|
$('#bs-datepicker-rangeChart').datepicker(options2).on('changeDate', function (evt) {
|
|
if (evt.target.id == 'filterStartDateChart') {
|
|
var sDate = undefined;
|
|
var tmpValue = $('#filterStartDateChart').val();
|
|
var endDateValue = $('#filterEndDateChart').val();
|
|
|
|
if (tmpValue && (tmpValue.length > 0))
|
|
sDate = new Date(tmpValue);
|
|
|
|
if (!endDateValue || (endDateValue.length > 0)) {
|
|
$('#bs-datepicker-rangeChart').data('datepicker').pickers[1].prepopulate(sDate);
|
|
}
|
|
|
|
$('#filterEndDate').data('datepicker').setStartDate(sDate);
|
|
}
|
|
});
|
|
$('#filterStartDateChart').addClass('form-control');
|
|
$('#filterEndDateChart').addClass('form-control');
|
|
$('#filterStartDateChart').removeClass('text-box');
|
|
$('#filterEndDateChart').removeClass('text-box');
|
|
$('#filterStartDateChart').removeClass('single-line');
|
|
$('#filterEndDateChart').removeClass('single-line');
|
|
}
|
|
|
|
function isColumnVisible(colNameToCheck) {
|
|
// SA. ENV-815. If no prefs exist, by default column is visible
|
|
var result = true;
|
|
var key = "forecastCol_" + colNameToCheck;
|
|
|
|
if (_pagePreferences && (_pagePreferences.length > 0)) {
|
|
for (var index = 0; index < _pagePreferences.length; index++)
|
|
if (_pagePreferences[index].Key == key) {
|
|
// Column visibility info exists in the loaded prefs
|
|
result = _pagePreferences[index].Value;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function redrawFreezeColumn() {
|
|
$("#uom_freeze").remove();
|
|
|
|
var div = $("<div id='uom_freeze'/>")
|
|
.css({
|
|
"position": "absolute",
|
|
"top": $("#uom_container").position().top,
|
|
"left": $("#uom_container").position().left,
|
|
"border": "0",
|
|
"margin": "0"
|
|
})
|
|
.html($("#uom_container").html()
|
|
.replace(/uomtbl/g, 'uomtbl_freeze'));
|
|
div.find("td").css({
|
|
//"margin-top": "-1px",
|
|
//"border-color":"red"
|
|
//"margin-left": "-1px"
|
|
});
|
|
|
|
div.find("table").css({
|
|
"border-width": "0px"
|
|
});
|
|
$.each(div.find("tr"), function (i, o) {
|
|
var tr = $(o);
|
|
$.each(tr.find("th"), function (j, o1) {
|
|
if (j > 0) {
|
|
$(o1).remove();
|
|
} else {
|
|
$(o1).addClass("fixed")
|
|
.height($("#uom_container").find("th").eq(j).height() + (isMSIE() ? 1 : 0))
|
|
.width($("#uom_container").find("th").eq(j).width() + 1)
|
|
.on("click", function () {
|
|
$("#uom_container").find("th").eq(0).click();
|
|
})
|
|
.css("max-width", $("#uom_container").find("th").eq(j).width());
|
|
|
|
div.width($("#uom_container").find("th").eq(j).outerWidth());
|
|
}
|
|
});
|
|
$.each(tr.find("td"), function (j, o1) {
|
|
if (j > 0) {
|
|
$(o1).remove();
|
|
} else {
|
|
$(o1).addClass("fixed")
|
|
.height($("#uom_container").find("tr").eq(i).find("td").eq(j).height() - (isMSIE() ? 0 : 0))
|
|
.width($("#uom_container").find("tr").eq(i).find("td").eq(j).width() + 1)
|
|
.css("max-width", $("#uom_container").find("tr").eq(i).find("td").eq(j).width() + 1);
|
|
}
|
|
});
|
|
});
|
|
|
|
$("#uom_container").append(div);
|
|
$("#uom_freeze").find(".table-footer").remove();
|
|
|
|
$('#uom_freeze .rowexpander').click(function () {
|
|
expandRow([this]);
|
|
});
|
|
|
|
//show tooltips for clipped cells
|
|
$('#uomtbl_freeze').on('mouseenter', 'td,th', function () {
|
|
var $this = $(this);
|
|
|
|
if (this.offsetWidth < this.scrollWidth && !$this.attr('title')) {
|
|
$this.attr('title', $this.text());
|
|
}
|
|
});
|
|
}
|
|
|
|
function isMSIE() {
|
|
|
|
var ua = window.navigator.userAgent;
|
|
var msie = ua.indexOf("MSIE ");
|
|
|
|
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer, return version number
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
function onPreferencesItemClick(menuItem) {
|
|
saveForecastDashboardPreferences();
|
|
}
|
|
|
|
// SA. ENV-815
|
|
function saveForecastDashboardPreferences() {
|
|
var section = getDataSection(_evdttbl);
|
|
var prefs = collectPreferences(section);
|
|
|
|
// Add grid columns order
|
|
var columns = "";
|
|
var dataKey = "forecastGridColOrder";
|
|
|
|
$.each(_evdttbl.dataTable().fnSettings().aoColumns, function (i, obj) {
|
|
columns += (";" + obj.mData);
|
|
});
|
|
|
|
if (columns.length > 0)
|
|
columns = columns.substr(1);
|
|
|
|
prefs.push({
|
|
Key: dataKey,
|
|
Value: columns
|
|
});
|
|
|
|
saveUserPagePreferences(prefs, section);
|
|
}
|
|
|
|
// SA. ENV-815
|
|
function loadForecastDashboardPreferences() {
|
|
var section = getDataSection($('#uomtbl'));
|
|
_pagePreferences = loadUserPagePreferences(section);
|
|
return section;
|
|
}
|
|
|
|
function initMenuItems() {
|
|
if (_menu.find("label:contains('Show Criteria')").length < 1) {
|
|
if (typeof LoadGraphData === 'function')
|
|
_menu.append('<li class="padding-xs-hr" style="@(displayedInTeamDashboard || displayedInViewDashboard? "display:none;" : "")" ><div class="checkbox"><label><input type="checkbox" data-key="showChart" id="chkShowChart" checked class="columnVisibilityTrigger px" onclick="ToggleChart()"/> <span class="lbl">Show Status Chart</span></label></div></li>');
|
|
|
|
_menu.append('<li class="padding-xs-hr"><div class="checkbox"><label><input type="checkbox" data-key="showCriteria" id="chkShowCriteria" checked class="columnVisibilityTrigger px" onclick="ToggleCriteria()"/> <span class="lbl">Show Filters</span></label></div></li>');
|
|
if (typeof LoadGraphData === 'function') {
|
|
_menu.append('<li class="padding-xs-hr" style="@(displayedInViewDashboard ? "display:none;" : "")"><label><span class="switcherLbl">Status Chart as</span><input type="checkbox" data-key="chartMode" onclick="switchFDGraph()" name="chMode" id="chFDGraphMode" class="switcher" /></label></li>');
|
|
_menu.append('<li class="padding-xs-hr" style="@(displayedInViewDashboard ? "display:none;" : "")"><label><span class="switcherLbl">Quantity as</span><input type="checkbox" data-key="uomMode" checked name="uomModeForecast" id="uomModeForecast" class="switcher px" onclick="LoadGraphData()"/></label></li>');
|
|
}
|
|
_menu.append('<li class="padding-xs-hr" style="@(displayedInViewDashboard ? "display:none;" : "")"><label><span class="switcherLbl">Expenditures</span><input type="checkbox" data-key="expendituresMode" checked name="expendituresMode" id="expendituresMode" class="switcher px" onclick="switchExpenditureMode()"/></label></li>');
|
|
|
|
_menu.append('<li class="divider"></li>');
|
|
if (typeof LoadPieData === 'function') {
|
|
_menu.append('<li class="padding-xs-hr"><label><span class="switcherLbl">Project Type Chart as</span><input type="checkbox" data-key="pieMode" checked name="pieModeForecast" id="pieModeForecast" class="switcher px" onclick="DrawPie()"/></label></li>');
|
|
_menu.append('<li class="padding-xs-hr"><label><span class="switcherLbl">Filter Status Chart</span><input type="checkbox" data-key="pieReloadMode" checked name="pieReload" id="pieReload" class="switcher px"/></label></li>');
|
|
|
|
|
|
_menu.append('<li class="divider"></li>');
|
|
}
|
|
if (typeof LoadPerformanceData === 'function') {
|
|
_menu.append('<li class="padding-xs-hr"><label><span class="switcherLbl">Performance Graph by</span><input type="checkbox" data-key="performanceChartMode" checked name="performanceChartMode" id="performanceChartMode" class="switcher px" onclick="switchPerformanceChartMode()"/></label></li>');
|
|
|
|
_menu.append('<li class="divider"></li>');
|
|
}
|
|
// ENV-608. End
|
|
|
|
// SA. ENV-792
|
|
if (!_hideTeamGroupping)
|
|
_menu.append('<li class="padding-xs-hr"><label><span class="switcherLbl">Group By Team</span><input type="checkbox" data-key="groupByTeamMode" checked name="groupByTeamMode" id="groupByTeamMode" class="switcher px" onclick="switchGroupByTeamMode()"/></label></li>');
|
|
// SA. ENV-607. ENV-608. Begin
|
|
_menu.append('<li class="padding-xs-hr" style="@(displayedInViewDashboard ? "display:none;" : "")"><label><span class="switcherLbl">Performance</span><input type="checkbox" data-key="performanceMode" checked name="performanceMode" id="performanceMode" class="switcher px" onclick="switchPerformanceMode()"/></label></li>');
|
|
|
|
_menu.append('<li class="padding-xs-hr dropdown-submenu pull-left" id="forecastGridColumns"><a tabindex="-1" href="javascript:;">Grid Options</a><ul class="dropdown-menu pull-left"></ul></li>');
|
|
}
|
|
}
|
|
|
|
function initForecastDashboard() {
|
|
|
|
_dataSectionName = loadForecastDashboardPreferences();
|
|
if (_menu == null)
|
|
_menu = $("#@Model.MenuId");
|
|
initMenuItems();
|
|
_menu.click(function (event) {
|
|
event.stopPropagation();
|
|
});
|
|
_forecastPageState = $('#criteria-container').pageState({
|
|
pageKey: (document.location.pathname + ' - forecast'),
|
|
});
|
|
|
|
// SA. ENV-815
|
|
if (_dataSectionName && (_dataSectionName.length > 0))
|
|
restorePreferences(_dataSectionName, _pagePreferences);
|
|
|
|
createDatePickers();
|
|
|
|
$('#uomModeForecast').switcher({
|
|
on_state_content: '# Hours',
|
|
off_state_content: '# Resources'
|
|
});
|
|
$('#uomModeForecast').parent().css("width", "93px");
|
|
$('#chFDGraphMode').switcher({
|
|
on_state_content: 'Quantity',
|
|
off_state_content: 'Cost'
|
|
});
|
|
$('#chFDGraphMode').parent().css("width", "90px");
|
|
$('#expendituresMode').switcher({
|
|
on_state_content: 'Labor',
|
|
off_state_content: 'Non-labor'
|
|
});
|
|
$('#expendituresMode').parent().css("width", "82px");
|
|
|
|
if (!_hideTeamGroupping) {
|
|
$('#groupByTeamMode').switcher({
|
|
on_state_content: 'On',
|
|
off_state_content: 'Off'
|
|
});
|
|
$('#groupByTeamMode').parent().css("width", "82px");
|
|
}
|
|
|
|
if ($('#chkShowChart').prop('checked'))
|
|
$('#graph-container').show();
|
|
else
|
|
$('#graph-container').hide();
|
|
if ($('#chkShowCriteria').prop('checked'))
|
|
$('#criteria-container').show();
|
|
else
|
|
$('#criteria-container').hide();
|
|
$('#uomtbl').on('mouseenter', 'td,th', function () {
|
|
var $this = $(this);
|
|
if (this.offsetWidth < this.scrollWidth && !$this.attr('title')) {
|
|
$this.attr('title', $this.text());
|
|
}
|
|
});
|
|
if (typeof LoadPieData === 'function') {
|
|
$('#pieModeForecast').switcher({
|
|
on_state_content: 'Cost',
|
|
off_state_content: 'Time'
|
|
});
|
|
$('#pieModeForecast').parent().css("width", "82px");
|
|
$('#pieReload').switcher({
|
|
on_state_content: 'Yes',
|
|
off_state_content: 'No'
|
|
});
|
|
$('#pieModeForecast').click(function () {
|
|
LoadPieData();
|
|
});
|
|
$('#pieReload').parent().css("width", "82px");
|
|
}
|
|
|
|
$('#performanceMode').switcher({
|
|
on_state_content: 'On',
|
|
off_state_content: 'Off'
|
|
});
|
|
$('#performanceMode').parent().css("width", "82px");
|
|
|
|
// ENV-608
|
|
$('#performanceChartMode').switcher({
|
|
on_state_content: 'Cost',
|
|
off_state_content: 'Type'
|
|
});
|
|
$('#performanceChartMode').parent().css("width", "82px");
|
|
|
|
initDataTable();
|
|
|
|
changeUomModeForecastSwitcherState($('#expendituresMode').prop('checked'));
|
|
setPerformanceMode();
|
|
|
|
if (typeof LoadGraphData === 'function')
|
|
LoadGraphData();
|
|
if (typeof LoadPieData === 'function')
|
|
LoadPieData();
|
|
|
|
$(window).scroll(function () {
|
|
$('.menuGroup').removeClass('open');
|
|
hideRedundantPopovers($('#uomtbl'), null);
|
|
});
|
|
|
|
$('.table-striped').scroll(function () {
|
|
$('.menuGroup').removeClass('open');
|
|
hideRedundantPopovers($('#uomtbl'), null);
|
|
});
|
|
$(document).click(function (event) {
|
|
$('.menuGroup').removeClass('open');
|
|
if (!$(event.target).is('[data-toggled="popover"]'))
|
|
hideRedundantPopovers($('#uomtbl'), null);
|
|
});
|
|
}
|
|
init.push(function () {
|
|
initForecastDashboard();
|
|
$(".fcboard-criteria-select2").select2();
|
|
});
|
|
</script>
|