using System; using System.Collections.Generic; using System.Data; using System.Collections; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using CMS.ExtendedControls; using CMS.FormControls; using CMS.FormEngine; using CMS.GlobalHelper; using CMS.IO; using CMS.Reporting; using CMS.SettingsProvider; public partial class CMSModules_Reporting_FormControls_ReportItemSelector : FormEngineUserControl { #region "Private variables" private ReportItemType mReportItemType; private int mReportID; private bool mDisplay = true; private DataSet currentDataSet = null; private bool keepDataInWindowsHelper = false; private string firstItemText = String.Empty; private bool mShowItemSelector = true; private ReportInfo ri = null; private bool setValues = false; #endregion #region "Public properties" /// /// Gets or sets the value that indicates whether id value should be used in selector /// public bool UseIDValue { get; set; } /// /// Gets the current data set. /// private DataSet CurrentDataSet { get { DataSet ds = WindowHelper.GetItem(CurrentGuid()) as DataSet; if (DataHelper.DataSourceIsEmpty(ds)) { if (DataHelper.DataSourceIsEmpty(currentDataSet)) { currentDataSet = LoadFromXML(Convert.ToString(ViewState["ParametersXmlData"]), Convert.ToString(ViewState["ParametersXmlSchema"])); } ds = currentDataSet; } return ds; } } /// /// If false control shows only report selector. /// public bool ShowItemSelector { get { return mShowItemSelector; } set { mShowItemSelector = value; } } /// /// Gets or sets field value. /// public override object Value { get { EnsureChildControls(); string usReportsValue = GetString(usReports.Value.ToString()); string usItemsValue = GetString(usItems.Value.ToString()); if (!ShowItemSelector) { if (usReportsValue == "0") { return String.Empty; } return usReportsValue; } else { if ((usReportsValue == "0") || (usItemsValue == "0")) { return String.Empty; } return String.Format("{0};{1}", usReportsValue, usItemsValue); } } set { EnsureChildControls(); // Convert input value to string string values = Convert.ToString(value); // Check whether value is defined if (!String.IsNullOrEmpty(values)) { if (ShowItemSelector) { // Get report name and item name string[] items = values.Split(';'); // Check whether all required items are defined if ((items != null) && (items.Length == 2)) { // Set report and item values usReports.Value = items[0]; usItems.Value = items[1]; } } else { usReports.Value = values; } if ((Form != null) && (Form.Data != null) && !RequestHelper.IsPostBack()) { // Check if the schema information is available IDataContainer data = Form.Data; if (data.ContainsColumn("ParametersXmlSchema") && data.ContainsColumn("ParametersXmlData")) { // Get xml schema and data string schema = Convert.ToString(Form.GetFieldValue("ParametersXmlSchema")); string xml = Convert.ToString(Form.GetFieldValue("ParametersXmlData")); LoadFromXML(xml, schema); } } } } } /// /// Type of report (graph,table,value). /// public ReportItemType ReportType { get { return mReportItemType; } set { mReportItemType = value; } } /// /// Report Id. /// public int ReportID { get { return mReportID; } set { mReportID = value; } } /// /// Gets the item uniselector drop down list client id for javascript use. /// public string UniSelectorClientID { get { EnsureChildControls(); return (string)usItems.DropDownSingleSelect.ClientID; } } /// /// Indicates weather display report drop down list. /// public bool Display { get { return mDisplay; } set { mDisplay = value; } } #endregion #region "Methods" /// /// Returns an array of values of any other fields returned by the control. /// /// It returns an array where first dimension is attribute name and the second dimension is its value. public override object[,] GetOtherValues() { // Get current dataset DataSet ds = CurrentDataSet; // Set properties names object[,] values = new object[2, 2]; values[0, 0] = "ParametersXmlSchema"; values[1, 0] = "ParametersXmlData"; // Check whether dataset is defined if (!DataHelper.DataSourceIsEmpty(ds)) { // Set dataset values values[0, 1] = ds.GetXmlSchema(); values[1, 1] = ds.GetXml(); } return values; } /// /// Loads dataset to windows helper from schema and data xml definitions. /// /// XML data /// XML schema protected DataSet LoadFromXML(string xml, string schema) { // Check whether schema and data are defined if (!String.IsNullOrEmpty(schema) && !String.IsNullOrEmpty(xml)) { //Create data set from xml DataSet ds = new DataSet(); // Load schema StringReader sr = StringReader.New(schema); ds.ReadXmlSchema(sr); // Load data ds.TryReadXml(xml); // Set current dataset WindowHelper.Add(CurrentGuid(), ds); return ds; } return null; } /// /// Builds condition for report selector /// private void BuildReportCondition() { switch (mReportItemType) { case ReportItemType.Graph: usReports.WhereCondition = "EXISTS (SELECT GraphID FROM Reporting_ReportGraph as graph WHERE (graph.GraphIsHtml IS NULL OR graph.GraphIsHtml = 0) AND graph.GraphReportID = ReportID)"; break; case ReportItemType.HtmlGraph: usReports.WhereCondition = "EXISTS (SELECT GraphID FROM Reporting_ReportGraph as graph WHERE (graph.GraphIsHtml = 1) AND graph.GraphReportID = ReportID)"; break; case ReportItemType.Table: usReports.WhereCondition = "EXISTS (SELECT TableID FROM Reporting_ReportTable as reporttable WHERE reporttable.TableReportID = ReportID)"; break; case ReportItemType.Value: usReports.WhereCondition = "EXISTS (SELECT ValueID FROM Reporting_ReportValue as value WHERE value.ValueReportID = ReportID)"; break; // By default do nothing default: break; } } /// /// Builds conditions for particular type of selector. /// protected void BuildConditions() { switch (mReportItemType) { case ReportItemType.Graph: usItems.WhereCondition = "GraphReportID = " + ReportID + " AND (GraphIsHtml IS NULL OR GraphIsHtml = 0)"; usItems.DisplayNameFormat = "{%GraphDisplayName%}"; usItems.ReturnColumnName = UseIDValue ? "GraphID" : "GraphName"; usItems.ObjectType = "reporting.reportgraph"; firstItemText = GetString("rep.graph.pleaseselect"); break; case ReportItemType.HtmlGraph: usItems.WhereCondition = "GraphReportID = " + ReportID + " AND (GraphIsHtml = 1)"; usItems.DisplayNameFormat = "{%GraphDisplayName%}"; usItems.ReturnColumnName = UseIDValue ? "GraphID" : "GraphName"; usItems.ObjectType = "reporting.reportgraph"; firstItemText = GetString("rep.graph.pleaseselect"); break; case ReportItemType.Table: usItems.WhereCondition = "TableReportID = " + ReportID; usItems.ObjectType = "reporting.reporttable"; usItems.DisplayNameFormat = "{%TableDisplayName%}"; usItems.ReturnColumnName = UseIDValue ? "TableID" : "TableName"; firstItemText = GetString("rep.table.pleaseselect"); break; case ReportItemType.Value: usItems.WhereCondition = "ValueReportID = " + ReportID; usItems.ObjectType = "reporting.reportvalue"; usItems.DisplayNameFormat = "{%ValueDisplayName%}"; usItems.ReturnColumnName = UseIDValue ? "ValueID" : "ValueName"; firstItemText = GetString("rep.value.pleaseselect"); break; // By default do nothing default: break; } } /// /// Forces Items Uni select to reload. /// public void ReloadItems() { string selected = usItems.DropDownSingleSelect.SelectedValue; usItems.Reload(true); try { usItems.DropDownSingleSelect.SelectedValue = selected; } catch { } } /// /// Gets GUID from hidden field .. if not there create new one. /// private String CurrentGuid() { // For reloaddata (f.e. webpart save) store guid also in request helper, because hidden is empty after control is reloaded. Guid guid = ValidationHelper.GetGuid(RequestStockHelper.GetItem("wppreportselector"), Guid.Empty); if (hdnGuid.Value == String.Empty) { hdnGuid.Value = (guid == Guid.Empty) ? Guid.NewGuid().ToString() : guid.ToString(); } if (guid == Guid.Empty) { RequestStockHelper.Add("wppreportselector", hdnGuid.Value); } return hdnGuid.Value; } protected override void OnLoad(EventArgs e) { // First item as "please select .." - not default "none" usItems.AllowEmpty = false; usReports.AllowEmpty = false; string[,] specialFields = new string[1, 2]; specialFields[0, 0] = "(" + GetString("rep.pleaseselect") + ")"; specialFields[0, 1] = "0"; usReports.SpecialFields = specialFields; // Disable 'please select' for items selector usItems.MaxDisplayedItems = usItems.MaxDisplayedTotalItems = 1000; BuildReportCondition(); usReports.OnSelectionChanged += usReports_OnSelectionChanged; base.OnLoad(e); } protected override void OnPreRender(EventArgs e) { pnlReports.Attributes.Add("style", "margin-bottom:3px"); string reportName = ValidationHelper.GetString(usReports.Value, String.Empty); ri = ReportInfoProvider.GetReportInfo(reportName); if (ri != null) { usItems.Enabled = true; // Test if there is any item visible in report parameters FormInfo fi = new FormInfo(ri.ReportParameters); // Get dataset from cache DataSet ds = (DataSet)WindowHelper.GetItem(CurrentGuid()); DataRow dr = fi.GetDataRow(); fi.LoadDefaultValues(dr); bool itemVisible = false; List items = fi.ItemsList; foreach (IFormItem item in items) { FormFieldInfo ffi = item as FormFieldInfo; if (ffi != null) { if (ffi.Visible) { itemVisible = true; break; } } } ReportID = ri.ReportID; if (!itemVisible) { plcParametersButtons.Visible = false; } else { plcParametersButtons.Visible = true; } } else { if (ReportID == 0) { plcParametersButtons.Visible = false; usItems.Enabled = false; } } ltlScript.Text = ScriptHelper.GetScript("function refresh () {" + ControlsHelper.GetPostBackEventReference(pnlUpdate, String.Empty) + "}"); usReports.DropDownSingleSelect.AutoPostBack = true; if (!mDisplay) { pnlReports.Visible = false; plcParametersButtons.Visible = false; usItems.Enabled = true; } if (!ShowItemSelector) { pnlItems.Visible = false; } usItems.IsLiveSite = IsLiveSite; usReports.IsLiveSite = IsLiveSite; ugParameters.GridName = "~/CMSModules/Reporting/FormControls/ReportParametersList.xml"; ugParameters.ZeroRowsText = String.Empty; ugParameters.PageSize = "##ALL##"; ugParameters.Pager.DefaultPageSize = -1; BuildConditions(); if (ri == null) { string[,] itemSpecialFields = new string[1, 2]; itemSpecialFields[0, 0] = "(" + firstItemText + ")"; itemSpecialFields[0, 1] = "0"; usItems.SpecialFields = itemSpecialFields; } if (ShowItemSelector) { ReloadItems(); } if (setValues) { WindowHelper.Add(CurrentGuid(), CurrentDataSet); ScriptHelper.RegisterStartupScript(Page, typeof(Page), "OpenModalWindowReportItem", ScriptHelper.GetScript("modalDialog('" + ResolveUrl("~/CMSModules/Reporting/Dialogs/ReportParametersSelector.aspx?ReportID=" + ReportID + "&guid=" + CurrentGuid().ToString()) + "','ReportParametersDialog', 700, 500);")); keepDataInWindowsHelper = true; } // Apply reportid condition if report was selected via uniselector if (ri != null) { FormInfo fi = new FormInfo(ri.ReportParameters); DataRow dr = fi.GetDataRow(); DataSet ds = CurrentDataSet; ViewState["ParametersXmlData"] = null; ViewState["ParametersXmlSchema"] = null; if (!DataHelper.DataSourceIsEmpty(ds)) { ViewState["ParametersXmlData"] = ds.GetXml(); ViewState["ParametersXmlSchema"] = ds.GetXmlSchema(); } if (!keepDataInWindowsHelper) { WindowHelper.Remove(CurrentGuid().ToString()); } if (!DataHelper.DataSourceIsEmpty(ds)) { ds = DataHelper.DataSetPivot(ds, new string[] { "ParameterName", "ParameterValue" }); ugParameters.DataSource = ds; ugParameters.ReloadData(); pnlParameters.Visible = true; } else { pnlParameters.Visible = false; } } else { pnlParameters.Visible = false; } base.OnPreRender(e); } protected void btnSet_Click(object sender, EventArgs e) { setValues = true; } protected void btnClear_Click(object sender, EventArgs e) { WindowHelper.Remove(CurrentGuid()); ViewState["ParametersXmlData"] = null; ViewState["ParametersXmlSchema"] = null; } protected void usReports_OnSelectionChanged(object sender, EventArgs ea) { WindowHelper.Remove(CurrentGuid()); ViewState["ParametersXmlData"] = null; ViewState["ParametersXmlSchema"] = null; // Try to set first item if (usItems.DropDownSingleSelect.Items.Count > 0) { usItems.DropDownSingleSelect.SelectedIndex = 0; } } #endregion }