1091 lines
33 KiB
JavaScript
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;
|
|
}
|
|
);
|