true to hide icon.
@param {string=} alias show and edit the content alias.
+@param {boolean=} aliasLocked Set to true to lock the alias.
@param {boolean=} hideAlias Set to true to hide alias.
@param {string=} description Add a description to the content.
@param {boolean=} hideDescription Set to true to hide description.
@@ -347,6 +348,7 @@ Use this directive to construct a header inside the main editor window.
icon: "=",
hideIcon: "@",
alias: "=",
+ aliasLocked: "<",
hideAlias: "=",
description: "=",
hideDescription: "@",
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/property/umbproperty.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/property/umbproperty.directive.js
index 06b9e51fba..31e797c6b4 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/property/umbproperty.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/property/umbproperty.directive.js
@@ -4,7 +4,7 @@
* @restrict E
**/
angular.module("umbraco.directives")
- .directive('umbProperty', function (umbPropEditorHelper, userService) {
+ .directive('umbProperty', function (userService) {
return {
scope: {
property: "=",
@@ -17,7 +17,7 @@ angular.module("umbraco.directives")
templateUrl: 'views/components/property/umb-property.html',
link: function (scope) {
- scope.propertyEditorAPI = {};
+ scope.propertyActions = [];
userService.getCurrentUser().then(function (u) {
var isAdmin = u.userGroups.indexOf('admin') !== -1;
@@ -25,28 +25,20 @@ angular.module("umbraco.directives")
});
},
//Define a controller for this directive to expose APIs to other directives
- controller: function ($scope, $timeout) {
+ controller: function ($scope) {
var self = this;
-
+
//set the API properties/methods
self.property = $scope.property;
self.setPropertyError = function (errorMsg) {
$scope.property.propertyErrorMessage = errorMsg;
};
-
- var unsubscribe = $scope.$on("ExposePropertyEditorAPI", function(event, api) {
-
- //avoid eventual parent properties to capture this.
- event.stopPropagation();
-
- $scope.propertyEditorAPI = api;
- });
- $scope.$on("$destroy", function () {
- unsubscribe();
- });
+ self.setPropertyActions = function(actions) {
+ $scope.propertyActions = actions;
+ };
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
index 2bd93a4b27..3d743c7e9a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
@@ -65,6 +65,7 @@ function umbTreeDirective($q, $rootScope, treeService, notificationsService, use
vm.reloadNode = reloadNode;
vm.syncTree = syncTree;
vm.loadChildren = loadChildren;
+ vm.hasTree = hasTree;
//wire up the exposed api object for hosting controllers
if ($scope.api) {
@@ -72,6 +73,7 @@ function umbTreeDirective($q, $rootScope, treeService, notificationsService, use
$scope.api.load = vm.load;
$scope.api.reloadNode = vm.reloadNode;
$scope.api.syncTree = vm.syncTree;
+ $scope.api.hasTree = vm.hasTree;
}
//flag to track the last loaded section when the tree 'un-loads'. We use this to determine if we should
@@ -203,6 +205,25 @@ function umbTreeDirective($q, $rootScope, treeService, notificationsService, use
});
}
+ //given a tree alias, this will search the current section tree for the specified tree alias and set the current active tree to it's root node
+ function hasTree(treeAlias) {
+
+ if (!$scope.tree) {
+ throw "Err in umbtree.directive.loadActiveTree, $scope.tree is null";
+ }
+
+ if (!treeAlias) {
+ return false;
+ }
+
+ var treeRoots = getTreeRootNodes();
+ var foundTree = _.find(treeRoots, function (node) {
+ return node.metaData.treeAlias.toUpperCase() === treeAlias.toUpperCase();
+ });
+
+ return foundTree !== undefined;
+ }
+
//given a tree alias, this will search the current section tree for the specified tree alias and set the current active tree to it's root node
function loadActiveTree(treeAlias) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirm.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirm.directive.js
index 1ddd09357a..9114cfb1c1 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirm.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirm.directive.js
@@ -56,6 +56,7 @@ function confirmDirective() {
onCancel: '=',
caption: '@',
confirmButtonStyle: '@',
+ confirmDisabled: '',
confirmLabelKey: '@'
},
link: function (scope, element, attr, ctrl) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
index 07b690ad2b..3c9e300f92 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
@@ -549,7 +549,9 @@
property.dataTypeIcon = propertyModel.dataTypeIcon;
property.dataTypeName = propertyModel.dataTypeName;
property.validation.mandatory = propertyModel.validation.mandatory;
+ property.validation.mandatoryMessage = propertyModel.validation.mandatoryMessage;
property.validation.pattern = propertyModel.validation.pattern;
+ property.validation.patternMessage = propertyModel.validation.patternMessage;
property.showOnMemberProfile = propertyModel.showOnMemberProfile;
property.memberCanEdit = propertyModel.memberCanEdit;
property.isSensitiveValue = propertyModel.isSensitiveValue;
@@ -632,7 +634,9 @@
propertyState: "init",
validation: {
mandatory: false,
- pattern: null
+ mandatoryMessage: null,
+ pattern: null,
+ patternMessage: null
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js
index 7aedfccacf..60a5d235fe 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/datatype.resource.js
@@ -389,7 +389,7 @@ function dataTypeResource($q, $http, umbDataFormatter, umbRequestHelper) {
(umbRequestHelper.getApiUrl(
"dataTypeApiBaseUrl",
"PostRenameContainer",
- { id: id, name: name })),
+ { id: id, name: encodeURIComponent(name) })),
"Failed to rename the folder with id " + id);
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
index ce70e9f543..8d1caab850 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js
@@ -338,6 +338,22 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
});
},
+ /**
+ * @ngdoc method
+ * @name umbraco.services.navigationService#hasTree
+ * @methodOf umbraco.services.navigationService
+ *
+ * @description
+ * Checks if a tree with the given alias exists.
+ *
+ * @param {String} treeAlias the tree alias to check
+ */
+ hasTree: function (treeAlias) {
+ return navReadyPromise.promise.then(function () {
+ return mainTreeApi.hasTree(treeAlias);
+ });
+ },
+
/**
Internal method that should ONLY be used by the legacy API wrapper, the legacy API used to
have to set an active tree and then sync, the new API does this in one method by using syncTree
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js b/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
index 0b8965e4fe..119f40e114 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
@@ -89,6 +89,7 @@
}
function confirmDelete(overlay) {
+ overlay.confirmType = "delete";
confirm(overlay);
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/propertyeditor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/propertyeditor.service.js
deleted file mode 100644
index 0b24e78567..0000000000
--- a/src/Umbraco.Web.UI.Client/src/common/services/propertyeditor.service.js
+++ /dev/null
@@ -1,29 +0,0 @@
-(function() {
- 'use strict';
-
- function propertyEditorService() {
- /**
- * @ngdoc function
- * @name umbraco.services.propertyEditorService#expose
- * @methodOf umbraco.services.propertyEditorService
- * @function
- *
- * @param {object} scope An object containing API for the PropertyEditor
- */
- function exposeAPI(scope, api) {
- if (!scope) {
- throw "scope cannot be null";
- }
- if (!api) {
- throw "api cannot be null";
- }
- scope.$emit("ExposePropertyEditorAPI", api);
- }
-
- return {
- exposeAPI: exposeAPI
- };
- }
-
- angular.module('umbraco.services').factory('propertyEditorService', propertyEditorService);
-})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tabbable.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tabbable.service.js
index 3782128af6..35f0d8a34a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/tabbable.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/tabbable.service.js
@@ -184,7 +184,13 @@
});
if (cached) return cached[1];
- nodeComputedStyle = nodeComputedStyle || this.doc.defaultView.getComputedStyle(node);
+ if (!nodeComputedStyle) {
+ if (node instanceof DocumentFragment) {
+ return true;// though DocumentFragment doesn't directly have display 'none', we know that it will never be visible, and therefore we return true. (and do not cache this, cause it will change if appended to the DOM)
+ } else {
+ nodeComputedStyle = this.doc.defaultView.getComputedStyle(node);
+ }
+ }
var result = false;
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
index 4d4f8792cf..b0941bd5ad 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
@@ -543,11 +543,11 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
'contenteditable': false
},
embed.preview);
-
- if (activeElement) {
+
+ // Only replace if activeElement is an Embed element.
+ if (activeElement && activeElement.nodeName.toUpperCase() === "DIV" && activeElement.classList.contains("embeditem")){
activeElement.replaceWith(wrapper); // directly replaces the html node
- }
- else {
+ } else {
editor.selection.setNode(wrapper);
}
},
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/validationmessage.service.js b/src/Umbraco.Web.UI.Client/src/common/services/validationmessage.service.js
new file mode 100644
index 0000000000..5e0d8b876b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/services/validationmessage.service.js
@@ -0,0 +1,34 @@
+(function () {
+ 'use strict';
+
+ function validationMessageService($q, localizationService) {
+
+ // Gets the message to use for when a mandatory field isn't completed.
+ // Will either use the one provided on the property type's validation object
+ // or a localised default.
+ function getMandatoryMessage(validation) {
+ if (!validation) {
+ return $q.when("");
+ }
+
+ if (validation.mandatoryMessage) {
+ return $q.when(validation.mandatoryMessage);
+ } else {
+ return localizationService.localize("general_required").then(function (value) {
+ return $q.when(value);
+ });
+ }
+ }
+
+ var service = {
+ getMandatoryMessage: getMandatoryMessage
+ };
+
+ return service;
+
+ }
+
+ angular.module('umbraco.services').factory('validationMessageService', validationMessageService);
+
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-group-builder.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-group-builder.less
index c51fd37fe4..f9d8772d45 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-group-builder.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-group-builder.less
@@ -493,11 +493,11 @@ input.umb-group-builder__group-sort-value {
font-weight: bold;
font-size: 14px;
color: @ui-action-type;
-
- &:hover{
+
+ &:hover {
text-decoration: none;
- color:@ui-action-type-hover;
- border-color:@ui-action-border-hover;
+ color: @ui-action-type-hover;
+ border-color: @ui-action-border-hover;
}
}
@@ -554,7 +554,13 @@ input.umb-group-builder__group-sort-value {
overflow: hidden;
}
- .editor-validation-pattern{
+ .editor-validation-message {
+ min-width: 100%;
+ min-height: 25px;
+ margin-top: 4px;
+ }
+
+ .editor-validation-pattern {
border: 1px solid @gray-7;
margin: 10px 0 0;
padding: 6px;
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
index 5e766b7578..94c0318fca 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-table.less
@@ -161,6 +161,7 @@ input.umb-table__input {
line-height: 20px;
color: @ui-option-type;
vertical-align: bottom;
+ text-decoration: none;
}
.umb-table-body__checkicon,
diff --git a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-details.less b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-details.less
index 9ddad03b48..7caec3c78e 100644
--- a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-details.less
+++ b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-details.less
@@ -63,6 +63,10 @@ a.umb-user-details-details__back-link {
.umb-user-details-details__sidebar {
flex: 0 0 @sidebarwidth;
+
+ .umb-button{
+ margin-left:0px;
+ }
}
@media (max-width: 768px) {
@@ -101,6 +105,7 @@ a.umb-user-details-details__back-link {
.umb-user-details-details__information-item {
margin-bottom: 10px;
font-size: 13px;
+ margin-top:10px;
}
.umb-user-details-details__information-item-label {
diff --git a/src/Umbraco.Web.UI.Client/src/less/forms.less b/src/Umbraco.Web.UI.Client/src/less/forms.less
index cfbb8b78ab..72abb3ba00 100644
--- a/src/Umbraco.Web.UI.Client/src/less/forms.less
+++ b/src/Umbraco.Web.UI.Client/src/less/forms.less
@@ -528,7 +528,8 @@ input[type="checkbox"][readonly] {
.help-inline {
display: inline-block;
vertical-align: middle;
- padding-left: 5px;
+ padding-top: 4px;
+ padding-left: 2px;
}
div.help {
diff --git a/src/Umbraco.Web.UI.Client/src/less/properties.less b/src/Umbraco.Web.UI.Client/src/less/properties.less
index 152ea49bbd..8523fe9300 100644
--- a/src/Umbraco.Web.UI.Client/src/less/properties.less
+++ b/src/Umbraco.Web.UI.Client/src/less/properties.less
@@ -97,7 +97,8 @@
.history-line {
width: 2px;
- height: 100%;
+ top: 10px;
+ bottom: 10px;
margin: 0 0 0 14px;
background-color: @gray-8;
position: absolute;
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html
index fab6ba4069..4474390199 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html
@@ -81,39 +81,55 @@
This section contains the building blocks for your Umbraco site. Follow the below links to find out more about working with the items in the Settings section:
-This section contains the building blocks for your Umbraco site. Follow the below links to find out more about working with the items in the Settings section:
+{{::property.name}}
{{::property.name}}
{{::property.name}}
{{mandatoryMessage}}
+{{datePickerForm.datepicker.errorMsg}}
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js
index 3b341f7ac0..a6d615cdd1 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.controller.js
@@ -1,5 +1,5 @@
angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleController",
- function($scope) {
+ function ($scope, validationMessageService) {
//setup the default config
var config = {
@@ -89,4 +89,10 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo
$scope.model.value = null;
}
}
+
+ // Set the message to use for when a mandatory field isn't completed.
+ // Will either use the one provided on the property type or a localised default.
+ validationMessageService.getMandatoryMessage($scope.model.validation).then(function (value) {
+ $scope.mandatoryMessage = value;
+ });
});
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html
index 5f873e9e43..1059df2994 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/dropdownFlexible/dropdownFlexible.html
@@ -1,21 +1,29 @@
{{mandatoryMessage}}
+{{mandatoryMessage}}
+{{emailFieldForm.textbox.errorMsg}}
+{{model.label}} {{textboxFieldForm.textbox.errorMsg}}
-{{mandatoryMessage}}
To proceed, please edit the "web.config" file (using Visual Studio or your favourite text editor), scroll to the bottom, add the connection string for your database in the key named "UmbracoDbDSN" and save the file.
-
- Click the retry button when
- done.
- More information on editing web.config here.
- Don't worry - no content will be deleted and everything will continue working afterwards! -
- ]]>No further actions needs to be taken. Click Next to proceed.]]>
No further actions needs to be taken. Click Next to proceed.]]>
-
|
-
| - |
-
-
- -
- |
- - |