From 75403d3b94e5a233e0246c8b4334f320bf8bf32f Mon Sep 17 00:00:00 2001 From: Sebastiaan Janssen Date: Sun, 11 Nov 2012 09:17:20 -0100 Subject: [PATCH] Fix by Tom Witherington - U4-1167 tags not saving or deleting in Tags data type Also cleaned up the usage of obsolete method calls --- src/umbraco.editorControls/tags/DataEditor.cs | 158 ++++++++---------- 1 file changed, 66 insertions(+), 92 deletions(-) diff --git a/src/umbraco.editorControls/tags/DataEditor.cs b/src/umbraco.editorControls/tags/DataEditor.cs index ab80d352c4..4281e1f12a 100644 --- a/src/umbraco.editorControls/tags/DataEditor.cs +++ b/src/umbraco.editorControls/tags/DataEditor.cs @@ -3,21 +3,20 @@ using System.Collections; using System.Linq; using System.Web.UI; using System.Web.UI.WebControls; -using umbraco.BusinessLogic; using ClientDependency.Core.Controls; using ClientDependency.Core; -using umbraco.presentation; +using umbraco.interfaces; namespace umbraco.editorControls.tags { - public class DataEditor : System.Web.UI.UpdatePanel, umbraco.interfaces.IDataEditor, umbraco.interfaces.IUseTags + public class DataEditor : TextBox, IDataEditor, IUseTags { #region IDataEditor Members - cms.businesslogic.datatype.DefaultData _data; - string _group = ""; + private readonly cms.businesslogic.datatype.DefaultData _data; + readonly string _group = ""; - public DataEditor(umbraco.interfaces.IData Data, SortedList Prevalues) + public DataEditor(IData Data, SortedList Prevalues) { _data = (cms.businesslogic.datatype.DefaultData)Data; @@ -25,41 +24,22 @@ namespace umbraco.editorControls.tags _group = Prevalues["group"].ToString(); } - public TextBox tagBox = new TextBox(); - - public Control Editor { get { return this; } } public void Save() { - int _nodeID; - int.TryParse(_data.NodeId.ToString(), out _nodeID); - string allTags = ""; + int nodeId = _data.NodeId; //first clear out all items associated with this ID... - umbraco.cms.businesslogic.Tags.Tag.RemoveTagsFromNode(_nodeID, _group); + cms.businesslogic.Tags.Tag.RemoveTagsFromNode(nodeId, _group); - var items = tagBox.Text.Trim().Split(','); - foreach (var item in items) - { - var tagName = item.Trim(); - if(string.IsNullOrEmpty(tagName)) - continue; - - var tagId = cms.businesslogic.Tags.Tag.GetTagId(tagName, _group); - if(tagId == 0) - tagId = cms.businesslogic.Tags.Tag.AddTag(tagName, _group); - - if (tagId > 0) - { - umbraco.cms.businesslogic.Tags.Tag.AssociateTagToNode(_nodeID, tagId); - } - } + UpdateOrAddTags(nodeId); //and just in case, we'll save the tags as plain text on the node itself... - _data.Value = tagBox.Text; + _data.Value = this.Text; } + public bool ShowLabel { get { return true; } @@ -74,35 +54,54 @@ namespace umbraco.editorControls.tags [Obsolete("use the umbraco.cms.businesslogic.Tags.Tag class instead")] public int getTagId(string tag, string group) { - return umbraco.cms.businesslogic.Tags.Tag.GetTagId(tag, group); + return cms.businesslogic.Tags.Tag.GetTagId(tag, group); } - protected override void OnInit(EventArgs e) { base.OnInit(e); - //ClientDependencyLoader.Instance.RegisterDependency("Application/JQuery/jquery.autocomplete.js", "UmbracoClient", ClientDependencyType.Javascript); + // register all dependencies - only registered once ClientDependencyLoader.Instance.RegisterDependency("ui/ui-lightness/jquery-ui.custom.css", "UmbracoClient", ClientDependencyType.Css); ClientDependencyLoader.Instance.RegisterDependency("css/umbracoGui.css", "UmbracoRoot", ClientDependencyType.Css); - ClientDependencyLoader.Instance.RegisterDependency("tags/css/jquery.tagsinput.css", "UmbracoClient", ClientDependencyType.Css); ClientDependencyLoader.Instance.RegisterDependency("tags/js/jquery.tagsinput.min.js", "UmbracoClient", ClientDependencyType.Javascript); - - string _alias = ((umbraco.cms.businesslogic.datatype.DefaultData)_data).PropertyId.ToString(); + var pageId = GetPageId(); + if (!Page.IsPostBack && !String.IsNullOrEmpty(pageId) && string.IsNullOrWhiteSpace(this.Text)) + { + var tags = cms.businesslogic.Tags.Tag.GetTags(int.Parse(pageId), _group); + this.Text = string.Join(",", tags.Select(x => x.TagCaption)); + } - //making sure that we have a ID for context - string pageId = UmbracoContext.Current.Request["id"]; + var tagsAutoCompleteScript = TagsAutocompleteScript(pageId); + var tagsAutoCompleteInitScript = string.Format("jQuery(document).ready(function(){{{0}}});", tagsAutoCompleteScript); - if (pageId != null) pageId = pageId.Trim(); + // register it as a startup script + Page.ClientScript.RegisterStartupScript(GetType(), ClientID + "_tagsinit", tagsAutoCompleteInitScript, true); + } + private string TagsAutocompleteScript(string pageId) + { + var tagsAutoCompleteScript = string.Format("jQuery('#{0}').tagsInput({{ width: '400px', defaultText: 'Add a tag', minChars: 2, autocomplete_url: '{1}/webservices/TagsAutoCompleteHandler.ashx?group={2}&id={3}&rnd={4}&format=json' }});", + this.ClientID, + Umbraco.Core.IO.IOHelper.ResolveUrl(Umbraco.Core.IO.SystemDirectories.Umbraco), + _group, + pageId, + DateTime.Now.Ticks); + + return tagsAutoCompleteScript; + } + + private static string GetPageId() + { + var pageId = Umbraco.Web.UmbracoContext.Current.HttpContext.Request["id"]; if (string.IsNullOrEmpty(pageId)) { // we need an empty try/catch as Node.GetCurrent() will throw an exception if we're outside of Umbraco Context try { - NodeFactory.Node currentNode = NodeFactory.Node.GetCurrent(); + var currentNode = NodeFactory.Node.GetCurrent(); if (currentNode != null) { pageId = currentNode.Id.ToString(); @@ -112,38 +111,28 @@ namespace umbraco.editorControls.tags { } } + if (pageId != null) pageId = pageId.Trim(); + return pageId; + } - tagBox.ID = "tagBox2_" + _alias; - tagBox.CssClass = "umbEditorTextField umbTagBox"; - - if (!String.IsNullOrEmpty(pageId)) + private void UpdateOrAddTags(int nodeId) + { + var items = this.Text.Trim().Split(','); + foreach (var item in items) { - var tags = umbraco.cms.businesslogic.Tags.Tag.GetTags(int.Parse(pageId), _group); + var tagName = item.Trim(); + if (string.IsNullOrEmpty(tagName)) + continue; - tagBox.Text = string.Join(",", tags.Select(x => x.TagCaption)); + var tagId = cms.businesslogic.Tags.Tag.GetTagId(tagName, _group); + if (tagId == 0) + tagId = cms.businesslogic.Tags.Tag.AddTag(tagName, _group); + + if (tagId > 0) + { + cms.businesslogic.Tags.Tag.AssociateTagToNode(nodeId, tagId); + } } - - this.ContentTemplateContainer.Controls.Add(tagBox); - - string tagsAutoCompleteScript = - "jQuery('#" + tagBox.ClientID + "').tagsInput({ width: '400px', defaultText: 'Add a tag', minChars: 2, autocomplete_url: '" + - umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco) - + "/webservices/TagsAutoCompleteHandler.ashx?group=" + _group + "&id=" + pageId + "&rnd=" + - DateTime.Now.Ticks + "&format=json' });"; - - - string tagsAutoCompleteInitScript = - "jQuery(document).ready(function(){" - + tagsAutoCompleteScript - + "});"; - - Page.ClientScript.RegisterStartupScript(GetType(), ClientID + "_tagsinit", tagsAutoCompleteInitScript, true); - - if (Page.IsPostBack) - { - ScriptManager.RegisterClientScriptBlock(this, GetType(), ClientID + "_tags", tagsAutoCompleteScript, true); - } - } #endregion @@ -155,50 +144,35 @@ namespace umbraco.editorControls.tags get { return _group; } } - #endregion - - #region IUseTags Members - - public void RemoveTag(int nodeId, string tag) { - library.RemoveTagFromNode(nodeId, tag, _group); + cms.businesslogic.Tags.Tag.RemoveTagFromNode(nodeId, tag, _group); } - public System.Collections.Generic.List GetTagsFromNode(int nodeId) + public System.Collections.Generic.List GetTagsFromNode(int nodeId) { - return library.GetTagsFromNodeAsITags(nodeId); + return cms.businesslogic.Tags.Tag.GetTags(nodeId).Cast().ToList(); } - public System.Collections.Generic.List GetAllTags() + public System.Collections.Generic.List GetAllTags() { - return library.GetTagsFromGroupAsITags(_group); + return cms.businesslogic.Tags.Tag.GetTags(_group).Cast().ToList(); } - #endregion - - #region IUseTags Members - - public void AddTag(string tag) { - library.AddTag(tag, _group); + cms.businesslogic.Tags.Tag.AddTag(tag, _group); } public void AddTagToNode(int nodeId, string tag) { - library.addTagsToNode(nodeId, tag, _group); + cms.businesslogic.Tags.Tag.AddTagsToNode(nodeId, tag, _group); } - #endregion - - #region IUseTags Members - - public void RemoveTagsFromNode(int nodeId) { - foreach (umbraco.interfaces.ITag t in library.GetTagsFromNodeAsITags(nodeId)) - library.RemoveTagFromNode(nodeId, t.TagCaption, t.Group); + foreach (var tag in cms.businesslogic.Tags.Tag.GetTags(nodeId).Cast().ToList()) + cms.businesslogic.Tags.Tag.RemoveTagFromNode(nodeId, tag.TagCaption, tag.Group); } #endregion