// 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('
' + param.Template + '
'); 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 = '
'; $(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 \(.*?\).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('
' + 'Please complete the criteria and click "Apply" to generate the report' + '
'); } } } 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; } );