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/wwwroot/CMSModules/Widgets/Controls/WidgetTree.ascx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

using CMS.Helpers;
using CMS.PortalEngine;
using CMS.Base;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.DataEngine;
using CMS.Membership;

public partial class CMSModules_Widgets_Controls_WidgetTree : CMSAdminControl
{
    #region "Variables"

    private int mMaxTreeNodes = -1;
    private bool mUseMaxNodeLimit = true;
    private bool mSelectWidgets = true;
    private bool mShowRecentlyUsed = false;
    private bool mSelectEditorWidgets = false;
    private bool mSelectUserWidgets = false;
    private bool mSelectGroupWidgets = false;
    private bool mSelectInlineWidgets = false;
    private bool mSelectDashboardWidgets = false;
    private bool mUseGlobalSettings = false;

    /// <summary>
    /// Index used for item count under one node.
    /// </summary>
    private int indexMaxTreeNodes = -1;

    #endregion


    #region "Public properties"

    /// <summary>
    /// Indicates whether use max node limit stored in settings.
    /// </summary>
    public bool UseMaxNodeLimit
    {
        get
        {
            return mUseMaxNodeLimit;
        }
        set
        {
            mUseMaxNodeLimit = value;
        }
    }


    /// <summary>
    /// If true, only global settings are used.
    /// </summary>
    public bool UseGlobalSettings
    {
        get
        {
            return mUseGlobalSettings;
        }
        set
        {
            mUseGlobalSettings = value;
        }
    }


    /// <summary>
    /// Maximum tree nodes shown under parent node - this value can be ignored if UseMaxNodeLimit set to false.
    /// </summary>
    public int MaxTreeNodes
    {
        get
        {
            if (mMaxTreeNodes < 0)
            {
                mMaxTreeNodes = SettingsKeyInfoProvider.GetIntValue((UseGlobalSettings ? "" : SiteContext.CurrentSiteName + ".") + "CMSMaxUITreeNodes");
            }
            return mMaxTreeNodes;
        }
        set
        {
            mMaxTreeNodes = value;
        }
    }


    /// <summary>
    /// Gets or sets whether widgets are shown in tree or not.
    /// </summary>
    public bool SelectWidgets
    {
        get
        {
            return mSelectWidgets;
        }
        set
        {
            mSelectWidgets = value;
        }
    }


    /// <summary>
    /// Gets or sets whether recently used link is shown or not.
    /// </summary>
    public bool ShowRecentlyUsed
    {
        get
        {
            return mShowRecentlyUsed;
        }
        set
        {
            mShowRecentlyUsed = value;
        }
    }


    /// <summary>
    /// Gets or sets selected item.
    /// </summary>
    public string SelectedItem
    {
        get
        {
            return treeElem.SelectedItem;
        }
        set
        {
            treeElem.SelectedItem = value;
        }
    }


    /// <summary>
    /// Enables or disables use of postback in tree. If disabled JavaScript is used.
    /// </summary>
    public bool UsePostBack
    {
        get
        {
            return treeElem.UsePostBack;
        }
        set
        {
            treeElem.UsePostBack = value;
        }
    }


    /// <summary>
    /// Gets or sets select path.
    /// </summary>
    public string SelectPath
    {
        get
        {
            return treeElem.SelectPath;
        }
        set
        {
            treeElem.SelectPath = value;
            treeElem.ExpandPath = value;
        }
    }


    /// <summary>
    /// Indicates if the control should perform the operations.
    /// </summary>
    public override bool StopProcessing
    {
        get
        {
            return base.StopProcessing;
        }
        set
        {
            base.StopProcessing = value;
            treeElem.StopProcessing = value;
        }
    }


    /// <summary>
    /// Indicates if control is used on live site.
    /// </summary>
    public override bool IsLiveSite
    {
        get
        {
            return base.IsLiveSite;
        }
        set
        {
            base.IsLiveSite = value;
            treeElem.IsLiveSite = value;
        }
    }


    /// <summary>
    /// Determines whether the tree selector will display widgets available for editors.
    /// </summary>
    public bool SelectEditorWidgets
    {
        get
        {
            return mSelectEditorWidgets;
        }
        set
        {
            mSelectEditorWidgets = value;
        }
    }


    /// <summary>
    /// Determines whether the tree selector will only display widgets available for authenticated users.
    /// </summary>
    public bool SelectUserWidgets
    {
        get
        {
            return mSelectUserWidgets;
        }
        set
        {
            mSelectUserWidgets = value;
        }
    }


    /// <summary>
    /// Determines whether the tree selector will only display widgets available for group admin.
    /// </summary>
    public bool SelectGroupWidgets
    {
        get
        {
            return mSelectGroupWidgets;
        }
        set
        {
            mSelectGroupWidgets = value;
        }
    }


    /// <summary>
    /// Determines whether the tree selector will only display widgets available for inline.
    /// </summary>
    public bool SelectInlineWidgets
    {
        get
        {
            return mSelectInlineWidgets;
        }
        set
        {
            mSelectInlineWidgets = value;
        }
    }


    /// <summary>
    /// Determines whether the tree selector will only display widgets available for dashboard.
    /// </summary>
    public bool SelectDashboardWidgets
    {
        get
        {
            return mSelectDashboardWidgets;
        }
        set
        {
            mSelectDashboardWidgets = value;
        }
    }

    #endregion


    #region "Custom events"

    /// <summary>
    /// On selected item event handler.
    /// </summary>    
    public delegate void ItemSelectedEventHandler(string selectedValue);

    /// <summary>
    /// On selected item event handler.
    /// </summary>
    public event ItemSelectedEventHandler OnItemSelected;

    #endregion


    #region "Page and other events"

    /// <summary>
    /// Page_Load event.
    /// </summary>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (StopProcessing)
        {
            return;
        }

        // Create and set category provider
        UniTreeProvider categoryProvider = new UniTreeProvider();
        categoryProvider.DisplayNameColumn = "DisplayName";
        categoryProvider.IDColumn = "ObjectID";
        categoryProvider.LevelColumn = "ObjectLevel";
        categoryProvider.OrderColumn = "ObjectType DESC";
        categoryProvider.ParentIDColumn = "ParentID";
        categoryProvider.PathColumn = "ObjectPath";
        categoryProvider.ValueColumn = "ObjectID";
        categoryProvider.ChildCountColumn = "CompleteChildCount";
        categoryProvider.QueryName = "cms.widgetcategory.selectallview";
        categoryProvider.ObjectTypeColumn = "ObjectType";
        categoryProvider.ImageColumn = "WidgetCategoryImagePath";
        categoryProvider.Columns = "ObjectID, DisplayName, ParentID, WidgetCategoryImagePath, ObjectPath, WidgetCategoryChildCount, ObjectLevel, CompleteChildCount, ObjectType";


        // Build where condition       
        var currentUser = MembershipContext.AuthenticatedUser;
        string securityWhere = String.Empty;


        // Security where condition
        if (!SelectGroupWidgets && !currentUser.IsGlobalAdministrator)
        {
            securityWhere = "(WidgetSecurity = 0)"; // Allowed for all        
            if (AuthenticationHelper.IsAuthenticated())
            {
                securityWhere += " OR (WidgetSecurity = 1)"; // Authenticated
                if (currentUser.IsGlobalAdministrator)
                {
                    securityWhere += " OR (WidgetSecurity = 7)"; // Global admin
                }
                securityWhere += " OR ((WidgetSecurity = 2) AND (ObjectID IN ( SELECT WidgetID FROM CMS_WidgetRole WHERE RoleID IN (SELECT RoleID FROM View_CMS_UserRole_MembershipRole_ValidOnly_Joined WHERE UserID = " + currentUser.UserID + "))))"; // Authorized roles
            }
        }

        //  Categories AND widgets
        if (SelectWidgets)
        {
            categoryProvider.WhereCondition = securityWhere;
        }
        else // Only Categories
        {
            categoryProvider.WhereCondition = "ObjectType = 'widgetcategory'";
            categoryProvider.ChildCountColumn = "WidgetCategoryChildCount";
            categoryProvider.ObjectTypeColumn = "";

            // Create WHERE condition which filters categories without widgets
            string where = "";
            where = @"0 <>(SELECT TOP 1 ObjectID FROM 
            (SELECT ObjectPath AS WidgetPath, ObjectType, WidgetForUser, WidgetForGroup, WidgetForEditor, WidgetSecurity, ObjectID, WidgetForInline, WidgetForDashboard
            FROM View_CMS_WidgetCategoryWidget_Joined) AS SUB 
            WHERE SUB.ObjectType = 'widget' AND SUB.WidgetPath LIKE ObjectPath + '%'";

            if (SelectEditorWidgets)
            {
                where += " AND SUB.WidgetForEditor = 1 ";
            }
            else if (SelectUserWidgets)
            {
                where += " AND SUB.WidgetForUser = 1 ";
            }
            else if (SelectGroupWidgets)
            {
                where += " AND SUB.WidgetForGroup = 1";
            }
            else if (SelectInlineWidgets)
            {
                where += " AND SUB.WidgetForInline = 1 ";
            }
            else if (SelectDashboardWidgets)
            {
                where += " AND SUB.WidgetForDashboard = 1 ";
            }
            else
            {
                where += " AND 1 = 2 ";
            }

            if (!string.IsNullOrEmpty(securityWhere))
            {
                where += " AND ( " + securityWhere + ")";
            }

            categoryProvider.WhereCondition = SqlHelper.AddWhereCondition(categoryProvider.WhereCondition, where + ")");
        }

        // Set up tree 
        treeElem.ProviderObject = categoryProvider;

        if (SelectWidgets)
        {
            string script = "onclick=\"SelectNode(##NODEID##,'##OBJECTTYPE##', ##PARENTNODEID##);return false;\"";
            treeElem.NodeTemplate = String.Format("<span id=\"##OBJECTTYPE##_##NODEID##\" {0} name=\"treeNode\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>", script);
            treeElem.SelectedNodeTemplate = String.Format("<span id=\"##OBJECTTYPE##_##NODEID##\" {0} name=\"treeNode\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>", script);
        }
        else
        {
            treeElem.NodeTemplate = "<span onclick=\"SelectNode(##NODEID##, this);return false;\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
            treeElem.DefaultItemTemplate = "<span onclick=\"SelectNode('recentlyused', this);return false;\" class=\"ContentTreeItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
            treeElem.SelectedDefaultItemTemplate = "<span onclick=\"SelectNode('recentlyused', this);return false;\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";
            treeElem.SelectedNodeTemplate = "<span onclick=\"SelectNode(##NODEID##, this);return false;\" class=\"ContentTreeItem ContentTreeSelectedItem\">##ICON##<span class=\"Name\">##NODENAME##</span></span>";

            ScriptHelper.RegisterJQuery(Page);

            string js = "var selectedItem = $cmsj('.ContentTreeSelectedItem');" +
                        "function SelectNode(nodeid, sender){" +
                        "selectedItem.removeClass('ContentTreeSelectedItem'); " +
                        "selectedItem.addClass('ContentTreeItem');" +
                        "selectedItem = $cmsj(sender);" +
                        "selectedItem.removeClass('ContentTreeItem'); " +
                        "selectedItem.addClass('ContentTreeSelectedItem'); " +
                        "document.getElementById('" + treeElem.SelectedItemFieldId + "').value = nodeid;" +
                        treeElem.GetOnSelectedItemBackEventReference() +
                        "}";

            ScriptHelper.RegisterStartupScript(Page, typeof(string), "SelectTreeNode", ScriptHelper.GetScript(js));
        }

        // Add last recently used
        if (ShowRecentlyUsed)
        {
            treeElem.AddDefaultItem(GetString("widgets.recentlyused"), "recentlyused", null);
        }

        // Setup event handler
        treeElem.OnItemSelected += treeElem_OnItemSelected;
        treeElem.OnNodeCreated += treeElem_OnNodeCreated;
    }


    /// <summary>
    /// Page PreRender.
    /// </summary>
    protected void Page_PreRender(object sender, EventArgs e)
    {
        if (StopProcessing)
        {
            return;
        }

        // Load data
        if (!RequestHelper.IsPostBack())
        {
            treeElem.ReloadData();
        }
    }


    /// <summary>
    /// Used for maxnodes in collapsed node.
    /// </summary>
    protected TreeNode treeElem_OnNodeCreated(DataRow itemData, TreeNode defaultNode)
    {
        if (UseMaxNodeLimit && (MaxTreeNodes > 0))
        {
            // Get parentID from data row
            int parentID = ValidationHelper.GetInteger(itemData["ParentID"], 0);
            string objectType = ValidationHelper.GetString(itemData["ObjectType"], String.Empty);

            // Don't use maxnodes limitation for categories
            if (objectType.ToLowerCSafe() == "widgetcategory")
            {
                return defaultNode;
            }

            // Increment index count in collapsing
            indexMaxTreeNodes++;
            if (indexMaxTreeNodes == MaxTreeNodes)
            {
                // Load parentid
                int parentParentID = 0;

                WidgetCategoryInfo parentParent = WidgetCategoryInfoProvider.GetWidgetCategoryInfo(parentID);
                if (parentParent != null)
                {
                    parentParentID = parentParent.WidgetCategoryParentID;
                }

                TreeNode node = new TreeNode();
                node.Text = "<span class=\"ContentTreeItem\" onclick=\"SelectNode(" + parentID + " ,'widgetcategory'," + parentParentID + ",true ); return false;\"><span class=\"Name\">" + GetString("general.seelisting") + "</span></span>";
                return node;
            }
            if (indexMaxTreeNodes > MaxTreeNodes)
            {
                return null;
            }
        }
        return defaultNode;
    }


    /// <summary>
    ///  On selected item event.
    /// </summary>
    /// <param name="selectedValue">Selected value</param>
    protected void treeElem_OnItemSelected(string selectedValue)
    {
        if (OnItemSelected != null)
        {
            OnItemSelected(selectedValue);
        }
    }

    #endregion


    #region "Methods"

    /// <summary>
    /// Reloads the tree data.
    /// </summary>
    public override void ReloadData()
    {
        treeElem.ReloadData();
        base.ReloadData();
    }

    #endregion
}