diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js
index 298c90c822..76f4c0d204 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/mediapicker.controller.js
@@ -249,7 +249,8 @@ angular.module("umbraco")
// make sure that last opened node is on the same path as start node
var nodePath = node.path.split(",");
- if (nodePath.indexOf($scope.startNodeId.toString()) !== -1) {
+ // also make sure the node is not trashed
+ if (nodePath.indexOf($scope.startNodeId.toString()) !== -1 && node.trashed === false) {
$scope.gotoFolder({ id: $scope.lastOpenedNode, name: "Media", icon: "icon-folder" });
return true;
} else {
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/membergrouppicker/membergrouppicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/membergrouppicker/membergrouppicker.controller.js
index 4fab2a753a..0cd66a5608 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/membergrouppicker/membergrouppicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/membergrouppicker/membergrouppicker.controller.js
@@ -31,7 +31,16 @@ angular.module("umbraco").controller("Umbraco.Editors.MemberGroupPickerControlle
}
function selectMemberGroups(id) {
- $scope.model.selectedMemberGroups.push(id);
+ var index = $scope.model.selectedMemberGroups.indexOf(id);
+
+ if(index === -1){
+ // If the id does not exists in the array then add it
+ $scope.model.selectedMemberGroups.push(id);
+ }
+ else{
+ // Otherwise we will remove it from the array instead
+ $scope.model.selectedMemberGroups.splice(index, 1);
+ }
}
/** Method used for selecting a node */
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js
index 1f12536d1b..fa7a797125 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/treepicker/treepicker.controller.js
@@ -83,11 +83,11 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
//if a alternative startnode is used, we need to check if it is a container
if ($scope.enableSearh && dialogOptions.startNodeId && dialogOptions.startNodeId !== -1 && dialogOptions.startNodeId !== "-1") {
entityResource.getById(dialogOptions.startNodeId, $scope.entityType).then(function(node) {
- if (node.metaData.IsContainer) {
- openMiniListView(node);
- }
- initTree();
- });
+ if (node.metaData.IsContainer) {
+ openMiniListView(node);
+ }
+ initTree();
+ });
}
else {
initTree();
@@ -109,7 +109,10 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
else {
if (dialogOptions.filter.startsWith("!")) {
dialogOptions.filterExclude = true;
- dialogOptions.filter = dialogOptions.filter.substring(1);
+ dialogOptions.filterTypes = dialogOptions.filter.substring(1);
+ } else {
+ dialogOptions.filterExclude = false;
+ dialogOptions.filterTypes = dialogOptions.filter;
}
//used advanced filtering
@@ -119,6 +122,12 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
dialogOptions.filter = angular.fromJson(dialogOptions.filter);
}
}
+
+ $scope.filter = {
+ filterAdvanced: dialogOptions.filterAdvanced,
+ filterExclude: dialogOptions.filterExclude,
+ filter: dialogOptions.filterTypes
+ };
}
function initTree() {
@@ -162,7 +171,9 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
tree = args.tree;
- if (node && node.path) {
+ var nodeHasPath = typeof node !== "undefined" && typeof node.path !== "undefined";
+ var startNodeNotDefined = typeof dialogOptions.startNodeId === "undefined" || dialogOptions.startNodeId === "" || dialogOptions.startNodeId === "-1";
+ if (startNodeNotDefined && nodeHasPath) {
$scope.dialogTreeEventHandler.syncTree({ path: node.path, activate: false });
}
@@ -320,7 +331,7 @@ angular.module("umbraco").controller("Umbraco.Overlays.TreePickerController",
}
});
} else {
- var a = dialogOptions.filter.toLowerCase().replace(/\s/g, '').split(',');
+ var a = dialogOptions.filterTypes.toLowerCase().replace(/\s/g, '').split(',');
angular.forEach(nodes, function (value, key) {
var found = a.indexOf(value.metaData.contentType.toLowerCase()) >= 0;
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
index faa3be7c16..6373cc255f 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/content/umb-content-node-info.html
@@ -193,6 +193,7 @@
+
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-list-view.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-list-view.html
index 3122d01f12..aebc559a26 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-list-view.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-mini-list-view.html
@@ -1,4 +1,4 @@
-
+
+ ng-class="{'-selected':child.selected, 'not-allowed':!child.allowed}">
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/umb-node-preview.html b/src/Umbraco.Web.UI.Client/src/views/components/umb-node-preview.html
index eb94b349d2..32fc0a687a 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/umb-node-preview.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/umb-node-preview.html
@@ -13,7 +13,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-file-dropzone.html b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-file-dropzone.html
index 9d2997625e..68ef225d18 100644
--- a/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-file-dropzone.html
+++ b/src/Umbraco.Web.UI.Client/src/views/components/upload/umb-file-dropzone.html
@@ -37,6 +37,12 @@
+
+
+ You can drag files here to upload
+
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html
index 4875e4b1ea..b50e1bba98 100644
--- a/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html
+++ b/src/Umbraco.Web.UI.Client/src/views/datatypes/create.html
@@ -29,7 +29,7 @@
val-form-manager>
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js
index 80fb69aa47..9fae0a6304 100644
--- a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.controller.js
@@ -26,6 +26,8 @@ function DocumentTypesCreateController($scope, $location, navigationService, con
$scope.showCreateDocTypeCollection = function () {
$scope.model.creatingDoctypeCollection = true;
+ $scope.model.collectionCreateTemplate = true;
+ $scope.model.collectionItemCreateTemplate = true;
};
$scope.createContainer = function () {
@@ -74,7 +76,7 @@ function DocumentTypesCreateController($scope, $location, navigationService, con
}
}
- contentTypeResource.createCollection(node.id, $scope.model.collectionName, $scope.model.collectionItemName, collectionIcon, collectionItemIcon).then(function (collectionData) {
+ contentTypeResource.createCollection(node.id, $scope.model.collectionName, $scope.model.collectionCreateTemplate, $scope.model.collectionItemName, $scope.model.collectionItemCreateTemplate, collectionIcon, collectionItemIcon).then(function (collectionData) {
navigationService.hideMenu();
$location.search('create', null);
diff --git a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html
index 549ad0452b..98f9b23b64 100644
--- a/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html
+++ b/src/Umbraco.Web.UI.Client/src/views/documenttypes/create.html
@@ -80,10 +80,14 @@
+
+
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js
index 9f759d73a1..b5b9910465 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.controller.js
@@ -218,7 +218,7 @@ angular.module("umbraco")
// Fade in control when sorting stops
ui.item.context.style.opacity = "1";
- ui.item.parents(".umb-cell-content").find(".mceNoEditor").each(function () {
+ ui.item.offsetParent().find(".mceNoEditor").each(function () {
if ($.inArray($(this).attr("id"), notIncludedRte) < 0) {
// add all dragged's neighbouring RTEs in the new cell
notIncludedRte.splice(0, 0, $(this).attr("id"));
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index f5e9af6200..c1018e610b 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -604,4 +604,1091 @@
+
+
+
+
+ 9.0.30729
+ 2.0
+ {4C4C194C-B5E4-4991-8F87-4373E24CC19F}
+ {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Debug
+ AnyCPU
+
+
+
+
+ Umbraco.Web.UI
+
+
+ JScript
+ Grid
+ IE50
+ false
+ Library
+ Umbraco.Web.UI
+ OnBuildSuccess
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4.0
+ v4.5
+
+ true
+
+
+ enabled
+ disabled
+ false
+ ..\
+ true
+ true
+
+
+
+ bin\
+ false
+ 285212672
+ false
+
+
+ TRACE;DEBUG
+
+
+ true
+ 4096
+ false
+
+
+ false
+ false
+ false
+ false
+ 4
+ full
+ prompt
+ AllRules.ruleset
+ false
+ ..\bin\Debug\
+ true
+ ..\Package\Umbraco.Web.UI.zip
+
+
+ bin\
+ false
+ 285212672
+ false
+
+
+ TRACE
+ bin\Umbraco.Web.UI.XML
+ true
+ 4096
+ false
+
+
+ true
+ false
+ false
+ false
+ 4
+ pdbonly
+ prompt
+ AllRules.ruleset
+ false
+ ..\bin\Release\
+
+
+
+ {07fbc26b-2927-4a22-8d96-d644c667fecc}
+ UmbracoExamine
+
+
+ ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.dll
+ True
+
+
+ ..\packages\AutoMapper.3.3.1\lib\net40\AutoMapper.Net4.dll
+ True
+
+
+ ..\packages\ClientDependency.1.9.6\lib\net45\ClientDependency.Core.dll
+
+
+ ..\packages\ClientDependency-Mvc5.1.8.0.0\lib\net45\ClientDependency.Core.Mvc.dll
+ True
+
+
+ ..\packages\dotless.1.5.2\lib\dotless.Core.dll
+
+
+ ..\packages\Examine.0.1.89\lib\net45\Examine.dll
+
+
+ ..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll
+
+
+ ..\packages\ImageProcessor.2.5.6\lib\net45\ImageProcessor.dll
+
+
+ ..\packages\ImageProcessor.Web.4.8.7\lib\net45\ImageProcessor.Web.dll
+
+
+ ..\packages\log4net.2.0.8\lib\net45-full\log4net.dll
+
+
+ ..\packages\Lucene.Net.2.9.4.1\lib\net40\Lucene.Net.dll
+
+
+ ..\packages\Microsoft.AspNet.Identity.Core.2.2.1\lib\net45\Microsoft.AspNet.Identity.Core.dll
+ True
+
+
+ False
+ ..\packages\Microsoft.AspNet.Identity.Owin.2.2.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll
+
+
+ ..\packages\Microsoft.CodeAnalysis.Common.1.0.0\lib\net45\Microsoft.CodeAnalysis.dll
+
+
+ ..\packages\Microsoft.CodeAnalysis.CSharp.1.0.0\lib\net45\Microsoft.CodeAnalysis.CSharp.dll
+
+
+
+ ..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll
+
+
+ ..\packages\Microsoft.Owin.3.1.0\lib\net45\Microsoft.Owin.dll
+
+
+ ..\packages\Microsoft.Owin.Host.SystemWeb.3.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll
+
+
+ ..\packages\Microsoft.Owin.Security.3.1.0\lib\net45\Microsoft.Owin.Security.dll
+
+
+ ..\packages\Microsoft.Owin.Security.Cookies.3.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll
+
+
+ ..\packages\Microsoft.Owin.Security.OAuth.3.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll
+
+
+ True
+ ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll
+
+
+ False
+ ..\packages\MiniProfiler.2.1.0\lib\net40\MiniProfiler.dll
+
+
+ ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll
+
+
+ ..\packages\Newtonsoft.Json.10.0.2\lib\net45\Newtonsoft.Json.dll
+
+
+ ..\packages\Owin.1.0\lib\net40\Owin.dll
+ True
+
+
+ System
+
+
+ ..\packages\System.Collections.Immutable.1.1.36\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll
+
+
+
+
+ System.Data
+
+
+
+ ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.dll
+ True
+
+
+ ..\packages\SqlServerCE.4.0.0.1\lib\System.Data.SqlServerCe.Entity.dll
+ True
+
+
+
+
+
+
+ False
+ False
+
+
+ False
+ ..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
+
+
+ False
+ False
+
+
+ ..\packages\System.Reflection.Metadata.1.0.21\lib\portable-net45+win8\System.Reflection.Metadata.dll
+
+
+
+
+ System.Web
+
+
+ 3.5
+
+
+
+
+
+
+
+ ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll
+ True
+
+
+ False
+ ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll
+
+
+ False
+ ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll
+
+
+ ..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll
+ True
+
+
+ ..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll
+ True
+
+
+ System.Web.Services
+
+
+ ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll
+ True
+
+
+ ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll
+ True
+
+
+ ..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll
+ True
+
+
+ System.XML
+
+
+ {5BA5425F-27A7-4677-865E-82246498AA2E}
+ SqlCE4Umbraco
+
+
+ {31785bc3-256c-4613-b2f5-a1b0bdded8c1}
+ Umbraco.Core
+
+
+ {255F5DF1-4E43-4758-AC05-7A0B68EB021B}
+ umbraco.editorControls
+
+
+ {89C09045-1064-466B-B94A-DB3AFE2A5853}
+ umbraco.MacroEngines
+
+
+ {6EDD2061-82F2-461B-BB6E-879245A832DE}
+ umbraco.controls
+
+
+ umbraco.businesslogic
+ {E469A9CE-1BEC-423F-AC44-713CD72457EA}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+
+
+ {CCD75EC3-63DB-4184-B49D-51C1DD337230}
+ umbraco.cms
+
+
+ {C7CB79F0-1C97-4B33-BFA7-00731B579AE2}
+ umbraco.datalayer
+
+
+ umbraco.interfaces
+ {511F6D8D-7717-440A-9A57-A507E9A8B27F}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+
+
+ {651E1350-91B6-44B7-BD60-7207006D7003}
+ Umbraco.Web
+
+
+ {D7636876-0756-43CB-A192-138C6F0D5E42}
+ umbraco.providers
+
+
+
+ ..\packages\Umbraco.ModelsBuilder.3.0.10\lib\Umbraco.ModelsBuilder.dll
+
+
+
+
+ Properties\SolutionInfo.cs
+
+
+ noNodes.aspx
+ ASPXCodeBehind
+
+
+ noNodes.aspx
+ ASPXCodeBehind
+
+
+
+ True
+ True
+ Settings.settings
+
+
+ create.aspx
+ ASPXCodeBehind
+
+
+ create.aspx
+
+
+ xslt.ascx
+ ASPXCodeBehind
+
+
+ xslt.ascx
+
+
+ UserControlProxy.aspx
+ ASPXCodeBehind
+
+
+ UserControlProxy.aspx
+
+
+ editMacro.aspx
+ ASPXCodeBehind
+
+
+ editMacro.aspx
+
+
+ directoryBrowser.aspx
+ ASPXCodeBehind
+
+
+ directoryBrowser.aspx
+
+
+ ChangeDocType.aspx
+ ASPXCodeBehind
+
+
+ ChangeDocType.aspx
+
+
+ EditMacro.aspx
+ ASPXCodeBehind
+
+
+ sort.aspx
+ ASPXCodeBehind
+
+
+ sort.aspx
+ ASPXCodeBehind
+
+
+ EditMacro.aspx
+
+
+ publish.aspx
+ ASPXCodeBehind
+
+
+ publish.aspx
+
+
+ default.Master
+ ASPXCodeBehind
+
+
+ default.Master
+
+
+ ASPXCodeBehind
+
+
+ umbracoDialog.Master
+
+
+ ASPXCodeBehind
+
+
+ umbracoPage.Master
+
+
+ QuickSearch.ascx
+ ASPXCodeBehind
+
+
+ QuickSearch.ascx
+
+
+ editstylesheet.aspx
+ ASPXCodeBehind
+
+
+ editstylesheet.aspx
+
+
+ EditStyleSheetProperty.aspx
+ ASPXCodeBehind
+
+
+ EditStyleSheetProperty.aspx
+
+
+ treeInit.aspx
+ ASPXCodeBehind
+
+
+ treeInit.aspx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ umbraco.aspx
+ ASPXCodeBehind
+
+
+ umbraco.aspx
+
+
+
+
+
+
+
+
+
+
+
+ 404handlers.config
+
+
+
+ ClientDependency.config
+ Designer
+
+
+ Designer
+
+
+ BaseRestExtensions.config
+
+
+
+
+ Designer
+
+
+ log4net.config
+
+
+ FileSystemProviders.config
+
+
+ EmbeddedMedia.config
+
+
+ Designer
+
+
+ HealthChecks.config
+ Designer
+
+
+ umbracoSettings.config
+ Designer
+
+
+ trees.config
+
+
+ tinyMceConfig.config
+ Designer
+
+
+ scripting.config
+
+
+ ExamineSettings.config
+
+
+ feedProxy.config
+
+
+ ExamineIndex.config
+ Designer
+
+
+ Dashboard.config
+ Designer
+
+
+
+
+ Designer
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ UI.xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ASPXCodeBehind
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+
+
+
+
+ Designer
+
+
+
+ Designer
+
+
+
+
+
+ Designer
+
+
+ applications.config
+ Designer
+
+
+
+
+
+
+
+
+ Code
+
+
+
+
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Web.Template.config
+ Designer
+
+
+ Web.Template.config
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UserControl
+
+
+
+ UserControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+
+
+
+
+ Form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Designer
+
+
+
+ Designer
+
+
+ Designer
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v11.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0
+ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0
+
+
+
+ xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\amd64\*.* "$(TargetDir)amd64\" /Y /F /E /I /C /D
+xcopy "$(ProjectDir)"..\packages\SqlServerCE.4.0.0.1\x86\*.* "$(TargetDir)x86\" /Y /F /E /I /C /D
+
+
+
+
+
+
+
+
+
+ True
+ True
+ 7130
+ /
+ http://localhost:7130
+ False
+ False
+
+
+ False
+
+
+
+
+
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+ $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
index dce1986868..85c5a16b06 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml
@@ -261,6 +261,7 @@
Slip filerne her...
Link til medie
eller klik her for at vælge filer
+ Du kan trække filer herind for at uploade
Tilladte filtyper er kun
Kan ikke uploade denne fil, den har ikke en godkendt filtype
Maks filstørrelse er
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
index cf810fbd24..cc2d0343a2 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml
@@ -272,6 +272,7 @@
Drop your files here...
Link to media
or click here to choose files
+ You can drag files here to upload
Only allowed file types are
Cannot upload this file, it does not have an approved file type
Max file size is
@@ -485,6 +486,7 @@
The active list view data type
Create custom list view
Remove custom list view
+ A content type, media type or member type with this alias already exists
Renamed
diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
index 5ab335429d..64f87e8360 100644
--- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
+++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml
@@ -284,6 +284,7 @@
Drop your files here...
Link to media
or click here to choose files
+ You can drag files here to upload
Only allowed file types are
Cannot upload this file, it does not have an approved file type
Max file size is
@@ -496,6 +497,7 @@
The active list view data type
Create custom list view
Remove custom list view
+ A content type, media type or member type with this alias already exists
Renamed
diff --git a/src/Umbraco.Web.UI/config/BackOfficeTours/getting-started.json b/src/Umbraco.Web.UI/config/BackOfficeTours/getting-started.json
index 094cf19a3e..a926a7c1d3 100644
--- a/src/Umbraco.Web.UI/config/BackOfficeTours/getting-started.json
+++ b/src/Umbraco.Web.UI/config/BackOfficeTours/getting-started.json
@@ -140,7 +140,7 @@
{
"element": "[data-element='editor-description']",
"title": "Enter a description",
- "content": "A description helps to pick the right document type when creating content.
Write a description to our Home page. It could be:
The home page of the website
"
+ "content": "
A description helps to pick the right document type when creating content.
Write a description for our Home page. It could be:
The home page of the website
"
},
{
"element": "[data-element='group-add']",
@@ -169,7 +169,7 @@
{
"element": "[data-element~='editor-property-settings'] [data-element='property-description']",
"title": "Enter a description",
- "content": "
A description will help to fill in the right content.
Enter a description for the property editor. It could be:
Write a nice introduction text so the visitors feel welcome
"
+ "content": "
A description will help your editor fill in the right content.
Enter a description for the property editor. It could be:
Write a nice introduction text so the visitors feel welcome
"
},
{
"element": "[data-element~='editor-property-settings'] [data-element='editor-add']",
@@ -259,7 +259,7 @@
"title": "Open context menu",
"content": "
Open the context menu by hovering over the root of the content section.
Now click the three small dots to the right.
",
"event": "click",
- "eventElement": "[data-element='tree-root'] [data-element='tree-item-options']"
+ "eventElement": "#tree [data-element='tree-root'] [data-element='tree-item-options']"
},
{
"element": "[data-element='action-create-homePage']",
@@ -358,7 +358,7 @@
"steps": [
{
"title": "View your Umbraco site",
- "content": "
Our three main components to a page are done: Document type, Template, and Content. It is now time to see the result.
In this tour you will learn how to see your published website.
",
+ "content": "
Our three main components for a page are done: Document type, Template, and Content. It is now time to see the result.
In this tour you will learn how to see your published website.
",
"type": "intro"
},
{
diff --git a/src/Umbraco.Web.UI/config/metablogConfig.Release.config b/src/Umbraco.Web.UI/config/metablogConfig.Release.config
deleted file mode 100644
index a2c80c9257..0000000000
--- a/src/Umbraco.Web.UI/config/metablogConfig.Release.config
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/config/metablogConfig.config b/src/Umbraco.Web.UI/config/metablogConfig.config
deleted file mode 100644
index ae9071dd71..0000000000
--- a/src/Umbraco.Web.UI/config/metablogConfig.config
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- My FAQs
- 0
- 1080
- False
- Articulate
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config
index 85b7895254..d1630186ad 100644
--- a/src/Umbraco.Web.UI/config/umbracoSettings.Release.config
+++ b/src/Umbraco.Web.UI/config/umbracoSettings.Release.config
@@ -112,6 +112,12 @@
will make Umbraco render the content on the current page with the template you requested, for example:
http://mysite.com/about-us/?altTemplate=Home and http://mysite.com/about-us/Home would render the
"About Us" page with a template with the alias Home. Setting this setting to true stops that behavior
+ @validateAlternativeTemplates
+ By default you can add a altTemplate querystring or append a template name to the current URL which
+ will make Umbraco render the content on the current page with the template you requested, for example:
+ http://mysite.com/about-us/?altTemplate=Home and http://mysite.com/about-us/Home would render the
+ "About Us" page with a template with the alias Home. Setting this setting to true will ensure that
+ only templates that have been permitted on the document type will be allowed
@disableFindContentByIdPath
By default you can call any content Id in the url and show the content with that id, for example:
http://mysite.com/1092 or http://mysite.com/1092.aspx would render the content with id 1092. Setting
@@ -123,7 +129,7 @@
-->
diff --git a/src/Umbraco.Web.UI/config/umbracoSettings.config b/src/Umbraco.Web.UI/config/umbracoSettings.config
index fb400faf85..4a51c2a7e9 100644
--- a/src/Umbraco.Web.UI/config/umbracoSettings.config
+++ b/src/Umbraco.Web.UI/config/umbracoSettings.config
@@ -212,6 +212,12 @@
will make Umbraco render the content on the current page with the template you requested, for example:
http://mysite.com/about-us/?altTemplate=Home and http://mysite.com/about-us/Home would render the
"About Us" page with a template with the alias Home. Setting this setting to true stops that behavior
+ @validateAlternativeTemplates
+ By default you can add a altTemplate querystring or append a template name to the current URL which
+ will make Umbraco render the content on the current page with the template you requested, for example:
+ http://mysite.com/about-us/?altTemplate=Home and http://mysite.com/about-us/Home would render the
+ "About Us" page with a template with the alias Home. Setting this setting to true will ensure that
+ only templates that have been permitted on the document type will be allowed
@disableFindContentByIdPath
By default you can call any content Id in the url and show the content with that id, for example:
http://mysite.com/1092 or http://mysite.com/1092.aspx would render the content with id 1092. Setting
@@ -223,7 +229,7 @@
-->
diff --git a/src/Umbraco.Web/Editors/ContentTypeController.cs b/src/Umbraco.Web/Editors/ContentTypeController.cs
index ea385ceba6..835920f0f1 100644
--- a/src/Umbraco.Web/Editors/ContentTypeController.cs
+++ b/src/Umbraco.Web/Editors/ContentTypeController.cs
@@ -194,7 +194,7 @@ namespace Umbraco.Web.Editors
: Request.CreateNotificationValidationErrorResponse(result.Exception.Message);
}
- public CreatedContentTypeCollectionResult PostCreateCollection(int parentId, string collectionName, string collectionItemName, string collectionIcon, string collectionItemIcon)
+ public CreatedContentTypeCollectionResult PostCreateCollection(int parentId, string collectionName, bool collectionCreateTemplate, string collectionItemName, bool collectionItemCreateTemplate, string collectionIcon, string collectionItemIcon)
{
var storeInContainer = false;
var allowUnderDocType = -1;
@@ -213,20 +213,38 @@ namespace Umbraco.Web.Editors
// create item doctype
var itemDocType = new ContentType(parentId);
itemDocType.Name = collectionItemName;
- itemDocType.Alias = collectionItemName.ToSafeAlias();
+ itemDocType.Alias = collectionItemName.ToSafeAlias(true);
itemDocType.Icon = collectionItemIcon;
+
+ // create item doctype template
+ if (collectionItemCreateTemplate)
+ {
+ var template = CreateTemplateForContentType(itemDocType.Alias, itemDocType.Name);
+ itemDocType.SetDefaultTemplate(template);
+ }
+
+ // save item doctype
Services.ContentTypeService.Save(itemDocType);
// create collection doctype
var collectionDocType = new ContentType(parentId);
collectionDocType.Name = collectionName;
- collectionDocType.Alias = collectionName.ToSafeAlias();
+ collectionDocType.Alias = collectionName.ToSafeAlias(true);
collectionDocType.Icon = collectionIcon;
collectionDocType.IsContainer = true;
collectionDocType.AllowedContentTypes = new List
()
{
new ContentTypeSort(itemDocType.Id, 0)
};
+
+ // create collection doctype template
+ if (collectionCreateTemplate)
+ {
+ var template = CreateTemplateForContentType(collectionDocType.Alias, collectionDocType.Name);
+ collectionDocType.SetDefaultTemplate(template);
+ }
+
+ // save collection doctype
Services.ContentTypeService.Save(collectionDocType);
// test if the parent id exist and then allow the collection underneath
@@ -272,16 +290,7 @@ namespace Umbraco.Web.Editors
//create a default template if it doesnt exist -but only if default template is == to the content type
if (ctSave.DefaultTemplate.IsNullOrWhiteSpace() == false && ctSave.DefaultTemplate == ctSave.Alias)
{
- var template = Services.FileService.GetTemplate(ctSave.Alias);
- if (template == null)
- {
- var tryCreateTemplate = Services.FileService.CreateTemplateForContentType(ctSave.Alias, ctSave.Name);
- if (tryCreateTemplate == false)
- {
- Logger.Warn("Could not create a template for the Content Type: {ContentTypeAlias}, status: {CreateTemplateResult}", ctSave.Alias, tryCreateTemplate.Result.Result);
- }
- template = tryCreateTemplate.Result.Entity;
- }
+ var template = CreateTemplateForContentType(ctSave.Alias, ctSave.Name);
// If the alias has been manually updated before the first save,
// make sure to also update the first allowed template, as the
@@ -311,6 +320,26 @@ namespace Umbraco.Web.Editors
return display;
}
+ private ITemplate CreateTemplateForContentType(string contentTypeAlias, string contentTypeName)
+ {
+ var template = Services.FileService.GetTemplate(contentTypeAlias);
+ if (template == null)
+ {
+ var tryCreateTemplate = Services.FileService.CreateTemplateForContentType(contentTypeAlias, contentTypeName);
+ if (tryCreateTemplate == false)
+ {
+ Logger.Warn(
+ "Could not create a template for the Content Type: {0}, status: {1}",
+ () => contentTypeAlias,
+ () => tryCreateTemplate.Result.StatusType);
+ }
+
+ template = tryCreateTemplate.Result.Entity;
+ }
+
+ return template;
+ }
+
///
/// Returns an empty content type for use as a scaffold when creating a new type
///
diff --git a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs
index 0764e18eeb..fa1aaf7345 100644
--- a/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs
+++ b/src/Umbraco.Web/Editors/ContentTypeControllerBase.cs
@@ -206,9 +206,9 @@ namespace Umbraco.Web.Editors
// works since that is based on aliases.
var allAliases = Services.ContentTypeService.GetAllContentTypeAliases();
var exists = allAliases.InvariantContains(contentTypeSave.Alias);
- if ((exists) && (ctId == 0 || ct.Alias != contentTypeSave.Alias))
+ if (exists && (ctId == 0 || !ct.Alias.InvariantEquals(contentTypeSave.Alias)))
{
- ModelState.AddModelError("Alias", "A content type, media type or member type with this alias already exists");
+ ModelState.AddModelError("Alias", Services.TextService.Localize("editcontenttype/aliasAlreadyExists"));
}
// execute the externam validators
diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs
index 28972ba7f6..f7edd3de8f 100644
--- a/src/Umbraco.Web/Editors/UsersController.cs
+++ b/src/Umbraco.Web/Editors/UsersController.cs
@@ -195,6 +195,7 @@ namespace Umbraco.Web.Editors
// so to do that here, we'll need to check if this current user is an admin and if not we should exclude all user who are
// also admins
+ var hideDisabledUsers = UmbracoConfig.For.UmbracoSettings().Security.HideDisabledUsersInBackoffice;
var excludeUserGroups = new string[0];
var isAdmin = Security.CurrentUser.IsAdmin();
if (isAdmin == false)
@@ -217,6 +218,14 @@ namespace Umbraco.Web.Editors
filterQuery.Where(x => x.Name.Contains(filter) || x.Username.Contains(filter));
}
+ if (hideDisabledUsers)
+ {
+ if (userStates == null || userStates.Any() == false)
+ {
+ userStates = new[] { UserState.Active, UserState.Invited, UserState.LockedOut, UserState.Inactive };
+ }
+ }
+
long pageIndex = pageNumber - 1;
long total;
var result = Services.UserService.GetAll(pageIndex, pageSize, out total, orderBy, orderDirection, userStates, userGroups, excludeUserGroups, filterQuery);
diff --git a/src/Umbraco.Web/PublishedContentExtensions.cs b/src/Umbraco.Web/PublishedContentExtensions.cs
index 5350e05ef9..45782f872d 100644
--- a/src/Umbraco.Web/PublishedContentExtensions.cs
+++ b/src/Umbraco.Web/PublishedContentExtensions.cs
@@ -5,8 +5,9 @@ using System.Linq;
using System.Web;
using Examine;
using Examine.LuceneEngine.SearchCriteria;
-using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core;
+using Umbraco.Core.Configuration;
+using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
using Umbraco.Web.Composing;
@@ -82,6 +83,45 @@ namespace Umbraco.Web
// return the corresponding url segment, or null if none
var cultureInfo = content.GetCulture(culture);
return cultureInfo?.UrlSegment;
+ }
+
+ public static bool IsAllowedTemplate(this IPublishedContent content, int templateId)
+ {
+ if (UmbracoConfig.For.UmbracoSettings().WebRouting.DisableAlternativeTemplates == true)
+ return content.TemplateId == templateId;
+
+ if (content.TemplateId != templateId && UmbracoConfig.For.UmbracoSettings().WebRouting.ValidateAlternativeTemplates == true)
+ {
+ // fixme - perfs? nothing cached here
+ var publishedContentContentType = ApplicationContext.Current.Services.ContentTypeService.GetContentType(content.ContentType.Id);
+ if (publishedContentContentType == null)
+ throw new NullReferenceException("No content type returned for published content (contentType='" + content.ContentType.Id + "')");
+
+ return publishedContentContentType.IsAllowedTemplate(templateId);
+ }
+
+ return true;
+ }
+ public static bool IsAllowedTemplate(this IPublishedContent content, string templateAlias)
+ {
+ // fixme - perfs? nothing cached here
+ var template = ApplicationContext.Current.Services.FileService.GetTemplate(templateAlias);
+ return = template == null ? false : content.IsAllowedTemplate(template.Id);
+ }
+
+ #endregion
+
+ #region IsComposedOf
+
+ ///
+ /// Gets a value indicating whether the content is of a content type composed of the given alias
+ ///
+ /// The content.
+ /// The content type alias.
+ /// A value indicating whether the content is of a content type composed of a content type identified by the alias.
+ public static bool IsComposedOf(this IPublishedContent content, string alias)
+ {
+ return content.ContentType.CompositionAliases.Contains(alias);
}
#endregion
diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs
index 309190b241..0a80058d2f 100644
--- a/src/Umbraco.Web/Security/MembershipHelper.cs
+++ b/src/Umbraco.Web/Security/MembershipHelper.cs
@@ -642,10 +642,15 @@ namespace Umbraco.Web.Security
var provider = _membershipProvider;
string username;
+
if (provider.IsUmbracoMembershipProvider())
{
var member = GetCurrentPersistedMember();
+ // If a member could not be resolved from the provider, we are clearly not authorized and can break right here
+ if (member == null)
+ return false;
username = member.Username;
+
// If types defined, check member is of one of those types
var allowTypesList = allowTypes as IList ?? allowTypes.ToList();
if (allowTypesList.Any(allowType => allowType != string.Empty))
@@ -664,6 +669,9 @@ namespace Umbraco.Web.Security
else
{
var member = provider.GetCurrentUser();
+ // If a member could not be resolved from the provider, we are clearly not authorized and can break right here
+ if (member == null)
+ return false;
username = member.UserName;
}
diff --git a/src/Umbraco.Web/Trees/ApplicationTreeController.cs b/src/Umbraco.Web/Trees/ApplicationTreeController.cs
index 9403847df9..5f1480a192 100644
--- a/src/Umbraco.Web/Trees/ApplicationTreeController.cs
+++ b/src/Umbraco.Web/Trees/ApplicationTreeController.cs
@@ -30,6 +30,8 @@ namespace Umbraco.Web.Trees
[HttpQueryStringFilter("queryStrings")]
public async Task GetApplicationTrees(string application, string tree, FormDataCollection queryStrings, bool onlyInitialized = true)
{
+ application = application.CleanForXss();
+
if (string.IsNullOrEmpty(application)) throw new HttpResponseException(HttpStatusCode.NotFound);
var rootId = Constants.System.Root.ToString(CultureInfo.InvariantCulture);
@@ -37,7 +39,7 @@ namespace Umbraco.Web.Trees
//find all tree definitions that have the current application alias
var appTrees = Services.ApplicationTreeService.GetApplicationTrees(application, onlyInitialized).ToArray();
- if (appTrees.Length == 1 || string.IsNullOrEmpty(tree) == false )
+ if (string.IsNullOrEmpty(tree) == false || appTrees.Length <= 1)
{
var apptree = string.IsNullOrEmpty(tree) == false
? appTrees.SingleOrDefault(x => x.Alias == tree)
diff --git a/src/Umbraco.Web/WebApi/CustomDateTimeConvertor.cs b/src/Umbraco.Web/WebApi/CustomDateTimeConvertor.cs
index 9b295f46de..ff758b2ee0 100644
--- a/src/Umbraco.Web/WebApi/CustomDateTimeConvertor.cs
+++ b/src/Umbraco.Web/WebApi/CustomDateTimeConvertor.cs
@@ -1,4 +1,5 @@
using System;
+using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Umbraco.Core;
@@ -21,7 +22,7 @@ namespace Umbraco.Web.WebApi
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
- writer.WriteValue(((DateTime)value).ToString(_dateTimeFormat));
+ writer.WriteValue(((DateTime)value).ToString(_dateTimeFormat, CultureInfo.InvariantCulture));
}
}
}