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/TDijk1/erp-apps.eu/wwwroot/CMSFormControls/System/FieldSelector.ascx.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web.UI.WebControls;

using CMS.CustomTables;
using CMS.DataEngine;
using CMS.DocumentEngine;
using CMS.FormControls;
using CMS.FormEngine;
using CMS.Helpers;
using CMS.MacroEngine;
using CMS.SiteProvider;

public partial class CMSFormControls_System_FieldSelector : FormEngineUserControl
{
    #region "Private properties"

    private string mValue = String.Empty;

    #endregion


    #region "Public properties"

    /// <summary>
    /// Field condition
    /// </summary>
    public string FieldCondition
    {
        get
        {
            return GetValue("FieldCondition", String.Empty);
        }
        set
        {
            SetValue("FieldCondition", value);
        }
    }


    /// <summary>
    /// Class type
    /// </summary>
    /// <remarks>0 - Custom tables, 1 - Document types, 2 - System tables</remarks>
    public int ClassType
    {
        get
        {
            return ValidationHelper.GetInteger(GetValue("ClassType"), 1);
        }
        set
        {
            SetValue("ClassType", value);
        }
    }


    /// <summary>
    /// Gets class name value.
    /// </summary>
    private string ClassName
    {
        get
        {
            return !String.IsNullOrEmpty(ClassNameColumnName) ? ValidationHelper.GetString(Form.Data.GetValue(ClassNameColumnName), String.Empty) : String.Empty;
        }
    }


    /// <summary>
    /// Gets name of class name column.
    /// </summary>
    private string ClassNameColumnName
    {
        get
        {
            return GetValue("ClassNameColumnName", String.Empty);
        }
    }


    /// <summary>
    /// Indicates if (none) record should be visible in class list.
    /// </summary>
    private bool AllowNone
    {
        get
        {
            return ((FieldInfo != null) && (FieldInfo.AllowEmpty));
        }
    }


    /// <summary>
    /// Gets or sets field value.
    /// </summary>
    public override object Value
    {
        get
        {
            return drpFields.SelectedValue;
        }
        set
        {
            mValue = ValidationHelper.GetString(value, String.Empty);
        }
    }

    #endregion


    #region "Page and controls events"

    /// <summary>
    /// Page_Load event handler
    /// </summary>
    protected void Page_Load(object sender, EventArgs e)
    {
        // Setup uni-selector
        selectionElem.UniSelector.AllowEmpty = AllowNone;
        selectionElem.DropDownSingleSelect.AutoPostBack = true;
        selectionElem.IsLiveSite = false;
        selectionElem.UniSelector.OnSelectionChanged+= DropDownSingleSelect_SelectedIndexChanged;

        switch (ClassType)
        {
            // Custom tables
            case 0:
                selectionElem.UniSelector.ObjectType = CustomTableInfo.OBJECT_TYPE_CUSTOMTABLE;
                break;

            // System tables
            case 2:
                selectionElem.UniSelector.ObjectType = DataClassInfo.OBJECT_TYPE_SYSTEMTABLE;
                selectionElem.ShowOnlySystemTables = true;
                break;

            // Document types
            default:
                selectionElem.UniSelector.ObjectType = DocumentTypeInfo.OBJECT_TYPE_DOCUMENTTYPE;
                selectionElem.ShowOnlyCoupled = true;
                break;
        }

        // Bind fields drop-down list
        if (!RequestHelper.IsPostBack())
        {
            selectionElem.ReloadData(false);

            // Check backward compatibility
            if (mValue.Contains("|"))
            {
                GetOlderValues();
            }
            else
            {
                if (!String.IsNullOrEmpty(ClassName))
                {
                    selectionElem.DropDownSingleSelect.SelectedValue = ClassName;
                }
                else
                {
                    selectionElem.DropDownSingleSelect.SelectedIndex = 0;
                }
            }
        }

        LoadFields(false);
    }


    /// <summary>
    /// 'Selected index changed' event handler
    /// </summary>
    protected void DropDownSingleSelect_SelectedIndexChanged(object sender, EventArgs e)
    {
        LoadFields(true);
    }

    #endregion


    #region "Methods"

    /// <summary>
    /// Resolves backward compatibility issue. 
    /// </summary>
    private void GetOlderValues()
    {
        DataSet data;

        switch (ClassType)
        {
            // Custom tables
            case 0:
                {
                    data = CustomTableHelper.GetCustomTableClasses(SiteContext.CurrentSiteID)
                                                .Column("ClassName");
                }
                break;

            // System tables
            case 2:
                {
                    data = DataClassInfoProvider.GetClasses()
                                                .WhereTrue("ClassShowAsSystemTable")
                                                .Column("ClassName");
                    break;
                }

                // Document types
            default:
                {
                    data = DataClassInfoProvider.GetClasses()
                                                .OnSite(SiteContext.CurrentSiteID)
                                                .WhereTrue("ClassIsDocumentType")
                                                .WhereTrue("ClassIsCoupledClass")
                                                .Column("ClassName");
                    break;
                }
        }

        // Get GUID
        string[] values = mValue.Split('|');
        Guid guid = new Guid(values[0]);

        // Go thru selected classes and try find right field
        foreach (DataRow row in data.Tables[0].Rows)
        {
            string className = row["ClassName"].ToString();
            var fi = FormHelper.GetFormInfo(className, false);

            if (fi != null)
            {
                // Find field with given GUID
                var ffi = fi.GetFields(true, true).FirstOrDefault(f => f.Guid == guid);
                if (ffi != null)
                {
                    // Column found, preselect class name and column in drop down lists
                    selectionElem.DropDownSingleSelect.SelectedValue = className;
                    LoadFields(false);
                    drpFields.SelectedValue = guid.ToString();
                    return;
                }
            }
        }
    }


    /// <summary>
    /// Loads fields to drop down control.
    /// </summary>
    /// <param name="classIndexChanged">Indicates if class selector has changed or not</param>
    private void LoadFields(bool classIndexChanged)
    {
        if (classIndexChanged || (drpFields.Items.Count == 0))
        {
            // Clear dropdown list
            drpFields.Items.Clear();

            // Get data class info
            string className = ValidationHelper.GetString(selectionElem.Value, null);
            if (!String.IsNullOrEmpty(className) && (className != SpecialFieldValue.NONE.ToString()))
            {
                // Get fields of type file
                var dci = DataClassInfoProvider.GetDataClassInfo(className);
                var fi = FormHelper.GetFormInfo(dci.ClassName, false);
                var ffi = fi.GetFields(true, true);

                // Filter fields
                if (!String.IsNullOrEmpty(FieldCondition))
                {
                    MacroResolver resolver = MacroResolver.GetInstance();
                    var visibleFields = new List<FormFieldInfo>();
                    foreach (FormFieldInfo field in ffi)
                    {
                        resolver.SetAnonymousSourceData(field);
                        bool result = ValidationHelper.GetBoolean(resolver.ResolveMacros(FieldCondition), true);
                        if (result)
                        {
                            visibleFields.Add(field);
                        }
                    }

                    ffi = visibleFields;
                }

                if (ffi.Count > 0)
                {
                    // Fill dropdown list with fields
                    var list = ffi.Select(t => new Tuple<string, string>(!String.IsNullOrEmpty(t.GetPropertyValue(FormFieldPropertyEnum.FieldCaption, ContextResolver)) ? t.GetPropertyValue(FormFieldPropertyEnum.FieldCaption, ContextResolver) : t.Name, t.Guid.ToString())).OrderBy(t => t.Item1);
                    foreach (var item in list)
                    {
                        drpFields.Items.Add(new ListItem(item.Item1, item.Item2));
                    }

                    if (!String.IsNullOrEmpty(mValue) && (drpFields.Items.FindByValue(mValue) != null) && !classIndexChanged)
                    {
                        // Selected value from database
                        drpFields.SelectedValue = mValue;
                    }
                    else
                    {
                        // Select first item if nothing selected or class name was changed
                        drpFields.SelectedIndex = 0;
                    }

                    drpFields.Enabled = true;
                }
                else
                {
                    drpFields.Enabled = false;
                }

                pnlFields.Visible = true;
            }
            else
            {
                // Hide field selector for (none) option
                pnlFields.Visible = false;
            }
        }
    }

    #endregion


    #region "Overridden methods"

    /// <summary>
    /// Returns true if user control is valid.
    /// </summary>
    public override bool IsValid()
    {
        return true;
    }


    /// <summary>
    /// Loads the other fields values to the state of the form control
    /// </summary>
    public override void LoadOtherValues()
    {
        // Class name loads on-the-fly, no need to load it explicitly
    }


    /// <summary>
    /// Returns other values related to this form control.
    /// </summary>
    /// <returns>Returns an array where first dimension is attribute name and the second dimension is its value.</returns>
    public override object[,] GetOtherValues()
    {
        if (!String.IsNullOrEmpty(ClassNameColumnName))
        {
            string selectedValue = selectionElem.DropDownSingleSelect.SelectedValue;

            // Set properties names
            object[,] values = new object[1, 2];
            values[0, 0] = ClassNameColumnName;
            values[0, 1] = selectedValue == "0" ? String.Empty : selectedValue;

            return values;
        }

        return null;
    }

    #endregion
}