Datalayer peformance enhancements. Old indexer/searcher replaced with Umbraco Examine. [TFS Changeset #59791]
424 lines
18 KiB
C#
424 lines
18 KiB
C#
using System;
|
|
using System.Configuration;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using AjaxControlToolkit;
|
|
using umbraco.cms.businesslogic;
|
|
using umbraco.interfaces;
|
|
|
|
namespace umbraco.editorControls.ultimatepicker
|
|
{
|
|
[ValidationProperty("IsValid")]
|
|
public class ultimatePickerDataEditor : UpdatePanel, IDataEditor
|
|
{
|
|
private IData _data;
|
|
string _configuration;
|
|
|
|
private string[] config;
|
|
private string controlType;
|
|
|
|
private string[] dataValues;
|
|
|
|
private TextBox childtxt;
|
|
private DropDownList dropdownlistNodes;
|
|
private CheckBoxList checkboxlistNodes;
|
|
private RadioButtonList radiobuttonlistNodes;
|
|
private ListBox listboxNodes;
|
|
private Button clearRadiobuttonlist;
|
|
private CheckBox clearRadiobuttons;
|
|
|
|
public ultimatePickerDataEditor(umbraco.interfaces.IData Data, string Configuration)
|
|
{
|
|
_data = Data;
|
|
_configuration = Configuration;
|
|
|
|
config = _configuration.Split("|".ToCharArray());
|
|
controlType = config[0];
|
|
|
|
RenderMode = UpdatePanelRenderMode.Inline;
|
|
}
|
|
|
|
public virtual bool TreatAsRichTextEditor
|
|
{
|
|
get { return false; }
|
|
}
|
|
|
|
public bool ShowLabel
|
|
{
|
|
get { return true; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Internal logic for validation controls to detect whether or not it's valid (has to be public though)
|
|
/// </summary>
|
|
/// <value>Am I valid?</value>
|
|
public string IsValid
|
|
{
|
|
get
|
|
{
|
|
switch (controlType.ToLower())
|
|
{
|
|
case "autocomplete":
|
|
if (childtxt.Text.Contains("|"))
|
|
{
|
|
return childtxt.Text;
|
|
}
|
|
|
|
break;
|
|
case "checkboxlist":
|
|
foreach (ListItem item in checkboxlistNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
return "valid";
|
|
}
|
|
}
|
|
break;
|
|
case "dropdownlist":
|
|
return dropdownlistNodes.SelectedValue;
|
|
break;
|
|
case "listbox":
|
|
foreach (ListItem item in listboxNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
return "valid";
|
|
}
|
|
}
|
|
break;
|
|
case "radiobuttonlist":
|
|
foreach (ListItem item in radiobuttonlistNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
return "valid";
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
|
|
public Control Editor { get { return this; } }
|
|
|
|
public void Save()
|
|
{
|
|
string dataToSave = string.Empty;
|
|
|
|
switch (controlType)
|
|
{
|
|
case "AutoComplete":
|
|
if (childtxt.Text.Contains("|"))
|
|
{
|
|
dataToSave = childtxt.Text.Split("|".ToCharArray())[1];
|
|
}
|
|
|
|
|
|
break;
|
|
case "auto-suggest":
|
|
goto case "AutoComplete";
|
|
case "CheckBoxList":
|
|
|
|
foreach (ListItem item in checkboxlistNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
dataToSave += item.Value + ",";
|
|
}
|
|
}
|
|
|
|
if (dataToSave.Length > 0)
|
|
{
|
|
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
|
|
}
|
|
|
|
|
|
break;
|
|
case "checkbox":
|
|
goto case "CheckBoxList";
|
|
case "DropDownList":
|
|
dataToSave = dropdownlistNodes.SelectedValue;
|
|
break;
|
|
case "dropdown":
|
|
goto case "DropDownList";
|
|
case "ListBox":
|
|
dataToSave = string.Empty;
|
|
foreach (ListItem item in listboxNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
dataToSave += item.Value + ",";
|
|
}
|
|
}
|
|
|
|
if (dataToSave.Length > 0)
|
|
{
|
|
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
|
|
}
|
|
break;
|
|
case "listbox":
|
|
goto case "ListBox";
|
|
case "RadioButtonList":
|
|
dataToSave = string.Empty;
|
|
|
|
if (!clearRadiobuttons.Checked)
|
|
{
|
|
foreach (ListItem item in radiobuttonlistNodes.Items)
|
|
{
|
|
if (item.Selected)
|
|
{
|
|
dataToSave += item.Value + ",";
|
|
}
|
|
}
|
|
|
|
if (dataToSave.Length > 0)
|
|
{
|
|
dataToSave = dataToSave.Substring(0, dataToSave.Length - 1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach (ListItem radiobutton in radiobuttonlistNodes.Items)
|
|
{
|
|
radiobutton.Selected = false;
|
|
}
|
|
|
|
clearRadiobuttons.Checked = false;
|
|
}
|
|
|
|
break;
|
|
case "radiobox":
|
|
goto case "RadioButtonList";
|
|
|
|
}
|
|
if (controlType != "auto-suggest" && controlType != "AutoComplete")
|
|
{
|
|
this._data.Value = dataToSave;
|
|
|
|
}
|
|
else
|
|
{
|
|
if (dataToSave.Length > 0)
|
|
{
|
|
this._data.Value = dataToSave;
|
|
}else
|
|
{
|
|
if (childtxt.Text.Trim().Length == 0)
|
|
{
|
|
this._data.Value = "";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnInit(EventArgs e)
|
|
{
|
|
base.OnInit(e);
|
|
|
|
try
|
|
{
|
|
int parentNodeId = Convert.ToInt32(config[1]);
|
|
umbraco.cms.businesslogic.Content parentNode = new umbraco.cms.businesslogic.Content(parentNodeId);
|
|
string documentAliasFilter = config[2];
|
|
string[] documentAliasFilters = documentAliasFilter.Split(",".ToCharArray());
|
|
|
|
bool showChildren = Convert.ToBoolean(config[3]);
|
|
|
|
string[] datavalues = _data.Value.ToString().Split(",".ToCharArray());
|
|
|
|
switch (controlType)
|
|
{
|
|
case "AutoComplete":
|
|
setupAutoComplete(parentNodeId);
|
|
break;
|
|
case "auto-suggest":
|
|
goto case "AutoComplete";
|
|
case "CheckBoxList":
|
|
checkboxlistNodes = new CheckBoxList();
|
|
//checkboxlistNodes.ID = "nodes";
|
|
addListControlNode(parentNode, 1, showChildren, checkboxlistNodes, documentAliasFilters);
|
|
base.ContentTemplateContainer.Controls.Add(checkboxlistNodes);
|
|
|
|
break;
|
|
case "checkbox":
|
|
goto case "CheckBoxList";
|
|
case "DropDownList":
|
|
dropdownlistNodes = new DropDownList();
|
|
//dropdownlistNodes.ID = "nodes";
|
|
ListItem empty = new ListItem("");
|
|
dropdownlistNodes.Items.Add(empty);
|
|
addListControlNode(parentNode, 1, showChildren, dropdownlistNodes, documentAliasFilters);
|
|
foreach (string datavalue in datavalues)
|
|
{
|
|
dropdownlistNodes.SelectedValue = datavalue;
|
|
}
|
|
base.ContentTemplateContainer.Controls.Add(dropdownlistNodes);
|
|
break;
|
|
case "dropdown":
|
|
goto case "DropDownList";
|
|
case "ListBox":
|
|
listboxNodes = new ListBox();
|
|
//listboxNodes.ID = "nodes";
|
|
listboxNodes.SelectionMode = ListSelectionMode.Multiple;
|
|
listboxNodes.Width = 300;
|
|
listboxNodes.Height = 200;
|
|
|
|
addListControlNode(parentNode, 1, showChildren, listboxNodes, documentAliasFilters);
|
|
base.ContentTemplateContainer.Controls.Add(listboxNodes);
|
|
break;
|
|
case "listbox":
|
|
goto case "ListBox";
|
|
case "RadioButtonList":
|
|
radiobuttonlistNodes = new RadioButtonList();
|
|
radiobuttonlistNodes.AutoPostBack = true;
|
|
radiobuttonlistNodes.SelectedIndexChanged += new EventHandler(radiobuttonlistNodes_SelectedIndexChanged);
|
|
//radiobuttonlistNodes.ID = "nodes";
|
|
addListControlNode(parentNode, 1, showChildren, radiobuttonlistNodes, documentAliasFilters);
|
|
|
|
clearRadiobuttonlist = new Button();
|
|
clearRadiobuttonlist.Click += new EventHandler(clearRadiobuttonlist_Click);
|
|
clearRadiobuttonlist.Text = "Clear";
|
|
|
|
clearRadiobuttons = new CheckBox();
|
|
clearRadiobuttons.Visible = false;
|
|
|
|
base.ContentTemplateContainer.Controls.Add(radiobuttonlistNodes);
|
|
base.ContentTemplateContainer.Controls.Add(clearRadiobuttonlist);
|
|
base.ContentTemplateContainer.Controls.Add(clearRadiobuttons);
|
|
break;
|
|
case "radiobox":
|
|
goto case "RadioButtonList";
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
void radiobuttonlistNodes_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
clearRadiobuttons.Checked = false;
|
|
}
|
|
|
|
void clearRadiobuttonlist_Click(object sender, EventArgs e)
|
|
{
|
|
|
|
|
|
foreach (ListItem radiobutton in radiobuttonlistNodes.Items)
|
|
{
|
|
radiobutton.Selected = false;
|
|
}
|
|
|
|
clearRadiobuttons.Checked = true;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// Adds sub nodes to the ListControl object passed into the method, based on the Content node passed in
|
|
/// </summary>
|
|
/// <param name="node">The node whos sub nodes are to be added to the ListControl</param>
|
|
/// <param name="level">The level of the current node</param>
|
|
/// <param name="showGrandChildren">Boolean determining if grand children should be displayed as well</param>
|
|
/// <param name="control">The ListControl the nodes must be added to</param>
|
|
/// <param name="documentAliasFilter">String representing the documentTypeAlias that should be filtered for. If empty no filter is applied</param>
|
|
private void addListControlNode(umbraco.cms.businesslogic.Content node, int level, bool showGrandChildren, ListControl control, string[] documentAliasFilters)
|
|
{
|
|
if (node.HasChildren)
|
|
{
|
|
//store children array here because iterating over an Array property object is very inneficient.
|
|
var c = node.Children;
|
|
foreach (CMSNode child in c)
|
|
{
|
|
umbraco.cms.businesslogic.Content doc = new umbraco.cms.businesslogic.Content(child.Id);
|
|
string preText = string.Empty;
|
|
|
|
for (int i = 1; i < level; i++)
|
|
{
|
|
preText += "- ";
|
|
}
|
|
|
|
//Run through the filters passed in
|
|
if (documentAliasFilters.Length > 0)
|
|
{
|
|
foreach (string filter in documentAliasFilters)
|
|
{
|
|
string trimmedFilter = filter.TrimStart(" ".ToCharArray());
|
|
trimmedFilter = trimmedFilter.TrimEnd(" ".ToCharArray());
|
|
|
|
if (doc.ContentType.Alias == trimmedFilter || trimmedFilter == string.Empty)
|
|
{
|
|
ListItem item = new ListItem(preText + doc.Text, doc.Id.ToString());
|
|
if (_data.Value.ToString().Contains(doc.Id.ToString()))
|
|
{
|
|
item.Selected = true;
|
|
}
|
|
control.Items.Add(item);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ListItem item = new ListItem(preText + doc.Text, doc.Id.ToString());
|
|
if (_data.Value.ToString().Contains(doc.Id.ToString()))
|
|
{
|
|
item.Selected = true;
|
|
}
|
|
control.Items.Add(item);
|
|
}
|
|
|
|
if (showGrandChildren)
|
|
{
|
|
addListControlNode(doc, level + 1, showGrandChildren, control, documentAliasFilters);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets up the autocomplete functionality
|
|
/// </summary>
|
|
private void setupAutoComplete(int parentNodeId)
|
|
{
|
|
string script = "<style>/*AutoComplete flyout */\r\n .autocomplete_completionListElement \r\n { \r\n\t visibility : hidden;\r\n\t margin : 0px !Important;\r\n\t padding: 0px !Important;\r\n background-color : #fff;\r\n\t color : #000;\r\n\t border : #ccc;\r\n\t border-width : 1px;\r\n\t border-style : solid;\r\n\t cursor : 'default';\r\n\t overflow : auto;\r\n\t height : 100px;\r\n text-align : left; \r\n list-style: none !Important;\r\n width: 400px !Important;\r\n z-index: 9999999;\r\n }\r\n .autocomplete_completionListElement li{\r\n display: block;\r\n padding: 1px !Important;\r\n margin: 0px;\r\n }\r\n /* AutoComplete highlighted item */\r\n\r\n .autocomplete_highlightedListItem\r\n {\r\n\t background-color: #ffff99;\r\n\t color: black;\r\n\t padding: 1px;\r\n }\r\n\r\n /* AutoComplete item */\r\n\r\n .autocomplete_listItem \r\n {\r\n\t background-color : window;\r\n\t color : windowtext;\r\n\t padding : 1px;\r\n }</style>";
|
|
this.Page.ClientScript.RegisterClientScriptBlock(script.GetType(), "ultimatePickerCss", script);
|
|
childtxt = new TextBox();
|
|
childtxt.ID = "ultimatePickerBox" + base.ID;
|
|
childtxt.AutoCompleteType = AutoCompleteType.Disabled;
|
|
childtxt.CssClass = "umbEditorTextField";
|
|
AutoCompleteExtender extender = new AutoCompleteExtender();
|
|
extender.TargetControlID = "ultimatePickerBox" + base.ID;
|
|
extender.ServiceMethod = "getNodes";
|
|
|
|
extender.ServicePath = ConfigurationManager.AppSettings["umbracoPath"] + "/webservices/ultimatePickerAutoSuggest.asmx";
|
|
extender.MinimumPrefixLength = 2;
|
|
extender.CompletionInterval = 1000;
|
|
extender.EnableCaching = true;
|
|
extender.CompletionSetCount = 5;
|
|
extender.CompletionListCssClass = "autocomplete_completionListElement";
|
|
extender.CompletionListItemCssClass = "autocomplete_listItem";
|
|
extender.CompletionListHighlightedItemCssClass = "autocomplete_highlightedListItem";
|
|
extender.DelimiterCharacters = ";, :";
|
|
extender.UseContextKey = true;
|
|
extender.ContextKey = parentNodeId.ToString() + "|" + config[3] + "|" + config[2];
|
|
|
|
if (_data.Value.ToString().Length > 3)
|
|
{
|
|
try
|
|
{
|
|
CMSNode firstSaved = new CMSNode(Convert.ToInt32(_data.Value.ToString().Substring(0, 4)));
|
|
childtxt.Text = firstSaved.Text;
|
|
}
|
|
catch
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
base.ContentTemplateContainer.Controls.Add(childtxt);
|
|
base.ContentTemplateContainer.Controls.Add(extender);
|
|
}
|
|
}
|
|
}
|