using System; using System.Collections; using System.Data; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web.UI; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.ExtendedControls; using CMS.FormControls; using CMS.FormEngine; using CMS.GlobalHelper; using CMS.IO; using CMS.Reporting; using CMS.SettingsProvider; using CMS.SiteProvider; public partial class CMSModules_Reporting_Controls_DisplayReport : AbstractReportControl, IDisplayReport { #region "Variables" private string mReportName = ""; private string mReportHTML = ""; private bool mDisplayFilter = true; // DisplayFilter property private bool mDisplayFilterResult = true; // internal display filter based on DisplayFilter and visible elements private bool mSaveMode = false; private bool mLoadFormParameters = true; private ReportInfo mReportInfo = null; private int mSavedReportId = 0; private ArrayList mReportControls = null; private bool wasInit = false; private bool wasPreRender = false; private bool mCheckInnerControls = true; private bool mUseExternalReload = false; private bool mUseProgressIndicator = false; private bool isSave = false; private static Regex mInlineImageRegex = null; private bool reportLoaded = false; #endregion #region "Properties" /// /// Regex object for search inline images in report. /// private static Regex InlineImageRegex { get { if (mInlineImageRegex == null) { mInlineImageRegex = RegexHelper.GetRegex(""); } return mInlineImageRegex; } } /// /// Gets or sets the value that indicates whether progress indicator should be used. /// public bool UseProgressIndicator { get { return mUseProgressIndicator; } set { mUseProgressIndicator = value; } } /// /// Report name. /// public ReportInfo ReportInfo { get { if ((mReportInfo == null) && (!String.IsNullOrEmpty(ReportName))) { mReportInfo = ReportInfoProvider.GetReportInfo(ReportName); } return mReportInfo; } set { mReportInfo = value; } } /// /// Content panel. /// public Panel ReportPanel { get { return pnlContent; } } /// /// Graph possible width of control. /// public int AreaMaxWidth { get { return ValidationHelper.GetInteger(ViewState["AreaMaxWidth"], 0); } set { ViewState["AreaMaxWidth"] = value; } } /// /// If true, reload is not called from this control. /// public bool UseExternalReload { get { return mUseExternalReload; } set { mUseExternalReload = value; } } /// /// BasicForm object. /// public BasicForm ParametersForm { get { return formElem; } } /// /// Returns report display name /// public string ReportDisplayName { get { if (ReportInfo != null) { return ReportInfo.ReportDisplayName; } return null; } } /// /// Report name. /// public string ReportName { get { return mReportName; } set { mReportName = value; } } /// /// Indicates if check inner sub controls. /// public bool CheckInnerControls { get { return mCheckInnerControls; } set { mCheckInnerControls = value; } } /// /// ReportHTML. /// public string ReportHTML { get { return mReportHTML; } set { mReportHTML = value; } } /// /// Display filter. /// public bool DisplayFilter { get { return mDisplayFilter; } set { mDisplayFilter = value; } } /// /// Body CSS class. /// public string BodyCssClass { get { return pnlContent.CssClass; } set { pnlContent.CssClass = value; } } /// /// Form CSS class. /// public string FormCssClass { get { return formElem.CssClass; } set { formElem.CssClass = value; } } /// /// Assigned if parameters will be loaded automaticcaly. /// public bool LoadFormParameters { get { return mLoadFormParameters; } set { mLoadFormParameters = value; } } /// /// Load always default values. /// public bool ForceLoadDefaultValues { get { return ValidationHelper.GetBoolean(ViewState["ForceLoadDefaultValues"], false); } set { ViewState["ForceLoadDefaultValues"] = value; } } /// /// Reloads parameters even if were already inited. /// public bool IgnoreWasInit { get { return ValidationHelper.GetBoolean(ViewState["IgnoreWasInit"], false); } set { ViewState["IgnoreWasInit"] = value; } } /// /// Child report controls. /// public ArrayList ReportControls { get { if (mReportControls == null) { mReportControls = new ArrayList(); // Collect the controls foreach (Control c in pnlContent.Controls) { if (c is AbstractReportControl) { mReportControls.Add(c); } } } return mReportControls; } } #endregion /// /// Load parameters from data form. /// protected void LoadParameters() { if (ReportInfo != null) { // Set the form FormInfo fi = new FormInfo(ReportInfo.ReportParameters); // Get datarow with required columns DataRow dr = fi.GetDataRow(); if (!RequestHelper.IsPostBack() || ForceLoadDefaultValues || !DisplayFilter) { fi.LoadDefaultValues(dr, true); } else if ((!ForceLoadDefaultValues) && (formElem.DataRow != null)) { dr = formElem.DataRow; } // show filter - based on DisplayFilter and number of visible elements mDisplayFilterResult = DisplayFilter && (fi.GetFormElements(true, false).Any()); formElem.DataRow = dr; formElem.SubmitButton.Visible = mDisplayFilterResult; formElem.SubmitButton.RegisterHeaderAction = false; formElem.FormInformation = fi; formElem.SubmitButton.Text = GetString("Report_View.btnUpdate"); formElem.SiteName = CMSContext.CurrentSiteName; formElem.ShowPrivateFields = true; formElem.Mode = FormModeEnum.Insert; formElem.Visible = mDisplayFilterResult; } } /// /// OnInit. /// protected override void OnInit(EventArgs e) { base.OnInit(e); // Load parameters from data form LoadParameters(); // Set wasInit value wasInit = true; // Get handler to OnAfter save formElem.OnAfterSave += formElem_OnAfterSave; } /// /// OnPreRender override. /// protected override void OnPreRender(EventArgs e) { if (RenderCssClasses) { formElem.SubmitButton.CssClass = "SubmitButton"; } bool preloaderRequired = ValidationHelper.GetBoolean(RequestStockHelper.GetItem("CMSGraphAutoWidth"), false); if (UseProgressIndicator && (!preloaderRequired || RequestHelper.IsPostBack())) { ScriptHelper.RegisterProgress(Page); } wasPreRender = true; if (RequestHelper.IsPostBack() && (!UseExternalReload || DisplayFilter)) { try { formElem.SaveData(null); } catch { } } if (!reportLoaded) { ReloadData(true); } // Disable CSS class for filter if filter isn't visible if ((mDisplayFilterResult == false) || (formElem == null) || (ReportInfo == null) || (ReportInfo.ReportParameters == String.Empty) || (ReportInfo.ReportParameters.ToLowerCSafe() == "
")) { formElem.CssClass = String.Empty; } base.OnPreRender(e); } /// /// OnAfterSave handler. /// private void formElem_OnAfterSave(object sender, EventArgs e) { // Only want to react to SaveData() if (wasPreRender) { bool tmpForceLoad = ForceLoadDefaultValues; ForceLoadDefaultValues = false; ReloadData(false); ForceLoadDefaultValues = tmpForceLoad; } else { // Set report parameters for parent control - used for print if (mLoadFormParameters) { ReportParameters = formElem.DataRow; } } } /// /// Reload data. /// public override void ReloadData(bool forceLoad) { pnlContent.Controls.Clear(); mReportControls = null; // Report info must exists if (ReportInfo == null) { return; } // Check permissions for report if (!CheckReportAccess(ReportInfo)) { Visible = false; return; } // If ReloadData is called before Init, load parameters if (!wasInit || IgnoreWasInit) { LoadParameters(); } // Set parameters only if it is allowed if (mLoadFormParameters) { ReportParameters = formElem.DataRow; } // Clear resolver because it can contains old parameters values ClearResolver(); // Build report HTML mReportHTML = ReportInfo.ReportLayout; mReportHTML = ResolveMacros(mReportHTML); mReportHTML = HTMLHelper.ResolveUrls(mReportHTML, null); // For emails - resolve metafile images as inline attachments if (EmailMode) { // Find all inline images MatchCollection coll = InlineImageRegex.Matches(mReportHTML); foreach (Match m in coll) { Guid guid = ValidationHelper.GetGuid(m.Groups[1], Guid.Empty); if (guid != Guid.Empty) { // For all found images, find according metafile MetaFileInfo mfi = MetaFileInfoProvider.GetMetaFileInfo(guid, null, true); if (mfi != null) { // If metafile found add binary representation to inline attachments ReportSubscriptionSender.AddToRequest(ReportName, "g" + guid, mfi.MetaFileBinary); mReportHTML = mReportHTML.Replace(m.Value, "##InlineImage##" + guid + "##InlineImage##"); } } } } // Add the content pnlContent.Controls.Clear(); pnlContent.Controls.Add(new LiteralControl(mReportHTML)); ControlsHelper.ResolveDynamicControls(pnlContent); // Null GraphImageWidh if no graph present to enable load alone tables,values,etc bool containsGraph = mReportHTML.Contains("%%control:ReportGraph?"); if (!containsGraph) { GraphImageWidth = 0; } // Indicates if any item in the report is visible bool itemVisible = false; // Init the child controls foreach (AbstractReportControl ctrl in ReportControls) { if ((CheckInnerControls) && (!ctrl.IsValid(ReportInfo))) { ctrl.Visible = false; continue; } ctrl.RenderCssClasses = RenderCssClasses; ctrl.ReportParameters = ReportParameters; ctrl.ContextParameters = ContextParameters; ctrl.AllParameters = AllParameters; ctrl.SavedReportGuid = Guid.Empty; ctrl.GraphImageWidth = GraphImageWidth; ctrl.DynamicMacros = DynamicMacros; ctrl.TableFirstColumnWidth = TableFirstColumnWidth; ctrl.SelectedInterval = SelectedInterval; ctrl.RenderCssClasses = RenderCssClasses; ctrl.SendOnlyNonEmptyDataSource = SendOnlyNonEmptyDataSource; ctrl.EmailMode = EmailMode; ctrl.ReportSubscriptionSiteID = ReportSubscriptionSiteID; ctrl.SubscriptionInfo = SubscriptionInfo; // Do no generate export context menu for saved graph ctrl.EnableExport = !isSave && EnableExport; if (AreaMaxWidth != 0) { ctrl.ComputedWidth = AreaMaxWidth; } // In save mode must be defined new Guid for graph image and saved reeport id if (mSaveMode) { ctrl.SavedReportGuid = Guid.NewGuid(); ctrl.SavedReportID = mSavedReportId; } if (formElem != null && (!formElem.Visible || formElem.ValidateData())) { ctrl.ReloadData(forceLoad); } if (ctrl.ComputedWidth != 0) { AreaMaxWidth = ctrl.ComputedWidth; } itemVisible = itemVisible || ctrl.Visible; } if (!itemVisible && EmailMode) { Visible = false; } reportLoaded = true; // Display/hide the filtering form formElem.Visible = mDisplayFilterResult; } /// /// Returns true if report is loaded /// public bool IsReportLoaded() { return (ReportInfo != null); } /// /// Saves the report - Returns the saved report ID or 0 if some error was occurred or don't have permissions to this report. /// public int SaveReport() { // Report info must exists if (ReportInfo != null) { // Check permissions for report if (!CheckReportAccess(ReportInfo)) { Visible = false; return 0; } try { // Save saved report info object SavedReportInfo sri = new SavedReportInfo(); sri.SavedReportDate = DateTime.Now; sri.SavedReportGUID = Guid.NewGuid(); sri.SavedReportHTML = String.Empty; sri.SavedReportReportID = ReportInfo.ReportID; sri.SavedReportCreatedByUserID = CMSContext.CurrentUser.UserID; sri.SavedReportParameters = ReportInfo.ReportParameters; string name = ReportInfo.ReportDisplayName; string timeStamp = " - " + DateTime.Now.ToString(); if (name.Length + timeStamp.Length > 200) { name = name.Substring(0, name.Length - (name.Length + timeStamp.Length - 200)); } sri.SavedReportTitle = name + timeStamp; SavedReportInfoProvider.SetSavedReportInfo(sri); // Render control to get HTML code mSavedReportId = sri.SavedReportID; mSaveMode = true; formElem.SaveData(null); isSave = true; ReloadData(true); isSave = false; // Render panel with controls and save it to string StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); Html32TextWriter writer2 = new Html32TextWriter(sw); pnlContent.RenderControl(writer2); // Save HTML to the saved report sri.SavedReportHTML = ResolveMacros(sb.ToString()); sri.SavedReportHTML = HTMLHelper.UnResolveUrls(sri.SavedReportHTML, ResolveUrl("~/")); SavedReportInfoProvider.SetSavedReportInfo(sri); mSaveMode = false; // When no 'read' for reporting - reload data with mSaveMode set to false. This will prevent GetReportGraph.aspx to stop rendering graph. if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.reporting", "read")) { ReloadData(true); } return sri.SavedReportID; } catch { } } return 0; } /// /// Renders control to String representation /// /// This SiteID is used in report query instead of default CMSContext one public String RenderToString(int siteID) { // Change siteID from context to subscription id foreach (DataParameter par in AllParameters) { if (par.Name == "CMSContextCurrentSiteID") { par.Value = siteID; break; } } // Reload data isSave = true; ReloadData(true); isSave = false; // If control is not visible - subscription (report's or all items) is not allowed or no data found if (!Visible) { return String.Empty; } // Render to string StringBuilder sb = new StringBuilder(); StringWriter sw = new StringWriter(sb); Html32TextWriter writer2 = new Html32TextWriter(sw); pnlContent.RenderControl(writer2); return sb.ToString(); } }