Fix by Tom Witherington - U4-1167 tags not saving or deleting in Tags data type

Also cleaned up the usage of obsolete method calls
This commit is contained in:
Sebastiaan Janssen
2012-11-11 09:17:20 -01:00
parent 3632d6b0c6
commit 75403d3b94

View File

@@ -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<umbraco.interfaces.ITag> GetTagsFromNode(int nodeId)
public System.Collections.Generic.List<ITag> GetTagsFromNode(int nodeId)
{
return library.GetTagsFromNodeAsITags(nodeId);
return cms.businesslogic.Tags.Tag.GetTags(nodeId).Cast<ITag>().ToList();
}
public System.Collections.Generic.List<umbraco.interfaces.ITag> GetAllTags()
public System.Collections.Generic.List<ITag> GetAllTags()
{
return library.GetTagsFromGroupAsITags(_group);
return cms.businesslogic.Tags.Tag.GetTags(_group).Cast<ITag>().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<ITag>().ToList())
cms.businesslogic.Tags.Tag.RemoveTagFromNode(nodeId, tag.TagCaption, tag.Group);
}
#endregion