=0};a.fn.importTags=function(b){id=a(this).attr("id");a("#"+id+"_tagsinput .tag").remove();a.fn.tagsInput.importTags(this,b)};a.fn.tagsInput=function(d){var e=jQuery.extend({interactive:true,defaultText:"add a tag",minChars:0,width:"300px",height:"100px",autocomplete:{selectFirst:false},hide:true,delimiter:",",unique:true,removeWithBackspace:true,placeholderColor:"#666666",autosize:true,comfortZone:20,inputPadding:6*2},d);this.each(function(){if(e.hide){a(this).hide()}var d=a(this).attr("id");if(!d||b[a(this).attr("id")]){d=a(this).attr("id","tags"+(new Date).getTime()).attr("id")}var f=jQuery.extend({pid:d,real_input:"#"+d,holder:"#"+d+"_tagsinput",input_wrapper:"#"+d+"_addTag",fake_input:"#"+d+"_tag"},e);b[d]=f.delimiter;if(e.onAddTag||e.onRemoveTag||e.onChange){c[d]=new Array;c[d]["onAddTag"]=e.onAddTag;c[d]["onRemoveTag"]=e.onRemoveTag;c[d]["onChange"]=e.onChange}var g='';a(g).insertAfter(this);a(f.holder).css("width",e.width);a(f.holder).css("height",e.height);if(a(f.real_input).val()!=""){a.fn.tagsInput.importTags(a(f.real_input),a(f.real_input).val())}if(e.interactive){a(f.fake_input).val(a(f.fake_input).attr("data-default"));a(f.fake_input).css("color",e.placeholderColor);a(f.fake_input).resetAutosize(e);a(f.holder).bind("click",f,function(b){a(b.data.fake_input).focus()});a(f.fake_input).bind("focus",f,function(b){if(a(b.data.fake_input).val()==a(b.data.fake_input).attr("data-default")){a(b.data.fake_input).val("")}a(b.data.fake_input).css("color","#000000")});if(e.autocomplete_url!=undefined){autocomplete_options={source:e.autocomplete_url};for(attrname in e.autocomplete){autocomplete_options[attrname]=e.autocomplete[attrname]}if(jQuery.Autocompleter!==undefined){a(f.fake_input).autocomplete(e.autocomplete_url,e.autocomplete);a(f.fake_input).bind("result",f,function(b,c,f){if(c){a("#"+d).addTag(c[0]+"",{focus:true,unique:e.unique})}})}else if(jQuery.ui.autocomplete!==undefined){a(f.fake_input).autocomplete(autocomplete_options);a(f.fake_input).bind("autocompleteselect",f,function(b,c){a(b.data.real_input).addTag(c.item.value,{focus:true,unique:e.unique});return false})}}else{a(f.fake_input).bind("blur",f,function(b){var c=a(this).attr("data-default");if(a(b.data.fake_input).val()!=""&&a(b.data.fake_input).val()!=c){if(b.data.minChars<=a(b.data.fake_input).val().length&&(!b.data.maxChars||b.data.maxChars>=a(b.data.fake_input).val().length))a(b.data.real_input).addTag(a(b.data.fake_input).val(),{focus:true,unique:e.unique})}else{a(b.data.fake_input).val(a(b.data.fake_input).attr("data-default"));a(b.data.fake_input).css("color",e.placeholderColor)}return false})}a(f.fake_input).bind("keypress",f,function(b){if(b.which==b.data.delimiter.charCodeAt(0)||b.which==13){b.preventDefault();if(b.data.minChars<=a(b.data.fake_input).val().length&&(!b.data.maxChars||b.data.maxChars>=a(b.data.fake_input).val().length))a(b.data.real_input).addTag(a(b.data.fake_input).val(),{focus:true,unique:e.unique});a(b.data.fake_input).resetAutosize(e);return false}else if(b.data.autosize){a(b.data.fake_input).doAutosize(e)}});f.removeWithBackspace&&a(f.fake_input).bind("keydown",function(b){if(b.keyCode==8&&a(this).val()==""){b.preventDefault();var c=a(this).closest(".tagsinput").find(".tag:last").text();var d=a(this).attr("id").replace(/_tag$/,"");c=c.replace(/[\s]+x$/,"");a("#"+d).removeTag(escape(c));a(this).trigger("focus")}});a(f.fake_input).blur();if(f.unique){a(f.fake_input).keydown(function(b){if(b.keyCode==8||String.fromCharCode(b.which).match(/\w+|[áéíóúÁÉÍÓÚñÑ,/]+/)){a(this).removeClass("not_valid")}})}}});return this};a.fn.tagsInput.updateTagsField=function(c,d){var e=a(c).attr("id");a(c).val(d.join(b[e]))};a.fn.tagsInput.importTags=function(d,e){a(d).val("");var f=a(d).attr("id");var g=e.split(b[f]);for(i=0;i();
while (rr.Read())
{
- context.Response.Write(rr.GetString("tag") + Environment.NewLine);
+ tagList.Add(rr.GetString("tag"));
}
-
+ context.Response.Write(returnJson
+ ? new JavaScriptSerializer().Serialize(tagList)
+ : string.Join(Environment.NewLine, tagList));
}
catch (Exception ex)
{
diff --git a/src/umbraco.editorControls/tags/DataEditor.cs b/src/umbraco.editorControls/tags/DataEditor.cs
index 93f2415b2c..a6bd91ceaf 100644
--- a/src/umbraco.editorControls/tags/DataEditor.cs
+++ b/src/umbraco.editorControls/tags/DataEditor.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections;
+using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using umbraco.BusinessLogic;
@@ -24,7 +25,6 @@ namespace umbraco.editorControls.tags
_group = Prevalues["group"].ToString();
}
- public CheckBoxList tagCheckList = new CheckBoxList();
public TextBox tagBox = new TextBox();
@@ -32,49 +32,32 @@ namespace umbraco.editorControls.tags
public void Save()
{
-
- CheckBoxList items = tagCheckList;
int _nodeID;
int.TryParse(_data.NodeId.ToString(), out _nodeID);
string allTags = "";
- int tagId = 0;
-
//first clear out all items associated with this ID...
umbraco.cms.businesslogic.Tags.Tag.RemoveTagsFromNode(_nodeID, _group);
- //and now we add them again...
- foreach (ListItem li in items.Items)
+ var items = tagBox.Text.Trim().Split(',');
+ foreach (var item in items)
{
- if (li.Selected)
+ 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)
{
-
- if (li.Value == "0")
- {
- // NH 4.7.1 if a tag doesn't have an id associated we'll do a 2nd check in case the XHR request went wrong
- // from Codeplex 30151
- tagId = cms.businesslogic.Tags.Tag.GetTagId(li.Text, _group);
- if (tagId == 0)
- tagId = cms.businesslogic.Tags.Tag.AddTag(li.Text, _group);
- li.Value = tagId.ToString();
- }
- else
- {
- int.TryParse(li.Value, out tagId);
- }
-
- if (tagId > 0)
- {
-
- umbraco.cms.businesslogic.Tags.Tag.AssociateTagToNode(_nodeID, tagId);
-
- tagId = 0;
- allTags += "," + li.Text;
- }
+ umbraco.cms.businesslogic.Tags.Tag.AssociateTagToNode(_nodeID, tagId);
}
}
+
//and just in case, we'll save the tags as plain text on the node itself...
- _data.Value = allTags.Trim().Trim(',');
+ _data.Value = tagBox.Text;
}
public bool ShowLabel
@@ -87,44 +70,6 @@ namespace umbraco.editorControls.tags
get { return false; }
}
- public void tagBoxTextChange(object sender, EventArgs e)
- {
- try
- {
- if (tagBox.Text.Trim().Length > 0)
- {
- CheckBoxList items = tagCheckList;
-
- string[] tags = tagBox.Text.Trim().Trim(',').Split(',');
-
-
- for (int i = 0; i < tags.Length; i++)
- {
- //if not found we'll get zero and handle that onsave instead...
- int id = getTagId(tags[i], _group);
-
- //we don't want 2 of a kind...
- if (items.Items.FindByText(tags[i].Trim()) == null)
- {
- ListItem li = new ListItem(tags[i], id.ToString());
- li.Selected = true;
- items.Items.Add(li);
- }
- }
-
- //reset the textbox
- tagBox.Text = "";
-
- ScriptManager.GetCurrent(Page).SetFocus(tagBox);
- }
-
- }
- catch (Exception ex)
- {
- Log.Add(LogTypes.Debug, -1, ex.ToString());
- }
- }
-
[Obsolete("use the umbraco.cms.businesslogic.Tags.Tag class instead")]
public int getTagId(string tag, string group)
@@ -137,9 +82,14 @@ namespace umbraco.editorControls.tags
{
base.OnInit(e);
- ClientDependencyLoader.Instance.RegisterDependency("Application/JQuery/jquery.autocomplete.js", "UmbracoClient", ClientDependencyType.Javascript);
+ //ClientDependencyLoader.Instance.RegisterDependency("Application/JQuery/jquery.autocomplete.js", "UmbracoClient", ClientDependencyType.Javascript);
+ 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();
//making sure that we have a ID for context
@@ -163,41 +113,23 @@ namespace umbraco.editorControls.tags
}
}
-
- tagBox.ID = "tagBox_" + _alias;
- tagBox.AutoPostBack = true;
- tagBox.AutoCompleteType = AutoCompleteType.Disabled;
- tagBox.TextChanged += new System.EventHandler(this.tagBoxTextChange);
- tagBox.CssClass = "umbEditorTextField";
-
- Button tagButton = new Button();
- tagButton.Click += new System.EventHandler(this.tagBoxTextChange);
- tagButton.Text = "tag";
-
-
- tagCheckList.ID = "tagCheckList_" + _alias;
+ tagBox.ID = "tagBox2_" + _alias;
+ tagBox.CssClass = "umbEditorTextField umbTagBox";
if (!String.IsNullOrEmpty(pageId))
{
var tags = umbraco.cms.businesslogic.Tags.Tag.GetTags(int.Parse(pageId), _group);
- foreach (var t in tags)
- {
- ListItem li = new ListItem(t.TagCaption, t.Id.ToString());
- li.Selected = true;
- tagCheckList.Items.Add(li);
- }
+ tagBox.Text = string.Join(",", tags.Select(x => x.TagCaption));
}
this.ContentTemplateContainer.Controls.Add(tagBox);
- this.ContentTemplateContainer.Controls.Add(tagButton);
- this.ContentTemplateContainer.Controls.Add(tagCheckList);
string tagsAutoCompleteScript =
- "jQuery(\"#"
- + tagBox.ClientID + "\").autocomplete(\""
- + umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco)
- + "/webservices/TagsAutoCompleteHandler.ashx\",{minChars: 2,max: 100, extraParams:{group:\"" + _group + "\",id:\"" + pageId + "\",rnd:\"" + DateTime.Now.Ticks + "\"}}).result(function(e, data){jQuery(\"#" + tagButton.ClientID + "\").trigger('click');});";
+ "jQuery('.umbTagBox').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 =
@@ -210,10 +142,8 @@ namespace umbraco.editorControls.tags
if (Page.IsPostBack)
{
ScriptManager.RegisterClientScriptBlock(this, GetType(), ClientID + "_tags", tagsAutoCompleteScript, true);
-
}
-
}
#endregion