EnVisageOnline/Main/Source/EnVisage/Scripts/ReportViewer/reporting.js

1091 lines
33 KiB
JavaScript

// Default amount of bootstrap grid columns to place control - for every type of criteria control
var C_REPORT_PARAM_GRIDCOLS_MULTISELECT = 4;
var C_REPORT_PARAM_GRIDCOLS_SINGLESELECT = 2;
var C_REPORT_PARAM_GRIDCOLS_DATEPICKER = 2;
var C_REPORT_PARAM_GRIDCOLS_SWITCHER = 2;
var C_REPORT_PARAM_GRIDCOLS_NUMBER_EDITOR = 2;
var C_REPORT_PARAM_GRIDCOLS_TEXT_EDITOR = 2;
var C_REPORT_PARAM_GRIDCOLS_CRITERIA_BUTTONS = 2; // Block with criteria buttons Apply & Clear
var C_REPORT_PARAM_GRIDCOLS_DATERANGEPICKER = 4;
var C_REPORT_CRITERIA_ROW_ID_TEMPLATE = 'prevu_criteria_row_{0}';
var currentParameterName = null;
var updateCriteriaOnParameterName = null; // Parameter name, which triggers criteria recreate
var foundReportParameters = []; // Report parameters, got from server
var reportParametersIndex = {}; // Index fo report parameters list
var createriaNeedUpdate = false;
var controlTemplates = null; // List of control templates - got from report template
var showInitialMessage = true;
var criteriaValidationOn = false;
// Pend criteria to recreate
function invalidateCriteria() {
createriaNeedUpdate = true;
foundReportParameters = [];
reportParametersIndex = {};
}
// Strores locally control templates for report criteria controls
function storeControlTemplates(options) {
if (options && options.templates && !controlTemplates) {
controlTemplates = $.extend({}, options.templates);
}
}
// Returns criteria control template by template Id (in report template file)
function getControlTemplate(templateId) {
var result = '';
if (controlTemplates) {
var keys = Object.keys(controlTemplates);
if (keys && (keys.indexOf(templateId) >= 0))
result = controlTemplates[templateId];
}
return result;
}
// Return parameter info from cache. Remembers this parameter as last accessed.
// If isSpecialParameter = TRUE, doesn't change last accessed parameter name
function getParameterFromCache(paramName, isSpecialParameter) {
var result = null;
var paramNameLow = paramName.toLowerCase();
if (reportParametersIndex) {
var keys = Object.keys(reportParametersIndex);
if (keys.indexOf(paramNameLow) >= 0) {
var paramIndex = reportParametersIndex[paramNameLow];
result = foundReportParameters[paramIndex];
}
}
if (!isSpecialParameter) {
currentParameterName = paramName;
}
// Queue criteria controls to update
if (createriaNeedUpdate) {
queueCriteriaUpdate(paramName);
}
return result;
}
// Adds parameter info to local cache (to the end of the list)
function addParameterToCache(item, paramName) {
if (!foundReportParameters)
foundReportParameters = [];
if (!reportParametersIndex)
reportParametersIndex = {};
var paramNameLow = paramName.toLowerCase();
foundReportParameters.push(item);
reportParametersIndex[paramNameLow] = foundReportParameters.length - 1;
}
// Inserts parameter info to local cache right after specified parameter name
function insertParameterToCache(item, paramName, insertAfterParamName) {
if (!foundReportParameters)
foundReportParameters = [];
if (!reportParametersIndex)
reportParametersIndex = {};
var existingParamIndex = reportParametersIndex[insertAfterParamName.toLowerCase()];
if (existingParamIndex !== undefined)
existingParamIndex++;
else
existingParamIndex = 0;
// Insert parameter
foundReportParameters.splice(existingParamIndex, 0, item);
// Recreate parameters index
for (var index = 0; index < foundReportParameters.length; index++) {
var pName = foundReportParameters[index] && foundReportParameters[index].Info ?
foundReportParameters[index].Info.name : undefined;
if (pName) {
reportParametersIndex[pName.toLowerCase()] = index;
}
}
}
// Creates DOM node for parameter by its info and template
function createParameterByTemplateBase(param) {
var blockName = getParameterBlockName(param.Info.name);
var criteriaRoot = getCriteriaRoot();
var currentGridRow = $(criteriaRoot).find("#" + param.GridRowId);
$(currentGridRow).append('<div>' + param.Template + '</div>');
var block = $(currentGridRow).children().last();
$(block).attr('name', blockName);
$(block).addClass(param.GridClass);
return block;
}
// Creates Select2 control for criteria multiple-value selector
function createSelect2Multi(param) {
createSelect2Internal(param, true);
}
// Creates Select2 control for criteria single-value selector
function createSelect2Single(param) {
createSelect2Internal(param, false);
}
// Creates Select2 control for criteria (internal code)
function createSelect2Internal(param, isMultiselect) {
var adoptedValues = createSelect2Options(param.Info.availableValues);
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var control = $(block).find('[name=editor-placeholder]');
$(control).select2({
allowClear: true,
multiple: isMultiselect,
// minimumResultsForSearch: -1
data: adoptedValues
});
$(control).attr('name', controlName);
$(control).data("select2").val(param.Info.value);
var changeCallBackHandler = param.ChangeHandler;
$(control).on("change", function () {
invalidateCriteria();
var selectionAsText = control.val();
var val = convertSelect2SelectionToArray(selectionAsText);
changeCallBackHandler(param.Info, val);
});
// Add control label
var labelControl = $(block).find('label');
$(labelControl).text(param.Info.text).attr("for", controlName).attr("title", param.Info.text);
// Add validation
addValidationAttributes(block, control, param);
}
// Clears Select2 control value for specified criteria control
function clearSelect2Value(control) {
if (!control)
return;
var isMultiple = $(control).data("select2").opts.multiple;
if (!isMultiple) {
// Select first item
if ($(control).data("select2").opts && $(control).data("select2").opts.data &&
($(control).data("select2").opts.data.length > 0)) {
// Select first option in the select2 list
var selectionId = $(control).data("select2").opts.data[0].id;
$(control).data("select2").val(selectionId);
return;
}
}
$(control).data("select2").val("");
}
// Creates options for select2 from server data values list
function createSelect2Options(dataSource) {
var adoptedValues = [];
if (dataSource && (dataSource.length > 0)) {
$.each(dataSource, function (index, valueItem) {
adoptedValues.push({
id: valueItem.value,
text: valueItem.name
});
});
}
return adoptedValues;
}
// Converts select2 selection (comma separated strings) to array of values
function convertSelect2SelectionToArray(selection) {
if (!selection)
return null;
var options = selection.split(',');
return options;
}
function createDatePicker(param) {
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var pickerControl = $(block).find('.datepicker');
$(pickerControl).datepicker(datePickerOptions);
var pickerInput = $(pickerControl).find('input');
$(pickerInput).attr('name', controlName);
var changeCallBackHandler = param.ChangeHandler;
if (param.Info.value)
$(pickerControl).datepicker('setDate', param.Info.value);
else
$(pickerControl).datepicker('update', '');
$(pickerControl).datepicker(datePickerOptions).on("changeDate", function () {
invalidateCriteria();
var val = pickerControl.datepicker('getDate');
changeCallBackHandler(param.Info, val);
});
// Add control label
var labelControl = $(block).find('label');
$(labelControl).text(param.Info.text).attr("for", controlName).attr("title", param.Info.text);
// Add validation
addValidationAttributes(block, pickerInput, param);
}
function clearDatePickerValue(control) {
$(control).datepicker('update', '');
}
function createDateRangePicker(param) {
var startDateParam = getParameterFromCache("StartDate", true);
var endDateParam = getParameterFromCache("EndDate", true);
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var pickerControl = $(block).find('.input-daterange');
$(pickerControl).attr('name', controlName);
var pickerStartDateControl = $(pickerControl).find('[name=StartDateControl]');
var pickerEndDateControl = $(pickerControl).find('[name=EndDateControl]');
$(pickerControl).datepicker(datePickerOptions);
// We get from server date in local time zone (local time). It differs from selected visible item
// in datepicker by timezone shift. I.e. in the USA Mountain Time zone we select 03/01/2016 in the picker,
// but datepicker treats selected date as UTC, so it returns 02/29/2016 17:00 for Mountine time.
// When we send this date to server, we transform it back to UTC using toISOString(). It becomes
// 2016-03-01 00:00:...
// When we get date from server, it is again in local time zone. In our case, it is 02/29.
// But datepicker assumes the date is UTC, when we pass it to datepicker. So, we must shift
// server date to timezone hours to get 03/01 (a la UTC), but in current time zone. And then
// pass it to picker by setDate()
if (startDateParam.Info.value) {
var startDateCorrected =
new Date(startDateParam.Info.value.getTime() + startDateParam.Info.value.getTimezoneOffset() * 60 * 1000);
$(pickerStartDateControl).data('datepicker').setDate(startDateCorrected);
}
if (endDateParam.Info.value) {
var endDateCorrected =
new Date(endDateParam.Info.value.getTime() + endDateParam.Info.value.getTimezoneOffset() * 60 * 1000);
$(pickerEndDateControl).data('datepicker').setDate(endDateCorrected);
}
$(pickerControl).datepicker(datePickerOptions).on("changeDate", function (event) {
clearReportErrors();
invalidateCriteria();
// Get picked dates in dateRangePicker
var pickedDates = $(pickerControl).data('datepicker').dates;
var pickerStartDate = pickedDates && (pickedDates.length > 0) && (pickedDates[0] instanceof Date) &&
!isNaN(pickedDates[0].getTime()) ? pickedDates[0] : null;
var pickerEndDate = pickedDates && (pickedDates.length > 1) && (pickedDates[1] instanceof Date) &&
!isNaN(pickedDates[1].getTime()) ? pickedDates[1] : null;
var prevStartDateLocal = startDateParam.Info.value ? startDateParam.Info.value.toISOString() : null;
var prevEndDateLocal = endDateParam.Info.value ? endDateParam.Info.value.toISOString() : null;
var pickerStartDateIso = pickerStartDate ? pickerStartDate.toISOString() : null;
var pickerEndDateIso = pickerEndDate ? pickerEndDate.toISOString() : null;
if (pickerStartDateIso != prevStartDateLocal) {
createriaNeedUpdate = true;
startDateParam.ChangeHandler(startDateParam.Info, pickerStartDateIso);
return;
}
if (pickerEndDateIso != prevEndDateLocal) {
createriaNeedUpdate = true;
endDateParam.ChangeHandler(endDateParam.Info, pickerEndDateIso);
}
});
// Add control label
var labelText = startDateParam.Info.text + " / " + endDateParam.Info.text;
var labelControl = $(block).find('label');
$(labelControl).text(labelText).attr("for", controlName).attr("title", labelText);
// Add validation
$(pickerControl).find('input').attr('data-val', 'true');
var optionKeys = Object.keys(startDateParam.Info);
if ((optionKeys.indexOf('allowNull') >= 0) && (startDateParam.Info['allowNull'] === false)) {
$(pickerStartDateControl).attr('data-val-required', 'Start date is required');
}
var optionKeys = Object.keys(endDateParam.Info);
if ((optionKeys.indexOf('allowNull') >= 0) && (endDateParam.Info['allowNull'] === false)) {
$(pickerEndDateControl).attr('data-val-required', 'End date is required');
}
// Add validation for range dates
if (startDateParam.Info.value) {
var startDateCorrected = GetDateTruncated(startDateParam.Info.value);
var startDateText = startDateCorrected.toDateString();
$(pickerEndDateControl).attr('data-val-reportrangedates-mindate', startDateText);
$(pickerEndDateControl).attr('data-val-reportrangedates', 'End Date cannot occur prior to the Start Date');
}
//if (endDateParam.Info.value) {
// var endDateCorrected = GetDateTruncated(endDateParam.Info.value);
// var endDateText = endDateCorrected.toDateString();
// $(pickerStartDateControl).attr('data-val-reportrangedates-maxdate', endDateText);
// $(pickerStartDateControl).attr('data-val-reportrangedates', 'End Date cannot occur prior to the Start Date');
//}
}
function clearDateRangePicker(control) {
var paramName = 'DateRangePicker';
var blockName = getParameterBlockName(paramName);
var criteriaRoot = getCriteriaRoot();
var block = $(criteriaRoot).find('[name=' + blockName + ']');
var pickerControl = $(block).find('.input-daterange');
$(pickerControl).find('[name=StartDateControl]').data('datepicker').setDate(null);
$(pickerControl).find('[name=EndDateControl]').data('datepicker').setDate(null);
}
function createSwitcher(param) {
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var checkboxControl = $(block).find('input');
$(checkboxControl).switcher({
on_state_content: 'Yes',
off_state_content: 'No'
}).parent().css("width", "80px");
$(checkboxControl).attr('name', controlName)
var changeCallBackHandler = param.ChangeHandler;
if (param.Info.value)
$(checkboxControl).prop("checked", true);
else
$(checkboxControl).prop("checked", false);
$(checkboxControl).on("change", function () {
invalidateCriteria();
var val = checkboxControl.prop("checked");
changeCallBackHandler(param.Info, val);
});
// Add control label
var labelControl = $(block).find('label');
$(labelControl).text(param.Info.text).attr("for", controlName).attr("title", param.Info.text);
}
function clearSwitcherValue(control) {
$(control).switcher('off');
}
function createNumberEditor(param) {
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var control = $(block).find('input');
$(control).attr('name', controlName)
var changeCallBackHandler = param.ChangeHandler;
$(control).val(param.Info.value);
$(control).on("change", function () {
invalidateCriteria();
var val = $(control).val();
changeCallBackHandler(param.Info, val);
});
// Add control label
var labelControl = $(block).find('label');
$(labelControl).text(param.Info.text).attr("for", controlName).attr("title", param.Info.text);
// Add validation
addValidationAttributes(block, control, param);
}
function clearNumberEditorValue(control) {
$(control).val('');
}
function createTextEditor(param) {
var controlName = getParameterControlName(param.Info.name);
var block = createParameterByTemplateBase(param);
var control = $(block).find('input');
$(control).attr('name', controlName)
var changeCallBackHandler = param.ChangeHandler;
$(control).val(param.Info.value);
$(control).on("change", function () {
invalidateCriteria();
var val = $(control).val();
changeCallBackHandler(param.Info, val);
});
// Add control label
var labelControl = $(block).find('label');
$(labelControl).text(param.Info.text).attr("for", controlName).attr("title", param.Info.text);
// Add validation
addValidationAttributes(block, control, param);
}
function clearTextEditorValue(control) {
$(control).val('');
}
function createCriteriaButtons(param) {
var block = createParameterByTemplateBase(param);
var applyButton = $(block).find('[name=renderReportBtn]');
var clearButton = $(block).find('[name=clearCriteriaBtn]');
$(applyButton).click(startRenderReport);
$(clearButton).click(clearReportCriteria);
}
function postProcessParameters() {
// Possible change of separate dates to daterange picker
var startDateParam = getParameterFromCache("StartDate", true);
var endDateParam = getParameterFromCache("EndDate", true);
if (startDateParam && endDateParam) {
registerDateRangeEditor();
}
}
var multiSelect = null;
$(document).on("select-show", selectShow);
$(document).on("select-choice", selectShow);
function selectShow() {
if (multiSelect) {
multiSelect = null;
}
}
$(document).on("select2-open", selectOpen);
function selectOpen(e) {
multiSelect = e[0];
}
$(document).on("select-init", selectInit);
function selectInit(e) {
var select = e[0];
var selectName = $(select.container[0]).parent().parent().attr('name');
if (multiSelect && selectName) {
var curentSelectName = $(multiSelect.container[0]).parent().parent().attr('name');
if (selectName === curentSelectName) {
multiSelect = select;
}
}
}
$(document).on("date-time-blur", dateTimeBlur);
function dateTimeBlur(e) {
var datePicker = e[0];
var inputValue = e[1];
if (!datePicker.picker.is(':visible') && inputValue !== "") {
var day, year, month;
try {
var inputValueArr = inputValue.split("/");
day = parseInt(inputValueArr[1]);
year = parseInt(inputValueArr[2]);
month = parseInt(inputValueArr[0])-1;
} catch (err) {
day = datePicker.viewDate.getUTCDate();
year = datePicker.viewDate.getUTCFullYear();
month = datePicker.viewDate.getUTCMonth();
}
datePicker._setDate(UTCDate(year, month, day));
datePicker.fill();
if (datePicker.o.autoclose)
datePicker.hide();
}
}
function UTCDate() {
return new Date(Date.UTC.apply(Date, arguments));
}
function rebuildCriteria() {
if (multiSelect) {
multiSelect.close();
multiSelect.cancel();
}
var focusedElement = $(':focus');
if (!foundReportParameters || !reportParametersIndex || (foundReportParameters.length < 1))
return;
if (!updateCriteriaOnParameterName || (updateCriteriaOnParameterName.length < 1)) {
updateCriteriaOnParameterName = currentParameterName;
currentParameterName = null;
}
// Add buttons to criteria
registerCriteriaButtons();
// Perform parameters post-processing
postProcessParameters();
createCriteriaLayoutRows();
for (var index = 0; index < foundReportParameters.length; index++) {
var currentParamItem = foundReportParameters[index];
if (currentParamItem.Visible) {
if ((typeof currentParamItem.Builder == 'function') && currentParamItem.GridRowId &&
(currentParamItem.GridRowId.length > 0))
currentParamItem.Builder(currentParamItem);
}
}
// Enable validation
attachCustomValidation();
createriaNeedUpdate = false;
var focusedElementName = focusedElement.attr('name');
var needFocusElement = $('input[name=' + focusedElementName + ']');
needFocusElement.focus();
if (multiSelect) {
multiSelect.open();
multiSelect = null;
}
}
function createCriteriaLayoutRows() {
var criteriaRoot = getCriteriaRoot();
$(criteriaRoot).html('');
var colCounter = 13;
var rowCounter = 0;
var currentRowId = "";
for (var index = 0; index < foundReportParameters.length; index++) {
if (foundReportParameters[index].Visible) {
var currentParamColsNeed = foundReportParameters[index].GridColumns;
if ((colCounter + currentParamColsNeed) > 12) {
currentRowId = createCriteriaRow(criteriaRoot, rowCounter);
rowCounter++;
colCounter = 0;
}
foundReportParameters[index].GridRowId = currentRowId;
foundReportParameters[index].GridClass = 'col-sm-' + currentParamColsNeed;
colCounter += currentParamColsNeed;
}
}
}
function queueCriteriaUpdate(currentParamName) {
if (updateCriteriaOnParameterName && (updateCriteriaOnParameterName.length > 0) &&
(updateCriteriaOnParameterName == currentParamName)) {
window.setTimeout(function () {
rebuildCriteria();
}, 100);
}
}
function createCriteriaRow(criteriaRoot, rowIndex) {
var rowId = C_REPORT_CRITERIA_ROW_ID_TEMPLATE.replace('{0}', rowIndex);
var rowHtml = '<div class="row padding-sm" id="' + rowId + '"></div>';
$(criteriaRoot).append(rowHtml);
return rowId;
}
function getReportRoot() {
var result = $("#reportViewer1");
return result;
}
function getCriteriaRoot() {
var reportRoot = getReportRoot();
var result = $(reportRoot).find("[data-role=prevu_Reporting_ParametersArea]");
return result;
}
function getParameterBlockName(paramName) {
return 'rpblock_' + paramName;
}
function getParameterControlName(paramName) {
return 'rpctrl_' + paramName;
}
function getForm() {
var result = $("#reportViewer1").find('form#reportParametersFrm');
return result;
}
function attachCustomValidation() {
var reportForm = getForm();
if (reportForm.length > 0) {
reportForm.removeData("validator").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parseDynamicContent('form#reportParametersFrm');
$(reportForm).validate();
}
}
function startRenderReport() {
criteriaValidationOn = true;
var reportForm = getForm();
if (reportForm.valid()) {
clearReportErrors();
removeInitialMessage();
$('.trv-parameters-area-footer').find('#genericReportRenderBtn').click();
}
}
function clearReportCriteria() {
//clearReportErrors();
//if (!foundReportParameters || (foundReportParameters.length < 1))
// return;
//var criteriaRoot = getCriteriaRoot();
//for (var index = 0; index < foundReportParameters.length; index++) {
// var currentParam = foundReportParameters[index];
// if (currentParam.ClearValue && (typeof currentParam.ClearValue === 'function')) {
// var controlName = getParameterControlName(currentParam.Info.name);
// var controlItem = $(criteriaRoot).find("[name=" + controlName + "]");
// if (controlItem && (controlItem.length > 0)) {
// currentParam.ClearValue(controlItem);
// }
// }
//}
// SA: Instead of correct clearing of values in the criteria controls,
// we reload report page. So it moves to it's initial state
document.location.reload(true);
}
function registerMultiSelectEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-available-values-multiselect');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_MULTISELECT;
paramCacheItem.Info = param;
paramCacheItem.Builder = createSelect2Multi;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearSelect2Value;
}
};
}
function registerSingleSelectEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-available-values');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_SINGLESELECT;
paramCacheItem.Info = param;
paramCacheItem.Builder = createSelect2Single;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearSelect2Value;
}
};
}
function registerDateEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-datetime');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_DATEPICKER;
paramCacheItem.Info = param;
paramCacheItem.Builder = createDatePicker;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearDatePickerValue;
}
};
}
function registerSwitcherEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-boolean');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_SWITCHER;
paramCacheItem.Info = param;
paramCacheItem.Builder = createSwitcher;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearSwitcherValue;
}
};
}
function registerNumberEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-number');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_NUMBER_EDITOR;
paramCacheItem.Info = param;
paramCacheItem.Builder = createNumberEditor;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearNumberEditorValue;
}
};
}
function registerTextEditor(placeholder, options) {
storeControlTemplates(options);
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-text');
var changeHandler = options.parameterChanged;
return {
beginEdit: function (param) {
var paramCacheItem = getParameterFromCache(param.name);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, param.name);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_TEXT_EDITOR;
paramCacheItem.Info = param;
paramCacheItem.Builder = createTextEditor;
paramCacheItem.ChangeHandler = changeHandler;
paramCacheItem.ClearValue = clearTextEditorValue;
}
};
}
function registerCriteriaButtons() {
var controlTemplateHtml = getControlTemplate('trv-parameter-action-buttons');
var paramName = 'CriteriaButtons';
var paramCacheItem = getParameterFromCache(paramName, true);
if (!paramCacheItem) {
paramCacheItem = {};
paramCacheItem.Visible = true;
addParameterToCache(paramCacheItem, paramName);
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_CRITERIA_BUTTONS;
paramCacheItem.Info = {
name: paramName
};
paramCacheItem.Builder = createCriteriaButtons;
}
function registerDateRangeEditor() {
var controlTemplateHtml = getControlTemplate('trv-parameter-editor-daterange');
var startDateParam = getParameterFromCache("StartDate", true);
var endDateParam = getParameterFromCache("EndDate", true);
if (!startDateParam || !endDateParam)
return;
// Hide source date controls
startDateParam.Visible = false;
endDateParam.Visible = false;
var paramName = 'DateRangePicker';
var paramCacheItem = getParameterFromCache(paramName, true);
if (!paramCacheItem) {
paramCacheItem = {
Visible: true,
Info: {
name: paramName
}
};
insertParameterToCache(paramCacheItem, paramName, "StartDate");
}
paramCacheItem.Template = controlTemplateHtml;
paramCacheItem.GridColumns = C_REPORT_PARAM_GRIDCOLS_DATERANGEPICKER;
paramCacheItem.Info = {
name: paramName
};
paramCacheItem.Builder = createDateRangePicker;
paramCacheItem.ClearValue = clearDateRangePicker;
}
function displayReportError(errorText) {
var reportRoot = getReportRoot();
var errorPannelRoot = $(reportRoot).find('#reportErrorPlaceholder');
$(errorPannelRoot).find('div').text(errorText);
$(errorPannelRoot).css('display', 'block');
}
function clearReportErrors() {
criteriaValidationOn = false;
// Hide report general error block
var reportRoot = getReportRoot();
var errorPannelRoot = $(reportRoot).find('#reportErrorPlaceholder');
$(errorPannelRoot).css('display', 'none');
// Hide controls individual errors
var formRoot = getForm();
var validator = formRoot.validate();
var errors = formRoot.find(".field-validation-error span");
// Trick unobtrusive to think the elements were succesfully validated.
// This removes the validation messages
errors.each(function () {
validator.settings.success($(this));
})
// Clear errors from validation
validator.resetForm();
}
function rptError(e, args) {
//args = args.replace(/Error creating report instance \(.*?\).<br\/>Missing or invalid parameter value. Please input valid data for all parameters./gi, "Please enter valid filter parameters");
if (args) {
if (args.indexOf('Missing or invalid parameter value') < 0)
displayReportError(args);
}
}
function addInitialMessage() {
var reportRoot = getReportRoot();
var getReportPage = $(reportRoot).find('.trv-page-wrapper');
if (getReportPage && (getReportPage.length > 0)) {
var pageHtml = $(getReportPage).html();
if (!pageHtml || (pageHtml.trim().length < 1)) {
getReportPage.html('<div class="report-initial-message">' +
'Please complete the criteria and click "Apply" to generate the report' + '</div>');
}
}
}
function removeInitialMessage() {
var reportRoot = getReportRoot();
var initialMessage = $(reportRoot).find('.report-initial-message');
if (initialMessage && (initialMessage.length > 0)) {
$(initialMessage).parent().empty();
}
showInitialMessage = false;
}
function updateReportUi() {
if (foundReportParameters && reportParametersIndex && (foundReportParameters.length > 0) && showInitialMessage)
addInitialMessage();
rebuildCriteria();
var buildExportMenu = false;
var srcMainMenu = $('#reportViewer1').find('ul.trv-menu-large[data-role=telerik_ReportViewer_MainMenu]');
var dstMainMenu = $('#reportViewer1').find('div.btn-toolbar');
var srcMenuItems = srcMainMenu.find('*[data-command]');
$.each(srcMenuItems, function (index, srcItem) {
var dataCommand = $(srcItem).attr('data-command');
var dstItem = $(dstMainMenu).find('*[data-command=' + dataCommand + ']');
var srcParentLi = $(srcItem).parent('li');
if (srcParentLi && (srcParentLi.length > 0)) {
if ($(srcParentLi).hasClass('k-state-disabled')) {
dstItem.addClass('disabled');
if (dataCommand == 'telerik_ReportViewer_export') {
$(dstItem).off("click");
}
}
else {
dstItem.removeClass('disabled');
if (dataCommand == 'telerik_ReportViewer_export') {
buildExportMenu = true;
$(dstItem).off("click").on("click", function (event) {
showExportMenu(event);
});
}
}
}
});
if (buildExportMenu) {
getExportMenu();
}
}
function getExportMenu() {
var srcExportMenuButton = $('#reportViewer1').find('.trv-menu-large[data-role=telerik_ReportViewer_MainMenu]')
.find('[data-command=telerik_ReportViewer_export]');
var ulElement = srcExportMenuButton.parent();
$(ulElement).mouseover();
$(ulElement).click();
}
function needToBuildExportMenu() {
var srcExportMenuButton = $('#reportViewer1').find('.trv-menu-large[data-role=telerik_ReportViewer_MainMenu]')
.find('[data-command-list=export-format-list]');
var innerHtml = $(srcExportMenuButton).html().trim();
return (!innerHtml || (innerHtml.length < 1));
}
function showExportMenu(event) {
var srcExportMenuButton = $('#reportViewer1').find('.trv-menu-large[data-role=telerik_ReportViewer_MainMenu]')
.find('[data-command-list=export-format-list]');
var exportMenuItems = $(srcExportMenuButton).find('li');
if (exportMenuItems.length > 0) {
var dstMainMenu = $('#reportViewer1').find('div.btn-toolbar');
var dstExportMenuButton = $(dstMainMenu).find('[data-command=telerik_ReportViewer_export]');
var dstExportMenuList = $(dstExportMenuButton).parent().find('ul');
$(dstExportMenuList).html('').append(exportMenuItems);
$(dstExportMenuList).find('li').removeAttr('class');
$(dstExportMenuList).find('a').removeAttr('class');
}
}
function addValidationAttributes(block, control, param) {
if (!param || !param.Info || !control)
return;
// Add link to validatable control
var controlName = $(control).attr('name');
var validationMessageControl = $(block).find('.field-validation-valid');
validationMessageControl.attr('data-valmsg-for', controlName);
$(control).attr('data-val', 'true');
var optionKeys = Object.keys(param.Info);
if ((optionKeys.indexOf('allowNull') >= 0) && (param.Info['allowNull'] === false)) {
$(control).attr('data-val-required', 'Value is required');
}
}
function toggleCriteriaDisplay(sender) {
if (!sender)
return;
$(sender).toggleClass("active");
var buttonState = $(sender).hasClass("active")
var criteriaRoot = getCriteriaRoot();
if (buttonState)
$(criteriaRoot).css('display', 'block');
else
$(criteriaRoot).css('display', 'none');
}
function GetDateTruncated(datetime) {
if (!datetime)
return null;
return new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate());
}
$.validator.addMethod('reportrangedates', function (value, element, params) {
if (!value || !params || !criteriaValidationOn)
return true;
var checkableDate = new Date(value);
if (params['mindate']) {
var minDate = new Date(params['mindate']);
if (checkableDate < minDate) {
$.validator.messages.reportrangedates = 'Date must be greater ' + params['mindate'];
return false;
}
}
if (params['maxdate']) {
var maxDate = new Date(params['maxdate']);
if (checkableDate > maxDate) {
$.validator.messages.reportrangedates = 'Date must be less ' + params['maxdate'];
return false;
}
}
return true;
});
$.validator.unobtrusive.adapters.add('reportrangedates', ['mindate', 'maxdate'],
function (options) {
options.rules['reportrangedates'] = options.params;
options.messages["reportrangedates"] = options.message;
}
);