HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/RMourik/bassol.nl/CMS/CMSModules/AdminControls/Controls/Class/QueryEdit.ascx.cs
using System;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;

using CMS.DataEngine;
using CMS.ExtendedControls.ActionsConfig;
using CMS.Helpers;
using CMS.Base;
using CMS.UIControls;
using CMS.Modules;

public partial class CMSModules_AdminControls_Controls_Class_QueryEdit : CMSUserControl
{
    #region "Variables"

    private bool mShowHelp = true;
    private string mQueryName;
    private CMSMasterPage mCurrentMaster;
    private QueryInfo mQuery;
    private bool? mQueriesCanBeEdited;
    private ResourceInfo mModule;

    #endregion


    #region "Properties"

    /// <summary>
    /// ID of the current query.
    /// </summary>
    public int QueryID
    {
        get;
        set;
    }


    /// <summary>
    /// ID of the class current query belongs to.
    /// </summary>
    public int ClassID
    {
        get;
        set;
    }


    /// <summary>
    /// Indicates whether the help should be displayed in the bottom of the page.
    /// </summary>
    public bool ShowHelp
    {
        get
        {
            return mShowHelp;
        }
        set
        {
            mShowHelp = value;
        }
    }


    /// <summary>
    /// Page that should be refreshed after button click.
    /// </summary>
    public string RefreshPageURL
    {
        get;
        set;
    }


    /// <summary>
    /// If true, control is used in site manager.
    /// </summary>
    public bool IsSiteManager
    {
        get
        {
            return filter.IsSiteManager;
        }
        set
        {
            filter.IsSiteManager = value;
        }
    }


    /// <summary>
    /// Gets or sets whether the control is in dialog mode.
    /// </summary>
    public bool DialogMode
    {
        get;
        set;
    }


    /// <summary>
    /// Gets or sets whether the control is in edit mode.
    /// </summary>
    public bool EditMode
    {
        get;
        set;
    }


    /// <summary>
    /// Query to edit.
    /// </summary>
    private QueryInfo Query
    {
        get
        {
            return mQuery;
        }
        set
        {
            mQuery = value;

            // Assigning null to EditedObject throws exception
            if (value != null)
            {
                UIContext.EditedObject = value;
            }
        }
    }


    /// <summary>
    /// Name of the class query belongs to.
    /// </summary>
    private string ClassName
    {
        get;
        set;
    }


    /// <summary>
    /// Name of the actual query.
    /// </summary>
    private string QueryName
    {
        get
        {
            return mQueryName;
        }
        set
        {
            mQueryName = value;
        }
    }


    /// <summary>
    /// Indicates if control is enabled.
    /// </summary>
    public bool Enabled
    {
        get
        {
            return pnlContainer.Enabled;
        }
        set
        {
            pnlContainer.Enabled = value;
        }
    }


    /// <summary>
    /// Gets or sets module identifier.
    /// </summary>
    public int ModuleID
    {
        get;
        set;
    }


    /// <summary>
    /// Gets the module to which the query belongs.
    /// </summary>
    private ResourceInfo Module
    {
        get
        {
            return mModule ?? (mModule = ResourceInfoProvider.GetResourceInfo(ModuleID));
        }
    }


    /// <summary>
    /// Gets whether queries in the current UIContext can be deleted, cloned, created or modified.
    /// </summary>
    private bool QueriesCanBeEdited
    {
        get
        {
            if (!mQueriesCanBeEdited.HasValue)
            {
                DataClassInfo classInfo = GetClass();
                bool result = (classInfo == null) || classInfo.ClassIsDocumentType || classInfo.ClassIsCustomTable || classInfo.ClassShowAsSystemTable;
                if (!result)
                {
                    ModuleID = classInfo.ClassResourceID;
                    result = ((Module != null) && Module.IsEditable);
                }
                mQueriesCanBeEdited = result;
            }
            return mQueriesCanBeEdited.Value;
        }
    }

    #endregion


    #region "Methods"

    protected void Page_Init(object sender, EventArgs e)
    {
        // Register save
        ComponentEvents.RequestEvents.RegisterForEvent(ComponentEvents.SAVE, (s, args) => Save(false));

        mCurrentMaster = Page.Master as CMSMasterPage;

        if (mCurrentMaster == null)
        {
            throw new Exception("Page using this control must have CMSMasterPage master page.");
        }

        txtQueryText.FullScreenParentElementID = "divContent";
    }


    protected void Page_Load(object sender, EventArgs e)
    {
        // Initialize the control
        SetupControl();

        if (!RequestHelper.IsPostBack())
        {
            // Shows that the query was created or updated successfully
            if (QueryHelper.GetInteger("saved", 0) == 1)
            {
                ShowChangesSaved();
            }
        }
    }


    /// <summary>
    /// Generate default query.
    /// </summary>
    protected void btnGenerate_Click(object sender, EventArgs e)
    {
        rblQueryType.SelectedIndex = 0;
        try
        {
            txtQueryText.Text = SqlGenerator.GetSqlQuery(ClassName, SqlGenerator.GetQueryType(QueryName), null);
        }
        catch (Exception ex)
        {
            ShowError(ex.Message);
        }
    }


    public bool Save(bool closeOnSave)
    {
        // Validate query name for emptiness and code name format
        string result = new Validator()
            .NotEmpty(txtQueryName.Text.Trim(), GetString("queryedit.erroremptyqueryname"))
            .IsIdentifier(txtQueryName.Text.Trim(), GetString("queryedit.querynameformat"))
            .Result;

        // If the entries were successfully validated
        if (result != string.Empty)
        {
            ShowError(result);
            return false;
        }

        bool isSaved;

        if (filter.Visible)
        {
            ClassID = filter.ClassId;
            ClassName = DataClassInfoProvider.GetClassName(filter.ClassId);
        }

        // Gets full query name in the form - "ClassName.QueryName"
        string fullQueryName = !string.IsNullOrEmpty(ClassName) ? string.Concat(ClassName, ".", txtQueryName.Text) : txtQueryName.Text;

        // Finds whether new or edited query is unique in the document type
        var newQuery = QueryInfoProvider.GetQueryInfoFromDB(fullQueryName);
        if (newQuery != null)
        {
            // Check if it is the same query as one being edited
            if (newQuery.QueryID != QueryID)
            {
                // The new query tries to use the same code name
                ShowError(GetString("queryedit.errorexistingqueryid"));
                return false;
            }

            Query = newQuery;
            isSaved = SaveQuery();
        }
        else
        {
            // Query with specified name doesn't exist yet            
            isSaved = SaveQuery();
        }

        // If the query was successfully saved
        RedirectOnSave(isSaved, closeOnSave);

        if (isSaved)
        {
            ShowChangesSaved();
        }

        return true;
    }


    /// <summary>
    /// Gets the class to which belongs currently edited query or the query that's being created.
    /// </summary>
    /// <returns>Class to which belongs currently edited query or the query that's being created</returns>
    private DataClassInfo GetClass()
    {
        DataClassInfo classInfo = null;

        if ((Query == null) && (QueryID > 0))
        {
            Query = QueryInfoProvider.GetQueryInfo(QueryID);
        }
        if (Query != null)
        {
            if (Query.ClassID > 0)
            {
                classInfo = DataClassInfoProvider.GetDataClassInfo(Query.ClassID);
            }
            if ((classInfo == null) && ClassID > 0)
            {
                classInfo = DataClassInfoProvider.GetDataClassInfo(ClassID);
            }
            if ((classInfo == null) && !String.IsNullOrEmpty(ClassName))
            {
                classInfo = DataClassInfoProvider.GetDataClassInfo(ClassName);
            }
        }

        return classInfo;
    }


    /// <summary>
    /// Initializes the controls.
    /// </summary>
    private void SetupControl()
    {
        mQueryName = GetString("queryedit.newquery");

        DataClassInfo queryClass = null;

        // If the existing query is being edited
        if (QueryID > 0)
        {
            // Get information on existing query
            Query = QueryInfoProvider.GetQueryInfo(QueryID);
            if (Query != null)
            {
                queryClass = DataClassInfoProvider.GetDataClassInfo(Query.ClassID);
                ClassName = queryClass.ClassName;
                QueryName = Query.QueryName;

                if (!RequestHelper.IsPostBack())
                {
                    // Fills form with the existing query information
                    LoadValues();
                    txtQueryText.Focus();
                }
            }
        }
        else if (ClassID > 0)
        {
            queryClass = DataClassInfoProvider.GetDataClassInfo(ClassID);
            if (queryClass == null)
            {
                // For situation when object is deleted in another tab
                RedirectToInformation("editedobject.notexists");
            }

            // New query is being created
            Query = new QueryInfo();
            ClassName = queryClass.ClassName;

            if (!RequestHelper.IsPostBack())
            {
                ucSelectString.Value = queryClass.ClassConnectionString;
            }

            txtQueryName.Focus();
        }

        plcLoadGeneration.Visible = SystemContext.DevelopmentMode;

        // Ensure generate button and custom checkbox for default queries
        if (SqlGenerator.IsSystemQuery(QueryName))
        {
            btnGenerate.Visible = true;
        }

        // Initialize the validator
        RequiredFieldValidatorQueryName.ErrorMessage = GetString("queryedit.erroremptyqueryname");

        if (ShowHelp)
        {
            DisplayHelperTable();
        }

        // Filter available only when creating new query in dialog mode
        plcDocTypeFilter.Visible = filter.Visible = DialogMode && !EditMode;

        // Set filter preselection 
        if (plcDocTypeFilter.Visible)
        {
            filter.SelectedValue = QueryHelper.GetString("selectedvalue", null);
            filter.FilterMode = QueryInfo.OBJECT_TYPE;
        }

        // Hide header actions when creating new query in dialog mode
        if ((DialogMode && !EditMode) || !Visible)
        {
            mCurrentMaster.HeaderActions.ActionsList.Clear();
        }

        txtQueryName.Enabled = !DialogMode || !EditMode;

        // Set dialog's content panel CSS class
        if (DialogMode)
        {
            Panel pnlContent = EditMode ? mCurrentMaster.PanelContent : pnlContainer;
            pnlContent.CssClass = "PageContent";
        }


        if (!QueriesCanBeEdited)
        {
            // Disable customization for module not in development and not customizable class
            pnlCustomization.StopProcessing = true;
            HeaderAction save = HeaderActions.ActionsList.FirstOrDefault(a => a is SaveAction);
            if (save != null)
            {
                save.Enabled = false;
                ShowInformation(GetString("cms.query.customization.disabled"));
            }
        }
        else
        {
            if ((Module != null) && !Module.IsEditable)
            {
                // Enable customization system tables in modules not in development (this includes different header-actions)
                pnlCustomization.HeaderActions = HeaderActions;
                pnlCustomization.MessagesPlaceHolder = MessagesPlaceHolder;
            }

            // Normal processing for new queries and queries in document types etc.
            pnlCustomization.StopProcessing = true;
        }
    }


    /// <summary>
    /// Displays helper table with transformation examples.
    /// </summary>
    private void DisplayHelperTable()
    {
        // Add header row
        TableHeaderRow headerRow = new TableHeaderRow
        {
            TableSection = TableRowSection.TableHeader,
            CssClass = "unigrid-head"
        };
        headerRow.Cells.Add(new TableHeaderCell
        {
            Text = GetString("queryedit.helpcaption")
        });
        headerRow.Cells.Add(new TableHeaderCell
        {
            Text = GetString("queryedit.helpdescription"),
            CssClass = "main-column-100"
        });
        tblHelp.Rows.Add(headerRow);

        // Add macro rows
        string[,] rows =
			{
				{ "##WHERE##", GetString("queryedit.help_where") },
				{ "##TOPN##", GetString("queryedit.help_topn") },
				{ "##ORDERBY##", GetString("queryedit.help_orderby") },
				{ "##COLUMNS##", GetString("queryedit.help_columns") }
			};

        for (int i = 0; i <= rows.GetUpperBound(0); i++)
        {
            TableRow macroRow = new TableRow();
            macroRow.Cells.Add(new TableCell
            {
                Text = rows[i, 0]
            });
            macroRow.Cells.Add(new TableCell
            {
                Text = rows[i, 1]
            });
            tblHelp.Rows.Add(macroRow);
        }

        // Make help table visible on click only
        tblHelp.Attributes["style"] = "display: none;";
    }


    /// <summary>
    /// Loads values from query.
    /// </summary>
    private void LoadValues()
    {
        txtQueryName.Text = QueryName;
        rblQueryType.SelectedValue = Query.QueryType.ToString();
        chbTransaction.Checked = Query.QueryRequiresTransaction;
        txtQueryText.Text = Query.QueryText;
        drpGeneration.Value = Query.QueryLoadGeneration;
        ucSelectString.Value = Query.QueryConnectionString;
    }


    /// <summary>
    /// Saves new or edited query of the given name and returns to the query list.
    /// </summary>
    /// <returns>True if query was successfully saved</returns>
    private bool SaveQuery()
    {
        // The query ID was specified, edit existing
        bool existing = (QueryID > 0);

        DataClassInfo dci = DataClassInfoProvider.GetDataClassInfo(ClassName);
        if (dci == null)
        {
            ShowError(GetString("editedobject.notexists"));
            return false;
        }

        if (!QueriesCanBeEdited)
        {
            ShowError(GetString("cms.query.customization.createdisabled"));
            return false;
        }

        QueryInfo newQuery = existing ? QueryInfoProvider.GetQueryInfo(QueryID) : new QueryInfo();

        // Sets query object's properties
        newQuery.QueryName = txtQueryName.Text;
        newQuery.ClassID = dci.ClassID;

        // Check the query type
        newQuery.QueryType = rblQueryType.SelectedValue == "SQLQuery" ? QueryTypeEnum.SQLQuery : QueryTypeEnum.StoredProcedure;
        newQuery.QueryRequiresTransaction = chbTransaction.Checked;

        // Only for new query
        if (!existing)
        {
            // Set NOT custom only for queries created in development mode or in module in development
            bool custom = (Module == null) || !Module.IsEditable;

            newQuery.QueryIsCustom = custom;
            newQuery.QueryIsLocked = custom;
        }

        newQuery.QueryText = txtQueryText.Text.TrimEnd('\r', '\n');
        newQuery.QueryLoadGeneration = drpGeneration.Value;
        newQuery.QueryConnectionString = ValidationHelper.GetString(ucSelectString.Value, String.Empty);

        // Insert new / update existing query
        QueryInfoProvider.SetQueryInfo(newQuery);

        Query = newQuery;

        return true;
    }


    private void RedirectOnSave(bool isSaved, bool closeOnSave)
    {
        if (RefreshPageURL == null || !isSaved)
        {
            return;
        }

        if (DialogMode)
        {
            // Check for selector ID
            string selector = ScriptHelper.GetString(QueryHelper.GetString("selectorid", string.Empty), false);
            if (!string.IsNullOrEmpty(selector))
            {
                // Add selector refresh
                StringBuilder script = new StringBuilder();
                if (!EditMode)
                {
                    ScriptHelper.RegisterWOpenerScript(Page);
                    script.AppendFormat(@"
						if (wopener) {{                        
							wopener.US_SelectNewValue_{0}('{1}');                        
						}}", selector, Query.QueryFullName);
                }

                script.AppendFormat(@"
						window.name = '{2}';
						window.open('{0}?name={1}&saved=1&editonlycode=true&selectorid={2}&tabmode={3}', window.name);
						", ScriptHelper.ResolveUrl(RefreshPageURL), Query.QueryFullName, selector, QueryHelper.GetInteger("tabmode", 0));

                if (closeOnSave)
                {
                    script.AppendLine("CloseDialog();");
                }

                ScriptHelper.RegisterStartupScript(this, GetType(), "UpdateSelector", script.ToString(), true);
            }
        }
        else
        {
            string redirectUrl = URLHelper.AddParameterToUrl(RefreshPageURL, "saved", "1");
            redirectUrl = URLHelper.AddParameterToUrl(redirectUrl, "parentobjectid", ClassID.ToString());
            redirectUrl = URLHelper.AddParameterToUrl(redirectUrl, "objectid", Query.QueryID.ToString());
            redirectUrl = URLHelper.AddParameterToUrl(redirectUrl, "moduleid", ModuleID.ToString());
            URLHelper.Redirect(redirectUrl);
        }
    }

    #endregion
}