From 75d691826ed1e35a4293ded8946b65c6eea7a4a3 Mon Sep 17 00:00:00 2001 From: starfighter83 Date: Thu, 4 Mar 2010 13:34:34 +0000 Subject: [PATCH] DO NOT DOWNLOAD - GET THE STABLE SOURCE FROM THE DOWNLOADS TAB Fixes 26388: Ultimate picker datatype, use jquery autocomplete instead of ajaxcontroltoolkit [TFS Changeset #64439] --- .../ultimatePickerDataEditor.cs | 51 +++-- .../umbraco.editorControls.csproj | 4 - .../presentation/umbraco.presentation.csproj | 7 +- .../UltimatePickerAutoCompleteHandler.ashx | 1 + .../UltimatePickerAutoCompleteHandler.ashx.cs | 214 ++++++++++++++++++ 5 files changed, 248 insertions(+), 29 deletions(-) create mode 100644 umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx create mode 100644 umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx.cs diff --git a/components/editorControls/ultimatepicker/ultimatePickerDataEditor.cs b/components/editorControls/ultimatepicker/ultimatePickerDataEditor.cs index 7dc7d8c074..5792a0c1ea 100644 --- a/components/editorControls/ultimatepicker/ultimatePickerDataEditor.cs +++ b/components/editorControls/ultimatepicker/ultimatePickerDataEditor.cs @@ -2,9 +2,10 @@ using System.Configuration; using System.Web.UI; using System.Web.UI.WebControls; -using AjaxControlToolkit; using umbraco.cms.businesslogic; using umbraco.interfaces; +using ClientDependency.Core.Controls; +using ClientDependency.Core; namespace umbraco.editorControls.ultimatepicker { @@ -111,9 +112,9 @@ namespace umbraco.editorControls.ultimatepicker switch (controlType) { case "AutoComplete": - if (childtxt.Text.Contains("|")) + if (childtxt.Text.Contains("[") && childtxt.Text.Contains("]")) { - dataToSave = childtxt.Text.Split("|".ToCharArray())[1]; + dataToSave = childtxt.Text.Replace("]","").Split("[".ToCharArray())[1]; } @@ -381,27 +382,14 @@ namespace umbraco.editorControls.ultimatepicker /// private void setupAutoComplete(int parentNodeId) { - string script = ""; - this.Page.ClientScript.RegisterClientScriptBlock(script.GetType(), "ultimatePickerCss", script); + ClientDependencyLoader.Instance.RegisterDependency("Application/JQuery/jquery.autocomplete.js", "UmbracoClient", ClientDependencyType.Javascript); + ClientDependencyLoader.Instance.RegisterDependency("css/umbracoGui.css", "UmbracoRoot", ClientDependencyType.Css); + + 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) { @@ -417,7 +405,28 @@ namespace umbraco.editorControls.ultimatepicker } base.ContentTemplateContainer.Controls.Add(childtxt); - base.ContentTemplateContainer.Controls.Add(extender); + + + string autoCompleteScript = + "jQuery(\"#" + + childtxt.ClientID + "\").autocomplete(\"" + + umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) + + "/webservices/UltimatePickerAutoCompleteHandler.ashx\",{minChars: 2,max: 100, extraParams:{id:\"" + parentNodeId.ToString() + "\",showchildren:\"" + config[3] + "\",filter:\"" + config[2] + "\",rnd:\"" + DateTime.Now.Ticks + "\"}});"; + + + string autoCompleteInitScript = + "jQuery(document).ready(function(){" + + autoCompleteScript + + "});"; + + Page.ClientScript.RegisterStartupScript(GetType(), ClientID + "_ultimatepickerinit", autoCompleteInitScript, true); + + if (Page.IsPostBack) + { + ScriptManager.RegisterClientScriptBlock(this, GetType(), ClientID + "_ultimatepicker", autoCompleteScript, true); + + } + } } } diff --git a/components/editorControls/umbraco.editorControls.csproj b/components/editorControls/umbraco.editorControls.csproj index 6b6147d6c2..3474e75d7c 100644 --- a/components/editorControls/umbraco.editorControls.csproj +++ b/components/editorControls/umbraco.editorControls.csproj @@ -94,10 +94,6 @@ prompt - - False - ..\..\foreign dlls\AjaxControlToolkit.dll - False ..\..\foreign dlls\ClientDependency.Core.dll diff --git a/umbraco/presentation/umbraco.presentation.csproj b/umbraco/presentation/umbraco.presentation.csproj index 24a2f02f09..3e250f0576 100644 --- a/umbraco/presentation/umbraco.presentation.csproj +++ b/umbraco/presentation/umbraco.presentation.csproj @@ -1424,9 +1424,8 @@ trashcan.asmx Component - - ultimatePickerAutoSuggest.asmx - Component + + UltimatePickerAutoCompleteHandler.ashx ASPXCodeBehind @@ -2273,7 +2272,6 @@ - @@ -2719,6 +2717,7 @@ XmlTree.xsd + diff --git a/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx b/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx new file mode 100644 index 0000000000..9b5b98a9b8 --- /dev/null +++ b/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx @@ -0,0 +1 @@ +<%@ WebHandler Language="C#" CodeBehind="UltimatePickerAutoCompleteHandler.ashx.cs" Class="umbraco.presentation.umbraco.webservices.UltimatePickerAutoCompleteHandler" %> diff --git a/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx.cs b/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx.cs new file mode 100644 index 0000000000..b0e1cd3596 --- /dev/null +++ b/umbraco/presentation/umbraco/webservices/UltimatePickerAutoCompleteHandler.ashx.cs @@ -0,0 +1,214 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Services; +using umbraco.cms.businesslogic.web; +using umbraco.cms.businesslogic; + +namespace umbraco.presentation.umbraco.webservices +{ + /// + /// Summary description for $codebehindclassname$ + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + public class UltimatePickerAutoCompleteHandler : IHttpHandler + { + + private int nodeCount; + private int Counter; + private string[] output; + private string prefix; + + public void ProcessRequest(HttpContext context) + { + context.Response.ContentType = "text/plain"; + + prefix = context.Request.QueryString["q"]; + + int parentNodeId = Convert.ToInt32(context.Request.QueryString["id"]); + bool showGrandChildren = Convert.ToBoolean(context.Request.QueryString["showchildren"]); + + string documentAliasFilter = context.Request.QueryString["filter"]; + string[] documentAliasFilters = documentAliasFilter.Split(",".ToCharArray()); + + + CMSNode parent = new CMSNode(parentNodeId); + if (!showGrandChildren) + { + nodeCount = 0; + + //store children array here because iterating over an Array property object is very inneficient. + var children = parent.Children; + foreach (CMSNode child in children) + { + + + nodeChildrenCount(child, false,documentAliasFilters); + + } + + output = new string[nodeCount]; + + int i = 0; + Counter = 0; + int level = 1; + + //why is there a 2nd iteration of the same thing here? + foreach (CMSNode child in children) + { + + addNode(child, level, showGrandChildren,documentAliasFilters); + } + + + } + else + { + nodeCount = 0; + + //store children array here because iterating over an Array property object is very inneficient. + var children = parent.Children; + foreach (CMSNode child in children) + { + nodeChildrenCount(child, true,documentAliasFilters); + } + + output = new string[nodeCount]; + Counter = 0; + int level = 1; + + foreach (CMSNode child in children) + { + addNode(child, level, showGrandChildren,documentAliasFilters); + } + + + + } + + + foreach (string item in output) + { + context.Response.Write(item + Environment.NewLine); + } + } + + private bool validNode(string nodeText) + { + + + if (nodeText.Length >= prefix.Length) + { + + + if (nodeText.Substring(0, prefix.Length).ToLower() == prefix.ToLower()) + { + return true; + } + } + + return false; + } + + private void nodeChildrenCount(CMSNode node, bool countChildren, string[] documentAliasFilters) + { + if (documentAliasFilters.Length > 0) + { + + foreach (string filter in documentAliasFilters) + { + string trimmedFilter = filter.TrimStart(" ".ToCharArray()); + trimmedFilter = trimmedFilter.TrimEnd(" ".ToCharArray()); + + if (new Document(node.Id).ContentType.Alias == trimmedFilter || trimmedFilter == string.Empty) + { + if (validNode(node.Text)) + { + nodeCount += 1; + } + + } + } + } + else + { + if (validNode(node.Text)) + { + nodeCount += 1; + } + } + + if (countChildren) + { + //store children array here because iterating over an Array property object is very inneficient. + var children = node.Children; + foreach (CMSNode child in children) + { + nodeChildrenCount(child, countChildren, documentAliasFilters); + } + } + + } + + private void addNode(CMSNode node, int level, bool showGrandChildren, string[] documentAliasFilters) + { + + string preText = string.Empty; + + for (int i = 1; i < level; i++) + { + preText += "- "; + } + + if (documentAliasFilters.Length > 0) + { + foreach (string filter in documentAliasFilters) + { + string trimmedFilter = filter.TrimStart(" ".ToCharArray()); + trimmedFilter = trimmedFilter.TrimEnd(" ".ToCharArray()); + + if (new Document(node.Id).ContentType.Alias == trimmedFilter || trimmedFilter == string.Empty) + { + if (validNode(node.Text)) + { + output[Counter] = preText + node.Text + " [" + node.Id + "]"; + Counter++; + } + } + + } + } + else + { + if (validNode(node.Text)) + { + output[Counter] = preText + node.Text + " [" + node.Id + "]"; + Counter++; + } + } + + if (showGrandChildren) + { + if (node.HasChildren) + { + //store children array here because iterating over an Array property object is very inneficient. + var children = node.Children; + foreach (CMSNode child in children) + { + addNode(child, level + 1, showGrandChildren, documentAliasFilters); + } + } + } + } + + public bool IsReusable + { + get + { + return false; + } + } + } +}