From ad2764e3acf7a1ea0e4393abfd766fb93bee48ef Mon Sep 17 00:00:00 2001
From: Jeremy Pyne
Date: Mon, 24 Jun 2013 14:51:52 -0400
Subject: [PATCH 0001/1046] Added code to select the parent node when doing
Move/Copy operations. This will save lots of time for users. This code can
also be added to other places that use the TreeControl to pre-select the
currently selected item(media pickers for example) so that changing content
will be quicker.
---
.../umbraco/controls/Tree/TreeControl.ascx | 6 ++++++
.../umbraco/controls/Tree/TreeControl.ascx.cs | 10 ++++++++++
.../umbraco/dialogs/moveOrCopy.aspx.cs | 4 ++++
3 files changed, 20 insertions(+)
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
index c7fa6aa5d5..3d379f68d8 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
@@ -47,6 +47,12 @@ jQuery(document).ready(function() {
dataUrl: "<%#umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco)%>/webservices/TreeDataService.ashx",
serviceUrl: "<%#umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco)%>/webservices/TreeClientService.asmx/GetInitAppTreeData"});
+ <%if(!String.IsNullOrEmpty(this.SelectedNodePath)) {%>
+ setTimeout(function() {
+ jQuery("#<%=ClientID%>").UmbracoTreeAPI().syncTree('<%=this.SelectedNodePath%>', true, true);
+ }, 500);
+ <% } %>
+
//add event handler for ajax errors, this will refresh the whole application
var mainTree = UmbClientMgr.mainTree();
if (mainTree != null) {
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs
index fd1b180005..c9d4cc8f74 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx.cs
@@ -62,6 +62,7 @@ namespace umbraco.controls.Tree
private TreeMode m_TreeType = TreeMode.Standard;
private bool m_IsInit = false;
private TreeService m_TreeService = new TreeService();
+ private string m_SelectedNodePath;
#region Public Properties
@@ -100,6 +101,15 @@ namespace umbraco.controls.Tree
}
}
+ public string SelectedNodePath
+ {
+ get { return m_SelectedNodePath; }
+ set
+ {
+ m_SelectedNodePath = value;
+ }
+ }
+
public string TreeType
{
get { return m_TreeService.TreeType; }
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
index ebad6f2151..d80500870c 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
@@ -80,6 +80,10 @@ namespace umbraco.dialogs
var cmsNode = new CMSNode(int.Parse(Request.GetItemAsString("id")));
+ // Preselect the parent of the seslected item.
+ if(cmsNode.ParentId > 0)
+ JTree.SelectedNodePath = cmsNode.Parent.Path;
+
var validAction = true;
if (CurrentApp == Constants.Applications.Content && cmsNode.HasChildren)
validAction = ValidAction(Request.GetItemAsString("mode") == "cut" ? 'M' : 'O');
From fe23502e67c431d3a31b73246c038db7a8a29aaf Mon Sep 17 00:00:00 2001
From: Jeremy Pyne
Date: Tue, 25 Jun 2013 15:48:16 -0400
Subject: [PATCH 0002/1046] Added code to actually pre-select the parent node
instead of just locating it in the tree. This seams keeps the Ui in a sane
state.
Updated control code in Umbraco.Web.Ui from Umbraco.Web.
---
.../umbraco/controls/Tree/TreeControl.ascx | 15 +++++++++++++++
.../umbraco/controls/Tree/TreeControl.ascx | 11 ++++++++++-
2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx b/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
index c7fa6aa5d5..fb4fac1e2d 100644
--- a/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
+++ b/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
@@ -47,6 +47,21 @@ jQuery(document).ready(function() {
dataUrl: "<%#umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco)%>/webservices/TreeDataService.ashx",
serviceUrl: "<%#umbraco.IO.IOHelper.ResolveUrl(umbraco.IO.SystemDirectories.Umbraco)%>/webservices/TreeClientService.asmx/GetInitAppTreeData"});
+ <%if(!String.IsNullOrEmpty(this.SelectedNodePath)) {%>
+ setTimeout(function() {
+ treeApi = jQuery("#<%=ClientID%>").UmbracoTreeAPI();
+ treeApi.syncTree('<%=this.SelectedNodePath%>', true, true);
+
+ // select the parent node once found.
+ var iv = setInterval(function() {
+ var node = treeApi.findNode('<%=this.SelectedNodePath%>'.split(',').pop(), true);
+ if(node != false) {
+ treeApi.selectNode(node, false, true);
+ clearInterval(iv);
+ }
+ }, 500);
+ <% } %>
+
//add event handler for ajax errors, this will refresh the whole application
var mainTree = UmbClientMgr.mainTree();
if (mainTree != null) {
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
index 3d379f68d8..fb4fac1e2d 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
@@ -49,7 +49,16 @@ jQuery(document).ready(function() {
<%if(!String.IsNullOrEmpty(this.SelectedNodePath)) {%>
setTimeout(function() {
- jQuery("#<%=ClientID%>").UmbracoTreeAPI().syncTree('<%=this.SelectedNodePath%>', true, true);
+ treeApi = jQuery("#<%=ClientID%>").UmbracoTreeAPI();
+ treeApi.syncTree('<%=this.SelectedNodePath%>', true, true);
+
+ // select the parent node once found.
+ var iv = setInterval(function() {
+ var node = treeApi.findNode('<%=this.SelectedNodePath%>'.split(',').pop(), true);
+ if(node != false) {
+ treeApi.selectNode(node, false, true);
+ clearInterval(iv);
+ }
}, 500);
<% } %>
From 7e645f9a6a8e0cba89cd2058643f7f419a79eaa2 Mon Sep 17 00:00:00 2001
From: DougMac
Date: Sat, 17 Aug 2013 10:50:26 +0100
Subject: [PATCH 0003/1046] Fixes: U4-2060 Spell Checker Broke After Google
Update
The Google spell check at https://www.google.com/tbproxy/spell no longer
works. This updates to a newer Google Api (again undocumented)
---
.../plugins/tinymce3/GoogleSpellChecker.cs | 65 ++++++++++---------
.../plugins/tinymce3/SpellCheckerResult.cs | 30 +++++++++
2 files changed, 66 insertions(+), 29 deletions(-)
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
index 42bf22e5fe..edaa5950c4 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
@@ -5,18 +5,27 @@ using System.Web.Script.Serialization;
using System.Net;
using System.Text;
using System.Xml;
+using System.Collections.Generic;
// NB: This class was moved out of the client tinymce folder to aid with upgrades
// but we'll keep the old namespace to make things easier for now (MB)
namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
{
public class GoogleSpellChecker : SpellChecker, IHttpHandler
- {
+ {
private static string SendRequest(string lang, string data)
{
string googleResponse;
- string requestUriString = string.Format("https://www.google.com:443/tbproxy/spell?lang={0}&hl={0}", lang);
- string s = string.Format("{0}", HttpContext.Current.Server.UrlEncode(data));
+ string requestUriString = "https://www.googleapis.com:443/rpc";
+ var requestData = new Dictionary();
+ var requestParams = new Dictionary();
+ requestParams.Add("language", lang);
+ requestParams.Add("text", data);
+ requestParams.Add("key", "AIzaSyCLlKc60a3z7lo8deV-hAyDU7rHYgL4HZg");
+ requestData.Add("method", "spelling.check");
+ requestData.Add("apiVersion", "v2");
+ requestData.Add("params", requestParams);
+ string jsonString = new JavaScriptSerializer().Serialize(requestData);
StreamReader reader = null;
HttpWebResponse response = null;
Stream requestStream = null;
@@ -25,15 +34,10 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUriString);
request.KeepAlive = false;
request.Method = "POST";
- request.ContentType = "application/PTI26";
- request.ContentLength = s.Length;
- WebHeaderCollection headers = request.Headers;
- headers.Add("MIME-Version: 1.0");
- headers.Add("Request-number: 1");
- headers.Add("Document-type: Request");
- headers.Add("Interface-Version: Test 1.4");
+ request.ContentType = "application/json";
+ request.ContentLength = jsonString.Length;
requestStream = request.GetRequestStream();
- byte[] bytes = new ASCIIEncoding().GetBytes(s);
+ byte[] bytes = new ASCIIEncoding().GetBytes(jsonString);
requestStream.Write(bytes, 0, bytes.Length);
response = (HttpWebResponse)request.GetResponse();
reader = new StreamReader(response.GetResponseStream());
@@ -64,18 +68,20 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
/// The words to be checked.
///
public override SpellCheckerResult CheckWords(string language, string[] words)
- {
- XmlDocument document = new XmlDocument();
+ {
string data = string.Join(" ", words); //turn them into a space-separated string as that's what google takes
- string xml = SendRequest(language, data);
- document.LoadXml(xml);
+ string json = SendRequest(language, data);
+ var jsonRes = new JavaScriptSerializer().Deserialize(json);
- var res = new SpellCheckerResult();
- foreach (XmlNode node in document.SelectNodes("//c")) //go through each of the incorrectly spelt words
+ var res = new SpellCheckerResult();
+ // Get list of misspelled words
+ if (jsonRes.result != null && jsonRes.result.spellingCheckResponse != null)
{
- XmlElement element = (XmlElement)node;
- res.result.Add(data.Substring(Convert.ToInt32(element.GetAttribute("o")), Convert.ToInt32(element.GetAttribute("l"))));
- }
+ foreach (var misspelling in jsonRes.result.spellingCheckResponse.misspellings)
+ {
+ res.result.Add(data.Substring(misspelling.charStart, misspelling.charLength));
+ }
+ }
return res;
}
@@ -87,22 +93,23 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
/// The word that is misspelt.
///
public override SpellCheckerResult GetSuggestions(string language, string word)
- {
- XmlDocument document = new XmlDocument();
- string xml = SendRequest(language, word);
- document.LoadXml(xml);
+ {
+ string json = SendRequest(language, word);
+ var jsonRes = new JavaScriptSerializer().Deserialize(json);
+
var res = new SpellCheckerResult();
- foreach (XmlNode node in document.SelectNodes("//c")) //select each incorrectly spelt work
+ // Get list of suggestions
+ if (jsonRes.result != null && jsonRes.result.spellingCheckResponse != null)
{
- XmlElement element = (XmlElement)node;
- foreach (string s in element.InnerText.Split(new char[] { '\t' })) //they are tab-separated for suggestions
+ foreach (var misspelling in jsonRes.result.spellingCheckResponse.misspellings)
{
- if (!string.IsNullOrEmpty(s))
+ foreach (var suggestion in misspelling.suggestions)
{
- res.result.Add(s);
+ res.result.Add(suggestion.suggestion);
}
}
}
+
return res;
}
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
index 1372629cf8..c6d16e903c 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
@@ -32,4 +32,34 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
/// The error.
public string error { get; set; }
}
+
+ ///
+ /// Object used to deserialise the Google Json response
+ ///
+ public class JsonSpellCheckerResult
+ {
+ public GoogleResponseResult result { get; set; }
+
+ public class GoogleResponseResult
+ {
+ public GoogleResponseSpellingCheckResponse spellingCheckResponse { get; set; }
+
+ }
+ public class GoogleResponseSpellingCheckResponse
+ {
+ public List misspellings { get; set; }
+
+ }
+ public class GoogleResponseMisspelling
+ {
+ public int charStart { get; set; }
+ public int charLength { get; set; }
+ public List suggestions { get; set; }
+
+ }
+ public class GoogleResponseSuggestion
+ {
+ public string suggestion { get; set; }
+ }
+ }
}
From 0218e39664dbd0adce3bf18898a5e7ce0d16138f Mon Sep 17 00:00:00 2001
From: DougMac
Date: Mon, 26 Aug 2013 22:50:53 +0100
Subject: [PATCH 0004/1046] Fixes: U4-2060 Spell Checker Broke After Google
Update
---
.../plugins/tinymce3/GoogleSpellChecker.cs | 20 +++++++++----------
.../plugins/tinymce3/SpellCheckerResult.cs | 2 +-
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
index edaa5950c4..ef3a6376b0 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/GoogleSpellChecker.cs
@@ -12,7 +12,7 @@ using System.Collections.Generic;
namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
{
public class GoogleSpellChecker : SpellChecker, IHttpHandler
- {
+ {
private static string SendRequest(string lang, string data)
{
string googleResponse;
@@ -25,7 +25,7 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
requestData.Add("method", "spelling.check");
requestData.Add("apiVersion", "v2");
requestData.Add("params", requestParams);
- string jsonString = new JavaScriptSerializer().Serialize(requestData);
+ string jsonString = new JavaScriptSerializer().Serialize(requestData);
StreamReader reader = null;
HttpWebResponse response = null;
Stream requestStream = null;
@@ -35,7 +35,7 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
request.KeepAlive = false;
request.Method = "POST";
request.ContentType = "application/json";
- request.ContentLength = jsonString.Length;
+ request.ContentLength = jsonString.Length;
requestStream = request.GetRequestStream();
byte[] bytes = new ASCIIEncoding().GetBytes(jsonString);
requestStream.Write(bytes, 0, bytes.Length);
@@ -68,20 +68,20 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
/// The words to be checked.
///
public override SpellCheckerResult CheckWords(string language, string[] words)
- {
+ {
string data = string.Join(" ", words); //turn them into a space-separated string as that's what google takes
string json = SendRequest(language, data);
var jsonRes = new JavaScriptSerializer().Deserialize(json);
- var res = new SpellCheckerResult();
+ var res = new SpellCheckerResult();
// Get list of misspelled words
if (jsonRes.result != null && jsonRes.result.spellingCheckResponse != null)
{
foreach (var misspelling in jsonRes.result.spellingCheckResponse.misspellings)
- {
+ {
res.result.Add(data.Substring(misspelling.charStart, misspelling.charLength));
}
- }
+ }
return res;
}
@@ -93,12 +93,12 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
/// The word that is misspelt.
///
public override SpellCheckerResult GetSuggestions(string language, string word)
- {
+ {
string json = SendRequest(language, word);
var jsonRes = new JavaScriptSerializer().Deserialize(json);
var res = new SpellCheckerResult();
- // Get list of suggestions
+ // Get list of suggestions
if (jsonRes.result != null && jsonRes.result.spellingCheckResponse != null)
{
foreach (var misspelling in jsonRes.result.spellingCheckResponse.misspellings)
@@ -138,7 +138,7 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
suggestions = new SpellCheckerResult();
break;
}
-
+
suggestions.id = input.Id;
JavaScriptSerializer ser = new JavaScriptSerializer();
var res = ser.Serialize(suggestions);
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
index c6d16e903c..fc5f7a0bfd 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/plugins/tinymce3/SpellCheckerResult.cs
@@ -60,6 +60,6 @@ namespace umbraco.presentation.umbraco_client.tinymce3.plugins.spellchecker
public class GoogleResponseSuggestion
{
public string suggestion { get; set; }
- }
+ }
}
}
From 7a2a4445793d680222c72cec196f31dd02e3f28e Mon Sep 17 00:00:00 2001
From: Jeremy Pyne
Date: Wed, 7 Aug 2013 15:28:41 -0400
Subject: [PATCH 0005/1046] Fix for select parent o move or copy in 6.1.3.
---
src/Umbraco.Web/Umbraco.Web.csproj | 11 +++++++----
.../umbraco/dialogs/moveOrCopy.aspx.cs | 4 ++--
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 67d9b6335d..2986b64059 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -291,7 +291,7 @@
-
+
@@ -1871,7 +1871,8 @@
-
+
+
@@ -1935,7 +1936,9 @@
-
+
+ ASPXCodeBehind
+
@@ -2058,4 +2061,4 @@
-
\ No newline at end of file
+
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
index 3069d9485d..a66dd8634c 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/moveOrCopy.aspx.cs
@@ -90,8 +90,8 @@ namespace umbraco.dialogs
}
// Preselect the parent of the seslected item.
- if(cmsNode.ParentId > 0)
- JTree.SelectedNodePath = cmsNode.Parent.Path;
+ if (currContent.ParentId > 0)
+ JTree.SelectedNodePath = currContent.Path.Substring(0, currContent.Path.LastIndexOf(','));
var validAction = true;
if (CurrentApp == Constants.Applications.Content && Umbraco.Core.Models.ContentExtensions.HasChildren(currContent, Services))
From e65a71a05a265bda0cccfda129377cbe73602299 Mon Sep 17 00:00:00 2001
From: Jeremy Pyne
Date: Thu, 29 Aug 2013 11:00:15 -0400
Subject: [PATCH 0006/1046] Added code to pre-select the current node in
content tree pickers based on the location of the document in the tree.
This is a HUGE time saver with an even moderately complex site hierarchy.
---
src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx | 8 --------
.../umbraco/controls/Tree/TreeControl.ascx | 8 --------
.../umbraco/dialogs/treePicker.aspx.cs | 6 ++++++
src/umbraco.controls/TreePicker/SimpleContentPicker.cs | 4 ++++
src/umbraco.editorControls/pagepicker/pagePicker.cs | 4 ++++
5 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx b/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
index fb4fac1e2d..2d143e6153 100644
--- a/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
+++ b/src/Umbraco.Web.UI/umbraco/controls/Tree/TreeControl.ascx
@@ -51,14 +51,6 @@ jQuery(document).ready(function() {
setTimeout(function() {
treeApi = jQuery("#<%=ClientID%>").UmbracoTreeAPI();
treeApi.syncTree('<%=this.SelectedNodePath%>', true, true);
-
- // select the parent node once found.
- var iv = setInterval(function() {
- var node = treeApi.findNode('<%=this.SelectedNodePath%>'.split(',').pop(), true);
- if(node != false) {
- treeApi.selectNode(node, false, true);
- clearInterval(iv);
- }
}, 500);
<% } %>
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
index fb4fac1e2d..2d143e6153 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/controls/Tree/TreeControl.ascx
@@ -51,14 +51,6 @@ jQuery(document).ready(function() {
setTimeout(function() {
treeApi = jQuery("#<%=ClientID%>").UmbracoTreeAPI();
treeApi.syncTree('<%=this.SelectedNodePath%>', true, true);
-
- // select the parent node once found.
- var iv = setInterval(function() {
- var node = treeApi.findNode('<%=this.SelectedNodePath%>'.split(',').pop(), true);
- if(node != false) {
- treeApi.selectNode(node, false, true);
- clearInterval(iv);
- }
}, 500);
<% } %>
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/treePicker.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/treePicker.aspx.cs
index 4a60b0605b..38518804b4 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/treePicker.aspx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/treePicker.aspx.cs
@@ -20,6 +20,12 @@ namespace umbraco.dialogs
base.OnLoad(e);
TreeParams = TreeRequestParams.FromQueryStrings().CreateTreeService();
DataBind();
+
+ if(Request.QueryString["selected"] != null && TreeParams.TreeType == "content") {
+ var currContent = Services.ContentService.GetById(int.Parse(Request.QueryString["selected"]));
+ if (currContent.ParentId > 0)
+ DialogTree.SelectedNodePath = currContent.Path;
+ }
}
protected TreeService TreeParams { get; private set; }
diff --git a/src/umbraco.controls/TreePicker/SimpleContentPicker.cs b/src/umbraco.controls/TreePicker/SimpleContentPicker.cs
index de93637134..3d70cbbef4 100644
--- a/src/umbraco.controls/TreePicker/SimpleContentPicker.cs
+++ b/src/umbraco.controls/TreePicker/SimpleContentPicker.cs
@@ -1,4 +1,5 @@
using System;
+using System.Web;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -12,6 +13,9 @@ namespace umbraco.uicontrols.TreePicker
{
get
{
+ if (HttpContext.Current.Request.QueryString["id"] != null)
+ return TreeUrlGenerator.GetPickerUrl(Constants.Applications.Content, "content") + "&selected=" + HttpContext.Current.Request.QueryString["id"];
+
return TreeUrlGenerator.GetPickerUrl(Constants.Applications.Content, "content");
}
}
diff --git a/src/umbraco.editorControls/pagepicker/pagePicker.cs b/src/umbraco.editorControls/pagepicker/pagePicker.cs
index 16693194dd..791bb20352 100644
--- a/src/umbraco.editorControls/pagepicker/pagePicker.cs
+++ b/src/umbraco.editorControls/pagepicker/pagePicker.cs
@@ -1,4 +1,5 @@
using System;
+using System.Web;
using System.Web.UI;
using umbraco.cms.presentation.Trees;
@@ -26,6 +27,9 @@ namespace umbraco.editorControls
{
get
{
+ if(HttpContext.Current.Request.QueryString["id"] != null)
+ return TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Content, "content") + "&selected=" + HttpContext.Current.Request.QueryString["id"];
+
return TreeService.GetPickerUrl(Umbraco.Core.Constants.Applications.Content, "content");
}
}
From 69830f28c2324d2c6b5b561b645c87392cc2fc8c Mon Sep 17 00:00:00 2001
From: enkelmedia
Date: Sun, 1 Sep 2013 14:05:54 +0200
Subject: [PATCH 0007/1046] Added SVG as static content so SVG-icons in the
backoffice will be served by IIS
---
src/Umbraco.Web.UI/web.Template.config | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config
index bc0fd45487..b1515c74db 100644
--- a/src/Umbraco.Web.UI/web.Template.config
+++ b/src/Umbraco.Web.UI/web.Template.config
@@ -211,6 +211,7 @@
+
From fdfb6187e9f89387587c4c9a606364c4918aaf32 Mon Sep 17 00:00:00 2001
From: enkelmedia
Date: Sun, 1 Sep 2013 16:51:00 +0200
Subject: [PATCH 0008/1046] Removing SVG from staticContent before addings it.
---
src/Umbraco.Web.UI/web.Template.config | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Umbraco.Web.UI/web.Template.config b/src/Umbraco.Web.UI/web.Template.config
index b1515c74db..a6a8826b44 100644
--- a/src/Umbraco.Web.UI/web.Template.config
+++ b/src/Umbraco.Web.UI/web.Template.config
@@ -211,6 +211,7 @@
+
From baa22301e9a95d213e6aafb41a5abe6985d23d4c Mon Sep 17 00:00:00 2001
From: Stefan Kip
Date: Thu, 5 Sep 2013 11:31:06 +0200
Subject: [PATCH 0009/1046] Added Exception which tells you which datatype is
unable to load
---
src/umbraco.cms/businesslogic/Property/Property.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/umbraco.cms/businesslogic/Property/Property.cs b/src/umbraco.cms/businesslogic/Property/Property.cs
index 8404081677..faf263607e 100644
--- a/src/umbraco.cms/businesslogic/Property/Property.cs
+++ b/src/umbraco.cms/businesslogic/Property/Property.cs
@@ -37,6 +37,8 @@ namespace umbraco.cms.businesslogic.property
_pt = pt;
_id = Id;
+ if (_pt.DataTypeDefinition.DataType == null)
+ throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text));
_data = _pt.DataTypeDefinition.DataType.Data;
_data.PropertyId = Id;
}
@@ -47,6 +49,8 @@ namespace umbraco.cms.businesslogic.property
_pt = PropertyType.GetPropertyType(
SqlHelper.ExecuteScalar("select propertytypeid from cmsPropertyData where id = @id",
SqlHelper.CreateParameter("@id", Id)));
+ if (_pt.DataTypeDefinition.DataType == null)
+ throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text));
_data = _pt.DataTypeDefinition.DataType.Data;
_data.PropertyId = Id;
}
@@ -59,6 +63,8 @@ namespace umbraco.cms.businesslogic.property
//Just to ensure that there is a PropertyType available
_pt = PropertyType.GetPropertyType(property.PropertyTypeId);
+ if (_pt.DataTypeDefinition.DataType == null)
+ throw new Exception(string.Format("Could not load datatype '{0}'", _pt.DataTypeDefinition.Text));
_data = _pt.DataTypeDefinition.DataType.Data;
_data.PropertyId = Id;
}
@@ -142,4 +148,4 @@ namespace umbraco.cms.businesslogic.property
}
}
-}
\ No newline at end of file
+}
From 0d49a59cfe9079e13002d7a15f9cb2e97866a94e Mon Sep 17 00:00:00 2001
From: dprothero
Date: Thu, 5 Sep 2013 15:15:40 -0700
Subject: [PATCH 0010/1046] Fix #U4-2796 Possible to have duplicate Login Name
(Member.LoginName) for Umbraco Members
---
.../umbraco/members/EditMember.aspx.cs | 21 ++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
index cf54379d96..83f0577120 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
@@ -26,6 +26,7 @@ namespace umbraco.cms.presentation.members
protected TextBox MemberLoginNameTxt = new TextBox();
protected RequiredFieldValidator MemberLoginNameVal = new RequiredFieldValidator();
+ protected CustomValidator MemberLoginNameExistCheck = new CustomValidator();
protected PlaceHolder MemberPasswordTxt = new PlaceHolder();
protected TextBox MemberEmail = new TextBox();
@@ -67,12 +68,19 @@ namespace umbraco.cms.presentation.members
MemberLoginNameVal.EnableClientScript = false;
MemberLoginNameVal.Display = ValidatorDisplay.Dynamic;
+ MemberLoginNameExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "Login Name", BasePages.UmbracoEnsuredPage.CurrentUser);
+ MemberLoginNameExistCheck.EnableClientScript = false;
+ MemberLoginNameExistCheck.ValidateEmptyText = false;
+ MemberLoginNameExistCheck.ControlToValidate = MemberEmail.ID;
+ MemberLoginNameExistCheck.ServerValidate += MemberLoginNameExistCheck_ServerValidate;
+
MemberEmailExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "E-mail", BasePages.UmbracoEnsuredPage.CurrentUser);
MemberEmailExistCheck.EnableClientScript = false;
MemberEmailExistCheck.ValidateEmptyText = false;
MemberEmailExistCheck.ControlToValidate = MemberEmail.ID;
MemberEmailExistCheck.ServerValidate += MemberEmailExistCheck_ServerValidate;
+ _contentControl.PropertiesPane.addProperty("", MemberLoginNameExistCheck);
_contentControl.PropertiesPane.addProperty(ui.Text("login"), ph);
_contentControl.PropertiesPane.addProperty(ui.Text("password"), MemberPasswordTxt);
_contentControl.PropertiesPane.addProperty("", MemberEmailExistCheck);
@@ -141,7 +149,18 @@ namespace umbraco.cms.presentation.members
}
- void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args)
+ void MemberLoginNameExistCheck_ServerValidate(object source, ServerValidateEventArgs args)
+ {
+ var oldLoginName = _document.LoginName.Replace(" ", "").ToLower();
+ var newLoginName = MemberLoginNameTxt.Text.Replace(" ", "").ToLower();
+
+ if (oldLoginName != newLoginName && newLoginName != "" && Member.GetMemberFromLoginName(newLoginName) != null)
+ args.IsValid = false;
+ else
+ args.IsValid = true;
+ }
+
+ void MemberEmailExistCheck_ServerValidate(object source, ServerValidateEventArgs args)
{
var oldEmail = _document.Email.ToLower();
var newEmail = MemberEmail.Text.ToLower();
From 6675bac1dc09a3f03e22181624d4ede00d87c722 Mon Sep 17 00:00:00 2001
From: dprothero
Date: Thu, 5 Sep 2013 15:23:25 -0700
Subject: [PATCH 0011/1046] Fix #U4-2796 - fixed copy/paste error (does not
affect functionality)
---
.../umbraco.presentation/umbraco/members/EditMember.aspx.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
index 83f0577120..d83d52f8e3 100644
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
+++ b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMember.aspx.cs
@@ -71,7 +71,7 @@ namespace umbraco.cms.presentation.members
MemberLoginNameExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "Login Name", BasePages.UmbracoEnsuredPage.CurrentUser);
MemberLoginNameExistCheck.EnableClientScript = false;
MemberLoginNameExistCheck.ValidateEmptyText = false;
- MemberLoginNameExistCheck.ControlToValidate = MemberEmail.ID;
+ MemberLoginNameExistCheck.ControlToValidate = MemberLoginNameTxt.ID;
MemberLoginNameExistCheck.ServerValidate += MemberLoginNameExistCheck_ServerValidate;
MemberEmailExistCheck.ErrorMessage = ui.Text("errorHandling", "errorExistsWithoutTab", "E-mail", BasePages.UmbracoEnsuredPage.CurrentUser);
From 0af73b0290432e63a461bf8555dc1c205cc37252 Mon Sep 17 00:00:00 2001
From: Mads Krohn
Date: Thu, 12 Sep 2013 00:14:44 +0200
Subject: [PATCH 0012/1046] Fixed U4-2842 Umb 6.1.5 - moving a media item from
recycle bin / trash
---
src/Umbraco.Core/Services/MediaService.cs | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs
index 68b4253f77..fbf6d0f67b 100644
--- a/src/Umbraco.Core/Services/MediaService.cs
+++ b/src/Umbraco.Core/Services/MediaService.cs
@@ -479,16 +479,22 @@ namespace Umbraco.Core.Services
if (Moving.IsRaisedEventCancelled(new MoveEventArgs(media, parentId), this))
return;
- media.ParentId = parentId;
+ //If we aren't moving to recycle bin, we must be moving from recycle bin -> #U4-2842
+ media.ChangeTrashedState(false, parentId);
Save(media, userId);
//Ensure that Path and Level is updated on children
- var children = GetChildren(media.Id);
+ var children = GetChildren(media.Id).ToList(); //No need to enumerate twice?
if (children.Any())
{
var parentPath = media.Path;
var parentLevel = media.Level;
- var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel);
+ var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel).ToList();
+ //Update trashed state for descendants -> #U4-2842
+ foreach (var descendant in updatedDescendents)
+ {
+ descendant.ChangeTrashedState(false, descendant.ParentId);
+ }
Save(updatedDescendents, userId);
}
@@ -910,7 +916,7 @@ namespace Umbraco.Core.Services
child.Level = parentLevel + 1;
list.Add(child);
- var grandkids = GetChildren(child.Id);
+ var grandkids = GetChildren(child.Id).ToList(); //No need to enumerate twice?
if (grandkids.Any())
{
list.AddRange(UpdatePathAndLevelOnChildren(grandkids, child.Path, child.Level));
From 31f146fc6f1f62916041f2a58ff6826280069182 Mon Sep 17 00:00:00 2001
From: Mads Krohn
Date: Fri, 13 Sep 2013 10:29:03 +0200
Subject: [PATCH 0013/1046] Updates to the media trashed state handling
Tweaked the logic for determining when a media item is trashed or not.
Added unit tests. Removed unnecessary comments.
---
src/Umbraco.Core/Services/MediaService.cs | 33 +++++----
src/Umbraco.Tests/Services/BaseServiceTest.cs | 24 +++++++
.../Services/MediaServiceTests.cs | 72 +++++++++++++++++++
src/Umbraco.Tests/Umbraco.Tests.csproj | 1 +
4 files changed, 116 insertions(+), 14 deletions(-)
create mode 100644 src/Umbraco.Tests/Services/MediaServiceTests.cs
diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs
index fbf6d0f67b..c45bbb1353 100644
--- a/src/Umbraco.Core/Services/MediaService.cs
+++ b/src/Umbraco.Core/Services/MediaService.cs
@@ -479,23 +479,22 @@ namespace Umbraco.Core.Services
if (Moving.IsRaisedEventCancelled(new MoveEventArgs(media, parentId), this))
return;
- //If we aren't moving to recycle bin, we must be moving from recycle bin -> #U4-2842
- media.ChangeTrashedState(false, parentId);
+ media.ParentId = parentId;
+ if (media.Trashed)
+ {
+ media.ChangeTrashedState(false, parentId);
+ }
Save(media, userId);
- //Ensure that Path and Level is updated on children
- var children = GetChildren(media.Id).ToList(); //No need to enumerate twice?
+ //Ensure that relevant properties are updated on children
+ var children = GetChildren(media.Id);
if (children.Any())
{
var parentPath = media.Path;
var parentLevel = media.Level;
- var updatedDescendents = UpdatePathAndLevelOnChildren(children, parentPath, parentLevel).ToList();
- //Update trashed state for descendants -> #U4-2842
- foreach (var descendant in updatedDescendents)
- {
- descendant.ChangeTrashedState(false, descendant.ParentId);
- }
- Save(updatedDescendents, userId);
+ var parentTrashed = media.Trashed;
+ var updatedDescendants = UpdatePropertiesOnChildren(children, parentPath, parentLevel, parentTrashed);
+ Save(updatedDescendants, userId);
}
Moved.RaiseEvent(new MoveEventArgs(media, false, parentId), this);
@@ -901,25 +900,31 @@ namespace Umbraco.Core.Services
///
/// Updates the Path and Level on a collection of objects
- /// based on the Parent's Path and Level.
+ /// based on the Parent's Path and Level. Also change the trashed state if relevant.
///
/// Collection of objects to update
/// Path of the Parent media
/// Level of the Parent media
+ /// Indicates whether the Parent is trashed or not
/// Collection of updated objects
- private IEnumerable UpdatePathAndLevelOnChildren(IEnumerable children, string parentPath, int parentLevel)
+ private IEnumerable UpdatePropertiesOnChildren(IEnumerable children, string parentPath, int parentLevel, bool parentTrashed)
{
var list = new List();
foreach (var child in children)
{
child.Path = string.Concat(parentPath, ",", child.Id);
child.Level = parentLevel + 1;
+ if (parentTrashed != child.Trashed)
+ {
+ child.ChangeTrashedState(parentTrashed, child.ParentId);
+ }
+
list.Add(child);
var grandkids = GetChildren(child.Id).ToList(); //No need to enumerate twice?
if (grandkids.Any())
{
- list.AddRange(UpdatePathAndLevelOnChildren(grandkids, child.Path, child.Level));
+ list.AddRange(UpdatePropertiesOnChildren(grandkids, child.Path, child.Level, child.Trashed));
}
}
return list;
diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs
index cd4318b5a6..23487eb582 100644
--- a/src/Umbraco.Tests/Services/BaseServiceTest.cs
+++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs
@@ -51,6 +51,30 @@ namespace Umbraco.Tests.Services
Content trashed = MockedContent.CreateSimpleContent(contentType, "Text Page Deleted", -20);
trashed.Trashed = true;
ServiceContext.ContentService.Save(trashed, 0);
+
+ //Create and Save folder-Media -> 1050
+ var folderMediaType = ServiceContext.ContentTypeService.GetMediaType(1031);
+ var folder = MockedMedia.CreateMediaFolder(folderMediaType, -1);
+ ServiceContext.MediaService.Save(folder);
+
+ //Create and Save folder-Media -> 1051
+ var folder2 = MockedMedia.CreateMediaFolder(folderMediaType, -1);
+ ServiceContext.MediaService.Save(folder2);
+
+ //Create and Save image-Media -> 1052
+ var imageMediaType = ServiceContext.ContentTypeService.GetMediaType(1032);
+ var image = (Media)MockedMedia.CreateMediaImage(imageMediaType, 1050);
+ ServiceContext.MediaService.Save(image);
+
+ //Create and Save folder-Media that is trashed -> 1053
+ var folderTrashed = (Media)MockedMedia.CreateMediaFolder(folderMediaType, -21);
+ folderTrashed.Trashed = true;
+ ServiceContext.MediaService.Save(folderTrashed);
+
+ //Create and Save image-Media child of folderTrashed -> 1054
+ var imageTrashed = (Media)MockedMedia.CreateMediaImage(imageMediaType, folderTrashed.Id);
+ imageTrashed.Trashed = true;
+ ServiceContext.MediaService.Save(imageTrashed);
}
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Tests/Services/MediaServiceTests.cs b/src/Umbraco.Tests/Services/MediaServiceTests.cs
new file mode 100644
index 0000000000..658bff9de9
--- /dev/null
+++ b/src/Umbraco.Tests/Services/MediaServiceTests.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+
+namespace Umbraco.Tests.Services
+{
+ [TestFixture, RequiresSTA]
+ public class MediaServiceTests : BaseServiceTest
+ {
+ [SetUp]
+ public override void Initialize()
+ {
+ base.Initialize();
+ }
+
+ [TearDown]
+ public override void TearDown()
+ {
+ base.TearDown();
+ }
+
+ [Test]
+ public void Can_Move_Media()
+ {
+ // Arrange
+ var mediaService = ServiceContext.MediaService;
+ var media = mediaService.GetById(1052);
+
+ // Act
+ mediaService.Move(media, 1051);
+
+ // Assert
+ Assert.That(media.ParentId, Is.EqualTo(1051));
+ Assert.That(media.Trashed, Is.False);
+ }
+
+ [Test]
+ public void Can_Move_Media_To_RecycleBin()
+ {
+ // Arrange
+ var mediaService = ServiceContext.MediaService;
+ var media = mediaService.GetById(1050);
+
+ // Act
+ mediaService.MoveToRecycleBin(media);
+
+ // Assert
+ Assert.That(media.ParentId, Is.EqualTo(-21));
+ Assert.That(media.Trashed, Is.True);
+ }
+
+ [Test]
+ public void Can_Move_Media_From_RecycleBin()
+ {
+ // Arrange
+ var mediaService = ServiceContext.MediaService;
+ var media = mediaService.GetById(1053);
+
+ // Act - moving out of recycle bin
+ mediaService.Move(media, 1050);
+ var mediaChild = mediaService.GetById(1054);
+
+ // Assert
+ Assert.That(media.ParentId, Is.EqualTo(1050));
+ Assert.That(media.Trashed, Is.False);
+ Assert.That(mediaChild.ParentId, Is.EqualTo(1053));
+ Assert.That(mediaChild.Trashed, Is.False);
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 032fcb8bfb..186b0736f5 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -200,6 +200,7 @@
+
From 0fe33c120b73b13e47a9e6d9b4b24b66dda9529f Mon Sep 17 00:00:00 2001
From: Mads Krohn
Date: Fri, 13 Sep 2013 10:42:08 +0200
Subject: [PATCH 0014/1046] Removing unwanted ToList()
---
src/Umbraco.Core/Services/MediaService.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Core/Services/MediaService.cs b/src/Umbraco.Core/Services/MediaService.cs
index c45bbb1353..09df9f6297 100644
--- a/src/Umbraco.Core/Services/MediaService.cs
+++ b/src/Umbraco.Core/Services/MediaService.cs
@@ -921,7 +921,7 @@ namespace Umbraco.Core.Services
list.Add(child);
- var grandkids = GetChildren(child.Id).ToList(); //No need to enumerate twice?
+ var grandkids = GetChildren(child.Id);
if (grandkids.Any())
{
list.AddRange(UpdatePropertiesOnChildren(grandkids, child.Path, child.Level, child.Trashed));
From cdf5ddf539bd20633e30987da9b59917d45d28d1 Mon Sep 17 00:00:00 2001
From: Marc Brooks
Date: Mon, 30 Sep 2013 18:23:56 -0500
Subject: [PATCH 0015/1046] Added cacheKeyBuilder optional argument to allow
the key used for caching to be contextual.
when building cached partials that work with many different instances of the same partial view (e.g. using the same partial more than once on a page with different ViewDataDictionary or different model), it is necessary to either name each instance differently (ugh), or not cache.
By adding an optional argument to the CachedPartial Html helper method, we can vary the cache-key depending on the context of insertion. For maximum flexibility, pass the model and the viewData to the function so it can use that data to format a cacheKey suffix.
A typical use would be something like:
@Html.CachedPartial(
"EventListings"
, FeedRepository.getFeed(new CalendarEventsModel
{
StartingDate = DateTime.UtcNow.Date
, Count = 10
})
, 0
, contextualKeyBuilder: (model, viewData) =>
{
return (model as CalendarEventsModel).StartingDate.ToString();
}
)
---
src/Umbraco.Web/HtmlHelperRenderExtensions.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs
index 2a009dfaa2..d8af4eecf0 100644
--- a/src/Umbraco.Web/HtmlHelperRenderExtensions.cs
+++ b/src/Umbraco.Web/HtmlHelperRenderExtensions.cs
@@ -82,7 +82,8 @@ namespace Umbraco.Web
int cachedSeconds,
bool cacheByPage = false,
bool cacheByMember = false,
- ViewDataDictionary viewData = null)
+ ViewDataDictionary viewData = null,
+ Func
För att fortsätta måste du redigera filen "web.config" (du kan använda Visual Studio eller din favorit text-redigerare), bläddra till slutet, lägg till databasanslutnings-inställningarna för din databas i fältet som heter "umbracoDbDSN" och spara filen.
]]>
Eventuellt kan du behöva kontakta ditt webb-hotell. Om du installerar på en lokal maskin eller server kan du få informationen från din systemadministratör.]]>
- Tryck Uppgradera knappen för att uppgradera din databas till Umbraco %0%
Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!
]]>
- Tryck Nästa för att fortsätta.]]>
+ Tryck Uppgradera knappen för att uppgradera din databas till Umbraco {0}
Du behöver inte vara orolig. Inget innehåll kommer att raderas och efteråt kommer allt att fungera som vanligt!
]]>
+ Tryck Nästa för att fortsätta.]]>Nästa för att fortsätta med konfigurationsguiden]]>Lösenordet på standardanvändaren måste bytas!]]>Standardanvändaren har avaktiverats eller har inte åtkomst till umbraco!
Du behöver inte göra något ytterligare här. Klicka Next för att fortsätta.]]>
@@ -402,13 +449,13 @@
Tack för att du valde umbracoBesök din nya webbplats Du installerade Runway, så varför inte se hur din nya webbplats ser ut.]]>Ytterligare hjälp och information Få hjälp från våra prisbelönta community, bläddra i dokumentationen eller titta på några gratis videor om hur man bygger en enkel webbplats, hur du använder paket eller en snabbguide till umbracos terminologi]]>
- Umbraco %0% är installerat och klart för användning
- /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till '%0%']]>
+ Umbraco {0} är installerat och klart för användning
+ /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till '{0}']]>börja omedelbart genom att klicka på "Starta Umbraco"-knappen nedan. Om du är en ny umbraco användarekan du hitta massor av resurser på våra kom igång sidor.]]>Starta Umbraco För att administrera din webbplats öppnar du bara umbraco back office och börjar lägga till innehåll, uppdatera mallar och stilmallar eller lägga till nya funktioner.]]>Anslutningen till databasen misslyckades.Se
- umbraco %0% antingen för en ny installation eller en uppgradering från version 3.0.
Tryck på "next" för att börja.]]>
+ umbraco {0} antingen för en ny installation eller en uppgradering från version 3.0.
]]>
- [%0%] Meddelande för att informera om att %1% har utförts på {2}
+ Inställningar för notifieringar gällande {0}
+ Hej {0} Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '{2}' av användaren '{3}' Gå till http://{4}/actions/editContent.aspx?id={5} för att redigera.
+ Hej {0}
Detta mail skickas till dig automatiskt för att meddela att '{1}' har utförts på sidan '{2}' av användaren '{3}'
]]>
+ [{0}] Meddelande för att informera om att {1} har utförts på {2}Notifieringar
@@ -482,6 +536,14 @@
Klistra in texten helt utan formateringKlistra in texen och ta bort specialformatering (rekommenderas)
+
+ Fyll i ett namn...
+ Skriv för att filtrera...
+ Namnge {0}...
+ Fyll i ditt lösenord
+ Skriv för att söka...
+ Fyll i ditt lösenord
+
Rollbaserat lösenordsskydd Då används umbracos medlemsgrupper.]]>
@@ -489,8 +551,8 @@
Sida med felmeddelandeAnvänds när en användare är inloggad, men saknar rättigheter att se sidanVälj hur du vill lösenordsskydda sidan
- %0% är nu lösenordsskyddad
- Lösenordsskyddet är nu borttaget på %0%
+ {0} är nu lösenordsskyddad
+ Lösenordsskyddet är nu borttaget på {0}InloggningssidaVälj sidan med inloggningsformuläretTa bort lösenordsskydd
@@ -501,16 +563,17 @@
Välj detta alternativ om du vill skydda sidan med ett enkelt användarnamn och lösenord. Alla loggar då in med samma inloggningsuppgifter.
- %0% kunde inte publiceras på grund av att ett tredjepartstillägg avbröt publiceringen.
- %0% kan inte publiceras, på grund av att överordnad nod inte är publicerad.
-
+
+ {0} kunde inte publiceras på grund av att ett tredjepartstillägg avbröt publiceringen.
+ {0} kan inte publiceras, på grund av att överordnad nod inte är publicerad.
+ {0} kunde inte publiceras på grund av följande orsaker: {1} passerade inte valideringen.Inkludera opublicerade undersidorPublicering pågår - vänligen vänta...
- %0% av %1% sidor har publicerats...
- %0% har publicerats
- %0% och underliggande sidor har publicerats
- Publicera %0% och alla dess underordnade sidor
- ok för att publicera %0%. Därmed blir innehållet publikt.
Du kan publicera denna sida och alla dess undersidor genom att kryssa i publicera alla undersidor. ]]>
+ {0} av {1} sidor har publicerats...
+ {0} har publicerats
+ {0} och underliggande sidor har publicerats
+ Publicera {0} och alla dess underordnade sidor
+ ok för att publicera {0}. Därmed blir innehållet publikt.
Du kan publicera denna sida och alla dess undersidor genom att kryssa i publicera alla undersidor. ]]>Lägg till extern länk
@@ -539,8 +602,10 @@
ConciergeInnehåll
+ ContourCourierUtvecklare
+ HjälpUmbraco Configuration WizardMediaMedlemmar
@@ -559,6 +624,7 @@
För att importera en dokumenttyp, leta upp ".udt"-filen på din hårddisk genom att klicka på "Browse"-knappen och sedan på "Importera" (du får bekräfta ditt val i nästa steg).Namn på ny flikNodtyp
+ Inga egenskaper definierade i denna sektion. Klicka på "Lägg till ny egenskap" länken vid toppen för att skapa en ny egenskap.TypStilmallEgenskap för stilmall
@@ -575,12 +641,12 @@
Publiceringen avbröts av ett tredjepartstilläggEgenskapstyp finns redanEgenskapstyp skapad
- Datatyp: %1%]]>
+ Datatyp: {1}]]>Egenskapstypen har tagits bortInnehållstypen har sparatsNy flik skapadFliken har tagits bort
- Fliken med id: %0% har tagits bort
+ Fliken med id: {0} har tagits bortInnehållet är avpubliceratStilmallen kunde inte sparasStilmallen sparades
@@ -654,6 +720,7 @@
Byter radbrytningar mot html-taggen <br>Anpassade fältJa, endast datum
+ OmkodningFormatera som datumHTML-omkodningErsätter specialtecken med deras HTML-motsvarigheter.
@@ -684,13 +751,13 @@
Ladda hem DTD för XMLFältInkludera undersidor
- Hej %0%. Detta är ett automatisk mail skickat for att informera dig om att det finns en översättningsförfrågan på dokument '%1' till '{5}' skickad av {2}. För att redigere, besök http://{3}/translation/details.aspx?id={4}. För att få en översikt över dina översättningsuppgigter loggar du in i umbraco på: http://{3}
- [%0%] Översättningsuppgit för %1%
+ Hej {0}. Detta är ett automatisk mail skickat for att informera dig om att det finns en översättningsförfrågan på dokument '%1' till '{5}' skickad av {2}. För att redigere, besök http://{3}/translation/details.aspx?id={4}. För att få en översikt över dina översättningsuppgigter loggar du in i umbraco på: http://{3}
+ [{0}] Översättningsuppgit för {1}Hittade inga användare som är översättare. Vänligen skapa en användare som är översättare innan du börjar skicka innehåll för översättningArbetsuppgifter som du har skapatsom du har skapat. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML". För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
- Sidan '%0%' har skickats för översättning
- Skicka sidan '%0%' för översättning
+ Sidan '{0}' har skickats för översättning
+ Skicka sidan '{0}' för översättningTilldelat avArbetsuppgift öppnadTotalt antal ord
@@ -734,7 +801,7 @@
Ny uppdatering tillgänglig
- %0% är klart, klicka här för att ladda ner
+ {0} är klart, klicka här för att ladda nerIngen kontakt med serverFel vid kontroll av uppdatering. Se trace-stack för mer information.
@@ -768,12 +835,16 @@
Ersätt rättigheterna på underliggande noderDu redigerar nu rättigheterna för sidorna:Välj de sidor vars rättigheter du vill redigera
+ Återställ lösenordSök igenom alla undernoder
+ Sessionen går utStartnod i innehållAnvändarens namnAnvändarrättigheterAnvändartypAnvändartyperSkribent
+ Din nuvarande historik
+ Din profil
\ No newline at end of file
From 48dd6198994945b96e3fbe04d475b66856a70382 Mon Sep 17 00:00:00 2001
From: Kalle Ekstrand
Date: Thu, 28 Nov 2013 14:34:22 +0100
Subject: [PATCH 0057/1046] Minor changes
---
src/Umbraco.Web.UI/umbraco/config/lang/sv.xml | 22 +++++++++----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
index 06b1861743..91e08eb95c 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
@@ -44,11 +44,11 @@
Lägg till nytt domännamnDomännamn
- Har skapat domännamnet '{0}'
- Har tagit bort domännamnet '{0}'
+ Har skapat domännamnet {0}
+ Har tagit bort domännamnet {0}Domänen {0} är redan tillagdt.ex.: dittdomannamn.se, www.dittdomannamn.se
- Domännamnet '{0}' har uppdaterats
+ Domännamnet {0} har uppdateratsDomänen är redan tilldeladÄrvOgiltigt domännamn
@@ -92,7 +92,7 @@
Välj aktuell mappFörhandsgranskaFörhandsgranskning är avstängt på grund av att det inte finns någon mall tilldelad
- Gör någonting annat
+ ÅngraVälj stilVisa stilInfoga tabell
@@ -122,7 +122,7 @@
Om denna sida
- Alternativ länk
+ Alias(hur skulle du beskriva denna bild för någon över telefon)Alternativa länkarUnderliggande noder
@@ -147,7 +147,7 @@
SidnamnEj medlem av grupp(er)Egenskaper
- Detta dokument är publicerat men syns inte eftersom den överordnade sidan '{0}' inte är publicerad
+ Detta dokument är publicerat men syns inte eftersom den överordnade sidan {0} inte är publiceradOops: detta dokument är publicerat men finns inte i cacheminnet (internt fel)PubliceraPubliceringsstatus
@@ -168,7 +168,7 @@
Var vill du skapa den nya {0}
- Skapa här
+ Skapa innehåll under"dokumenttyper".]]>"mediatyper".]]>Välj typ och rubrik
@@ -229,7 +229,7 @@
Se cachat objekt
- Redigera de olika översättningarna för ordboksinlägget '{0}' nedan. Du kan lägga till ytterligare språk under 'språk' i menyn till vänster.
+ Redigera de olika översättningarna för ordboksinlägget {0} nedan. Du kan lägga till ytterligare språk under 'språk' i menyn till vänster.Språknamn
@@ -450,7 +450,7 @@
Besök din nya webbplats Du installerade Runway, så varför inte se hur din nya webbplats ser ut.]]>Ytterligare hjälp och information Få hjälp från våra prisbelönta community, bläddra i dokumentationen eller titta på några gratis videor om hur man bygger en enkel webbplats, hur du använder paket eller en snabbguide till umbracos terminologi]]>Umbraco {0} är installerat och klart för användning
- /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till '{0}']]>
+ /web.config filen och ändra AppSettingsnyckeln umbracoConfigurationStatus på slutet till {0}]]>börja omedelbart genom att klicka på "Starta Umbraco"-knappen nedan. Om du är en ny umbraco användarekan du hitta massor av resurser på våra kom igång sidor.]]>Starta Umbraco För att administrera din webbplats öppnar du bara umbraco back office och börjar lägga till innehåll, uppdatera mallar och stilmallar eller lägga till nya funktioner.]]>Anslutningen till databasen misslyckades.
@@ -756,8 +756,8 @@
Hittade inga användare som är översättare. Vänligen skapa en användare som är översättare innan du börjar skicka innehåll för översättningArbetsuppgifter som du har skapatsom du har skapat. För att se en detaljvy med kommentarer, klicka på "Detaljer" eller på sidans namn. Du kan också ladda ned sidan i XML-format genom att klicka på länken "Ladda ned XML". För att markera ett översättningsjobb som avslutat, gå till detaljvyn och klicka på knappen "Stäng".]]>
- Sidan '{0}' har skickats för översättning
- Skicka sidan '{0}' för översättning
+ Sidan {0} har skickats för översättning
+ Skicka sidan {0} för översättningTilldelat avArbetsuppgift öppnadTotalt antal ord
From 24fcfd9fcb39943118e6086c87f7ce45c45e91e1 Mon Sep 17 00:00:00 2001
From: Kalle Ekstrand
Date: Thu, 28 Nov 2013 15:07:33 +0100
Subject: [PATCH 0058/1046] Minor changes
---
src/Umbraco.Web.UI/umbraco/config/lang/sv.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
index 91e08eb95c..ff957c1b54 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/sv.xml
@@ -81,7 +81,7 @@
Infoga länkInfoga intern länk (ankare)Punktlista
- Numerad lista
+ Numrerad listaInfoga macroInfoga bildÄndra relation
From cacf87be2d2c5f128d1b3cd1dc1615879c4d8355 Mon Sep 17 00:00:00 2001
From: esunxray
Date: Fri, 29 Nov 2013 21:26:16 +0800
Subject: [PATCH 0059/1046] Update zh.xml
update Chinese file for 6.2, this can be merged into V7.
---
src/Umbraco.Web.UI/umbraco/config/lang/zh.xml | 110 ++++++++++++------
1 file changed, 77 insertions(+), 33 deletions(-)
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml
index a586389379..472ac1252c 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/zh.xml
@@ -1,4 +1,4 @@
-
+
孙柱梁
@@ -8,6 +8,7 @@
管理主机名跟踪审计浏览节点
+ 改变文档类型复制创建创建扩展包
@@ -36,19 +37,30 @@
更新
+ 禁止访问添加域名
+ 移除
+ 错误的节点
+ 域名重复域名
+ 语言新域名 '%0%' 已创建域名 '%0%' 已删除域名 '%0%' 已使用
https://www.example.com/、example.com/en、……使用 * 代表任意域名,
- 只需要设置语言部分即可。]]>
-
+ 只需要设置语言部分即可。]]>
+
域名 '%0%' 已更新域名错误编辑当前域名
+ 继承
+ 语言
+
+ 也可以从父节点继承。]]>
+
+ 域名查看
@@ -80,6 +92,26 @@
显示样式插入表格
+
+ 要更改所选节点的文档类型,先在列表中选择合适的文档类型。
+ 然后设置当前文档类型到新文档类型的各字段间的对应映射关系并保存。
+ 内容已被重新发布
+ 当前属性
+ 当前类型
+ 不能改变文档类型,因为没有可替代的类型。
+ 文档类型已更改
+ 要映射的字段
+ 映射字段
+ 新模板
+ 新类型
+ 无
+ 内容
+ 选择新的文档类型
+ 选中文档的类型已被成功更改为[new type],以下字段被映射:
+ 至
+ 不能完成字段映射,因为存在一个字段映射至多字段的问题。
+ 仅显示可作为替代的文档类型。
+
关于本页别名
@@ -103,6 +135,7 @@
页标题属性该文档不可见,因为其上级 '%0%' 未发布。
+ 该文档已发布,但是没有更新至缓存(内部错误)发布发布状态发布于
@@ -116,6 +149,8 @@
最近编辑移除文件链接到文档
+ 会员组成员
+ 非会员组成员您想在哪里创建 %0%
@@ -217,6 +252,7 @@
%0% 格式不正确
+ 该文件类型已被管理员禁用注意,尽管配置中允许CodeMirror,但是它在IE上不够稳定,所以无法在IE运行。请为新的属性类型填写名称和别名!权限有问题,访问指定文件或文件夹失败!
@@ -349,7 +385,7 @@
$1"],[/\n/g," "]])}}}h.execCommand("mceInsertContent",false,j)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/editor_plugin_src.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/editor_plugin_src.js
index 0154eceb58..6f1734299e 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/editor_plugin_src.js
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/paste/editor_plugin_src.js
@@ -291,7 +291,7 @@
}
}
- // Check if we should use the new auto process method
+ // Check if we should use the new auto process method
if (getParam(ed, "paste_auto_cleanup_on_paste")) {
// Is it's Opera or older FF use key handler
if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
@@ -354,7 +354,7 @@
h = h.replace(v[0], v[1]);
});
}
-
+
if (ed.settings.paste_enable_default_filters == false) {
return;
}
@@ -413,7 +413,9 @@
// If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot.
do {
len = h.length;
- h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");
+ // Don't remove the type attribute for lists so that non-default list types display correctly.
+ h = h.replace(/(!(ol|ul)[^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");
+ h = h.replace(/(<(ol|ul)[^>]*\s)(?:id|name|language|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");
} while (len != h.length);
// Remove all spans if no styles is to be retained
@@ -589,7 +591,7 @@
if (ed.settings.paste_enable_default_filters == false) {
return;
}
-
+
if (o.wordContent) {
// Remove named anchors or TOC links
each(dom.select('a', o.node), function(a) {
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/js/searchreplace.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/js/searchreplace.js
index 80284b9f3f..eb9b6eea84 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/js/searchreplace.js
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/searchreplace/js/searchreplace.js
@@ -14,6 +14,7 @@ var SearchReplaceDialog = {
mcTabs.onChange.add(function(tab_id, panel_id) {
t.switchMode(tab_id.substring(0, tab_id.indexOf('_')));
});
+
},
switchMode : function(m) {
@@ -39,6 +40,11 @@ var SearchReplaceDialog = {
searchNext : function(a) {
var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0;
+ if (tinymce.isIE11 && !window.find) {
+ ed.windowManager.alert("This feature is not available in IE 11+. Upgrade TinyMCE to 4.x to get this functionallity back.");
+ return;
+ }
+
// Get input
f = document.forms[0];
s = f[m + '_panel_searchstring'].value;
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin.js
index 48549c9239..6b57241a90 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin.js
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin.js
@@ -1 +1 @@
-(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(g.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(g.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(g.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(f,'$1$2')}g.replace(q,t)}});i.setRng(d)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();
\ No newline at end of file
+(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);f.menuItems={};c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}f._updateMenu(l);f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);f.menuItems[n]=l;if(n==f.selectedLang){f.selectedItem=l}})});return g}},setLanguage:function(e){var d=this;if(e==d.selectedLang){return}if(tinymce.grep(d.languages,function(f){return f===e}).length===0){throw"Unknown language: "+e}d.selectedLang=e;if(d.menuItems){d._updateMenu(d.menuItems[e])}if(d.active){d._done()}},_updateMenu:function(d){d.setSelected(1);this.selectedItem.setSelected(0);this.selectedItem=d},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(g.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(g.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(g.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(f,'$1$2')}g.replace(q,t)}});i.setRng(d)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin_src.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin_src.js
index 86fdfceb40..5751b0e52c 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin_src.js
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/spellchecker/editor_plugin_src.js
@@ -126,6 +126,7 @@
c.onRenderMenu.add(function(c, m) {
m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+ t.menuItems = {};
each(t.languages, function(v, k) {
var o = {icon : 1}, mi;
@@ -133,27 +134,60 @@
if (v == t.selectedLang) {
return;
}
- mi.setSelected(1);
- t.selectedItem.setSelected(0);
- t.selectedItem = mi;
+ t._updateMenu(mi);
t.selectedLang = v;
};
o.title = k;
mi = m.add(o);
mi.setSelected(v == t.selectedLang);
-
+ t.menuItems[v] = mi;
if (v == t.selectedLang)
t.selectedItem = mi;
- })
+ });
});
+
+
return c;
}
},
+ setLanguage: function(lang) {
+ var t = this;
+
+ if (lang == t.selectedLang) {
+ // allowed
+ return;
+ }
+
+ if (tinymce.grep(t.languages, function(v) { return v === lang; }).length === 0) {
+ throw "Unknown language: " + lang;
+ }
+
+ t.selectedLang = lang;
+
+ // if the menu has been shown, update it as well
+ if (t.menuItems) {
+ t._updateMenu(t.menuItems[lang]);
+ }
+
+ if (t.active) {
+ // clear error in the old language.
+ t._done();
+
+ // Don't immediately block the UI to check spelling in the new language, this is an API not a user action.
+ }
+ },
+
// Internal functions
+ _updateMenu: function(mi) {
+ mi.setSelected(1);
+ this.selectedItem.setSelected(0);
+ this.selectedItem = mi;
+ },
+
_walk : function(n, f) {
var d = this.editor.getDoc(), w;
@@ -235,6 +269,7 @@
each(nl, function(n) {
var node, elem, txt, pos, v = n.nodeValue;
+ rx.lastIndex = 0;
if (rx.test(v)) {
// Encode the content
v = dom.encode(v);
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/editor_plugin.js b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/editor_plugin.js
index c4c3264e08..4a92e1b364 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/editor_plugin.js
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/editor_plugin.js
@@ -1 +1 @@
-(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE){M.innerHTML=' '}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)
';
@@ -209,7 +209,7 @@ function insertTable() {
html += "
";
for (var x=0; x ';
else
html += '
';
@@ -242,16 +242,16 @@ function insertTable() {
} else
inst.execCommand('mceInsertContent', false, html);
- tinymce.each(dom.select('table[data-mce-new]'), function(node) {
+ tinymce.each(dom.select('table[data-mce-new]'), function(node) {
var tdorth = dom.select('td,th', node);
-
+
// Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document
- if (tinymce.isIE && node.nextSibling == null) {
+ if (tinymce.isIE && !tinymce.isIE11 && node.nextSibling == null) {
if (inst.settings.forced_root_block)
dom.insertAfter(dom.create(inst.settings.forced_root_block), node);
else
dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node);
- }
+ }
try {
// IE9 might fail to do this selection
diff --git a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/row.htm b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/row.htm
index 1885401f6b..6ebef28427 100644
--- a/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/row.htm
+++ b/src/Umbraco.Web.UI/umbraco_client/tinymce3/plugins/table/row.htm
@@ -28,7 +28,7 @@