diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index c72e01baa3..477bb143f9 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -1,7 +1,7 @@ - UmbracoCms.Core + Umbraco.Cms.Core 9.0.0 Umbraco Cms Core Binaries Umbraco HQ @@ -41,7 +41,6 @@ - diff --git a/build/NuSpecs/UmbracoCms.SqlCe.nuspec b/build/NuSpecs/UmbracoCms.SqlCe.nuspec index d64b24cf88..7c7fa2d902 100644 --- a/build/NuSpecs/UmbracoCms.SqlCe.nuspec +++ b/build/NuSpecs/UmbracoCms.SqlCe.nuspec @@ -1,7 +1,7 @@ - UmbracoCms.SqlCe + Umbraco.Cms.SqlCe 9.0.0 Umbraco Cms Sql Ce Add-on Umbraco HQ @@ -23,7 +23,7 @@ the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do not want this to happen as the alpha of the next major is, really, the next major already. --> - + diff --git a/build/NuSpecs/UmbracoCms.Web.nuspec b/build/NuSpecs/UmbracoCms.Web.nuspec index b6a101515f..765c45e860 100644 --- a/build/NuSpecs/UmbracoCms.Web.nuspec +++ b/build/NuSpecs/UmbracoCms.Web.nuspec @@ -1,7 +1,7 @@ - UmbracoCms.Web + Umbraco.Cms.Web 9.0.0 Umbraco Cms Core Binaries Umbraco HQ @@ -23,7 +23,7 @@ the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do not want this to happen as the alpha of the next major is, really, the next major already. --> - + @@ -33,6 +33,7 @@ + diff --git a/build/NuSpecs/UmbracoCms.nuspec b/build/NuSpecs/UmbracoCms.nuspec index fbcff62bb6..a87d14ed64 100644 --- a/build/NuSpecs/UmbracoCms.nuspec +++ b/build/NuSpecs/UmbracoCms.nuspec @@ -1,7 +1,7 @@ - UmbracoCms + Umbraco.Cms 9.0.0 Umbraco Cms Umbraco HQ @@ -17,7 +17,7 @@ - + - - - @@ -37,7 +29,7 @@ Use this directive to render a ui component for selecting child items to a paren (function () { "use strict"; - function Controller() { + function Controller(overlayService) { var vm = this; @@ -64,23 +56,29 @@ Use this directive to render a ui component for selecting child items to a paren vm.removeChild = removeChild; function addChild($event) { - vm.overlay = { + + const dialog = { view: "itempicker", title: "Choose child", availableItems: vm.availableChildren, selectedItems: vm.selectedChildren, event: $event, - show: true, submit: function(model) { - - // add selected child - vm.selectedChildren.push(model.selectedItem); + + if (model.selectedItem) { + // add selected child + vm.selectedChildren.push(model.selectedItem); + } // close overlay - vm.overlay.show = false; - vm.overlay = null; + overlayService.close(); + }, + close: function() { + overlayService.close(); } }; + + overlayService.open(dialog); } function removeChild($index) { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js index 1dcccda481..2f682205ad 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js @@ -14,10 +14,10 @@ The prompt can be opened in four direction up, down, left or right.

- @@ -71,17 +71,23 @@ The prompt can be opened in four direction up, down, left or right.

function link(scope, el, attr, ctrl) { - scope.clickConfirm = function() { - if(scope.onConfirm) { - scope.onConfirm(); - } - }; + scope.clickButton = function (event) { + if(scope.onDelete) { + scope.onDelete({$event: event}); + } + } - scope.clickCancel = function() { - if(scope.onCancel) { - scope.onCancel(); - } - }; + scope.clickConfirm = function() { + if(scope.onConfirm) { + scope.onConfirm(); + } + }; + + scope.clickCancel = function() { + if(scope.onCancel) { + scope.onCancel(); + } + }; } @@ -91,6 +97,8 @@ The prompt can be opened in four direction up, down, left or right.

templateUrl: 'views/components/umb-confirm-action.html', scope: { direction: "@", + show: "<", + onDelete: "&?", onConfirm: "&", onCancel: "&" }, diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js index 0498b81963..ed9c011d72 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js @@ -189,7 +189,7 @@ Use this directive to render a date time picker }; } - // bind hook for onOpen + // bind hook for onOpen if (ctrl.options && ctrl.onClose) { ctrl.options.onClose = function (selectedDates, dateStr, instance) { $timeout(function () { 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 3f53a1e18c..92d2df43e5 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 @@ -161,19 +161,17 @@ var resourceLookup = scope.contentType === "documentType" ? contentTypeResource.getAvailableCompositeContentTypes : mediaTypeResource.getAvailableCompositeContentTypes; return resourceLookup(scope.model.id, selectedContentTypeAliases, propAliasesExisting).then(function (filteredAvailableCompositeTypes) { - _.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (current) { + scope.compositionsDialogModel.availableCompositeContentTypes.forEach(current => { //reset first current.allowed = true; //see if this list item is found in the response (allowed) list - var found = _.find(filteredAvailableCompositeTypes, function (f) { - return current.contentType.alias === f.contentType.alias; - }); + var found = filteredAvailableCompositeTypes.find(f => current.contentType.alias === f.contentType.alias); //allow if the item was found in the response (allowed) list - // and ensure its set to allowed if it is currently checked, // DO not allow if it's a locked content type. - current.allowed = scope.model.lockedCompositeContentTypes.indexOf(current.contentType.alias) === -1 && - (selectedContentTypeAliases.indexOf(current.contentType.alias) !== -1) || ((found !== null && found !== undefined) ? found.allowed : false); + current.allowed = scope.model.lockedCompositeContentTypes.includes(current.contentType.alias) && + (selectedContentTypeAliases.includes(current.contentType.alias)) || (found ? found.allowed : false); }); }); @@ -192,15 +190,15 @@ function setupAvailableContentTypesModel(result) { scope.compositionsDialogModel.availableCompositeContentTypes = result; //iterate each one and set it up - _.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (c) { + scope.compositionsDialogModel.availableCompositeContentTypes.forEach(c => { //enable it if it's part of the selected model - if (scope.compositionsDialogModel.compositeContentTypes.indexOf(c.contentType.alias) !== -1) { + if (scope.compositionsDialogModel.compositeContentTypes.includes(c.contentType.alias)) { c.allowed = true; } //set the inherited flags c.inherited = false; - if (scope.model.lockedCompositeContentTypes.indexOf(c.contentType.alias) > -1) { + if (scope.model.lockedCompositeContentTypes.includes(c.contentType.alias)) { c.inherited = true; } // convert icons for composite content types @@ -281,6 +279,8 @@ }, selectCompositeContentType: function (selectedContentType) { + var deferred = $q.defer(); + //first check if this is a new selection - we need to store this value here before any further digests/async // because after that the scope.model.compositeContentTypes will be populated with the selected value. var newSelection = scope.model.compositeContentTypes.indexOf(selectedContentType.alias) === -1; @@ -308,7 +308,10 @@ //based on the selection, we need to filter the available composite types list filterAvailableCompositions(selectedContentType, newSelection).then(function () { + deferred.resolve({ selectedContentType, newSelection }); // TODO: Here we could probably re-enable selection if we previously showed a throbber or something + }, function () { + deferred.reject(); }); }); } @@ -318,10 +321,14 @@ //based on the selection, we need to filter the available composite types list filterAvailableCompositions(selectedContentType, newSelection).then(function () { + deferred.resolve({ selectedContentType, newSelection }); // TODO: Here we could probably re-enable selection if we previously showed a throbber or something + }, function () { + deferred.reject(); }); } + return deferred.promise; } }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js new file mode 100644 index 0000000000..517776388b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js @@ -0,0 +1,86 @@ +/** +@ngdoc directive +@name umbraco.directives.directive:umbIcon +@restrict E +@scope +@description +Use this directive to show an render an umbraco backoffice svg icon. All svg icons used by this directive should use the following naming convention to keep things consistent: icon-[name of icon]. For example
icon-alert.svg
+ +

Markup example

+ +Simple icon +
+    
+
+ +Icon with additional attribute. It can be treated like any other dom element +
+    
+
+ +Manual svg string +This format is only used in the iconpicker.html +
+    
+    
+
+@example + **/ + +(function () { + "use strict"; + + function UmbIconDirective(iconHelper) { + + var directive = { + replace: true, + transclude: true, + templateUrl: "views/components/umb-icon.html", + scope: { + icon: "@", + svgString: "=?" + }, + + link: function (scope) { + + if (scope.svgString === undefined && scope.svgString !== null && scope.icon !== undefined && scope.icon !== null) { + var icon = scope.icon.split(" ")[0]; // Ensure that only the first part of the icon is used as sometimes the color is added too, e.g. see umbeditorheader.directive scope.openIconPicker + + _requestIcon(icon); + } + scope.$watch("icon", function (newValue, oldValue) { + if (newValue && oldValue) { + var newicon = newValue.split(" ")[0]; + var oldicon = oldValue.split(" ")[0]; + + if (newicon !== oldicon) { + _requestIcon(newicon); + } + } + }); + + function _requestIcon(icon) { + // Reset svg string before requesting new icon. + scope.svgString = null; + + iconHelper.getIcon(icon) + .then(data => { + if (data !== null && data.svgString !== undefined) { + // Watch source SVG string + //icon.svgString.$$unwrapTrustedValue(); + scope.svgString = data.svgString; + } + }); + } + } + + }; + + return directive; + } + + angular.module("umbraco.directives").directive("umbIcon", UmbIconDirective); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js index aa28d49c4a..241f1e80e8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js @@ -322,6 +322,41 @@ Use this directive to generate a thumbnail grid of media items. scope.$on('$destroy', function() { unbindItemsWatcher(); }); + //determine if sort is current + scope.sortColumn = "name"; + scope.sortReverse = false; + scope.sortDirection = "asc"; + //check sort status + scope.isSortDirection = function (col, direction) { + return col === scope.sortColumn && direction === scope.sortDirection; + }; + //change sort + scope.setSort = function (col) { + if (scope.sortColumn === col) { + scope.sortReverse = !scope.sortReverse; + } + else { + scope.sortColumn = col; + if (col === "updateDate") { + scope.sortReverse = true; + } + else { + scope.sortReverse = false; + } + } + scope.sortDirection = scope.sortReverse ? "desc" : "asc"; + + } + // sort function + scope.sortBy = function (item) { + if (scope.sortColumn === "updateDate") { + return [-item['isFolder'],item['updateDate']]; + } + else { + return [-item['isFolder'],item['name']]; + } + }; + } @@ -345,7 +380,8 @@ Use this directive to generate a thumbnail grid of media items. onlyImages: "@", onlyFolders: "@", includeSubFolders: "@", - currentFolderId: "@" + currentFolderId: "@", + showMediaList: "=" }, link: link }; diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js index 66e03a7302..3865ffcdae 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js @@ -63,7 +63,7 @@ } // update children miniListView.children = data.items; - _.each(miniListView.children, function(c) { + miniListView.children.forEach(c => { // child allowed by default c.allowed = true; @@ -95,7 +95,8 @@ var filtered = angular.isFunction(scope.entityTypeFilter.filter) ? _.filter(miniListView.children, scope.entityTypeFilter.filter) : _.where(miniListView.children, scope.entityTypeFilter.filter); - _.each(filtered, (node) => node.allowed = false); + + filtered.forEach(node => node.allowed = false); } // update pagination diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js index ef7006be2c..ce1885a7cf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js @@ -77,13 +77,17 @@ Use this directive to render a tooltip. scope.tooltipStyles.left = 0; scope.tooltipStyles.top = 0; - function setTooltipPosition(event) { + function setTooltipPosition(event) { - var container = $("#contentwrapper"); - var containerLeft = container[0].offsetLeft; - var containerRight = containerLeft + container[0].offsetWidth; - var containerTop = container[0].offsetTop; - var containerBottom = containerTop + container[0].offsetHeight; + var overlay = $(event.target).closest('.umb-overlay'); + var container = overlay.length > 0 ? overlay : $("#contentwrapper"); + + let rect = container[0].getBoundingClientRect(); + + var containerLeft = rect.left; + var containerRight = containerLeft + rect.width; + var containerTop = rect.top; + var containerBottom = containerTop + rect.height; var elementHeight = null; var elementWidth = null; @@ -102,39 +106,43 @@ Use this directive to render a tooltip. position.left = event.pageX - (elementWidth / 2); position.top = event.pageY; - // check to see if element is outside screen - // outside right - if (position.left + elementWidth > containerRight) { - position.right = 10; - position.left = "inherit"; + if (overlay.length > 0) { + position.left = event.pageX - rect.left - (elementWidth / 2); + position.top = event.pageY - rect.top; } + else { + // check to see if element is outside screen + // outside right + if (position.left + elementWidth > containerRight) { + position.right = 10; + position.left = "inherit"; + } - // outside bottom - if (position.top + elementHeight > containerBottom) { - position.bottom = 10; - position.top = "inherit"; - } + // outside bottom + if (position.top + elementHeight > containerBottom) { + position.bottom = 10; + position.top = "inherit"; + } - // outside left - if (position.left < containerLeft) { - position.left = containerLeft + 10; - position.right = "inherit"; - } + // outside left + if (position.left < containerLeft) { + position.left = containerLeft + 10; + position.right = "inherit"; + } - // outside top - if (position.top < containerTop) { - position.top = 10; - position.bottom = "inherit"; + // outside top + if (position.top < containerTop) { + position.top = 10; + position.bottom = "inherit"; + } } scope.tooltipStyles = position; el.css(position); - } setTooltipPosition(scope.event); - } var directive = { diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js index 6a8ffa7969..3581aed9e0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js @@ -19,6 +19,17 @@ function umbFileUpload() { //clear the element value - this allows us to pick the same file again and again el.val(''); }); + + el.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) { + e.preventDefault(); + e.stopPropagation(); + }) + .on('dragover dragenter', function () { + scope.$emit("isDragover", { value: true }); + }) + .on('dragleave dragend drop', function () { + scope.$emit("isDragover", { value: false }); + }); } }; } diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js index 653b4f427c..db1e38adc6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js @@ -78,6 +78,8 @@ /** Called when the component initializes */ function onInit() { $scope.$on("filesSelected", onFilesSelected); + $scope.$on("isDragover", isDragover); + initialize(); } @@ -118,7 +120,9 @@ isImage: mediaHelper.detectIfImageByExtension(file), extension: getExtension(file) }; + f.fileSrc = getThumbnail(f); + return f; }); @@ -228,19 +232,22 @@ var index = i; //capture var isImage = mediaHelper.detectIfImageByExtension(files[i].name); + var extension = getExtension(files[i].name); - //save the file object to the files collection - vm.files.push({ + var f = { isImage: isImage, - extension: getExtension(files[i].name), + extension: extension, fileName: files[i].name, isClientSide: true - }); + }; + + // Save the file object to the files collection + vm.files.push(f); //special check for a comma in the name newVal += files[i].name.split(',').join('-') + ","; - if (isImage) { + if (isImage || extension === "svg") { var deferred = $q.defer(); @@ -293,6 +300,11 @@ } } + function isDragover(e, args) { + vm.dragover = args.value; + angularHelper.safeApply($scope); + } + }; var umbPropertyFileUploadComponent = { @@ -303,6 +315,7 @@ propertyAlias: "@", value: "<", hideSelection: "<", + dragover: "<", /** * Called when a file is selected on this instance */ diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js index 77c26e066e..c7894da171 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js @@ -204,7 +204,7 @@ function valFormManager(serverValidationManager, $rootScope, $timeout, $location var parts = nextPath.split("?"); var query = {}; if (parts.length > 1) { - _.each(parts[1].split("&"), function (q) { + parts[1].split("&").forEach(q => { var keyVal = q.split("="); query[keyVal[0]] = keyVal[1]; }); diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js index 3b58c127a7..aeb6229360 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js @@ -8,12 +8,12 @@ angular.module('umbraco.mocks'). } function returnNodebyIds(status, data, headers) { - var ids = mocksUtils.getParameterByName(data, "ids") || "1234,1234,4234"; + var ids = mocksUtils.getParameterByName(data, "ids") || ['1234','1234','4234']; var items = []; - _.each(ids, function(id){ - items.push(_getNode( parseInt( id, 10 )) ); - }); + for (var i = 0; i < ids.length; i += 1) { + items.push(_getNode(parseInt(ids[i], 10))); + } return [200, items, null]; } @@ -26,8 +26,6 @@ angular.module('umbraco.mocks'). var id = mocksUtils.getParameterByName(data, "id") || 1234; id = parseInt(id, 10); - - return [200, _getNode(id), null]; } diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js index da6f78a6a5..868bc4c6d5 100644 --- a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js +++ b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js @@ -19,7 +19,8 @@ Umbraco.Sys.ServerVariables = { "dashboardApiBaseUrl": "/umbraco/UmbracoApi/Dashboard/", "updateCheckApiBaseUrl": "/umbraco/Api/UpdateCheck/", "relationApiBaseUrl": "/umbraco/UmbracoApi/Relation/", - "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/" + "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/", + "iconApiBaseUrl": "/umbraco/UmbracoApi/Icon/" }, umbracoSettings: { "umbracoPath": "/umbraco", diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js index 078ad2ad43..7dc34c3b5a 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/auth.resource.js @@ -4,7 +4,7 @@ * @description * This Resource perfomrs actions to common authentication tasks for the Umbraco backoffice user * - * @requires $q + * @requires $q * @requires $http * @requires umbRequestHelper * @requires angularHelper @@ -62,7 +62,7 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { * .then(function(data) { * //Do stuff for login... * }); - * + * * @param {string} login Username of backoffice user * @param {string} password Password of backoffice user * @returns {Promise} resourcePromise object @@ -91,9 +91,9 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { * There are not parameters for this since when the user has clicked on their invite email they will be partially * logged in (but they will not be approved) so we need to use this method to verify the non approved logged in user's details. * Using the getCurrentUser will not work since that only works for approved users - * @returns {} + * @returns {} */ - getCurrentInvitedUser: function () { + getCurrentInvitedUser: function () { return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( @@ -117,7 +117,7 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { * .then(function(data) { * //Do stuff for password reset request... * }); - * + * * @param {string} email Email address of backoffice user * @returns {Promise} resourcePromise object * @@ -164,7 +164,7 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { * .then(function(data) { * //Allow reset of password * }); - * + * * @param {integer} userId User Id * @param {string} resetCode Password reset code * @returns {Promise} resourcePromise object @@ -195,14 +195,14 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { }), 'Password reset code validation failed for userId ' + userId + ', code' + resetCode); }, - + /** * @ngdoc method * @name umbraco.resources.currentUserResource#getPasswordConfig * @methodOf umbraco.resources.currentUserResource * * @description - * Gets the configuration of the user membership provider which is used to configure the change password form + * Gets the configuration of the user membership provider which is used to configure the change password form */ getPasswordConfig: function (userId) { return umbRequestHelper.resourcePromise( @@ -227,7 +227,7 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { * .then(function(data) { * //Password set * }); - * + * * @param {integer} userId User Id * @param {string} password New password * @param {string} confirmPassword Confirmation of new password @@ -346,15 +346,6 @@ function authResource($q, $http, umbRequestHelper, angularHelper) { 'Server call failed for getting current user'); }, - getCurrentUserLinkedLogins: function () { - - return umbRequestHelper.resourcePromise( - $http.get( - umbRequestHelper.getApiUrl( - "authenticationApiBaseUrl", - "GetCurrentUserLinkedLogins")), - 'Server call failed for getting current users linked logins'); - }, /** * @ngdoc method diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js index 4ca85f44e6..3dfbeade4f 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js @@ -442,9 +442,7 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { getByIds: function (ids) { var idQuery = ""; - _.each(ids, function (item) { - idQuery += "ids=" + item + "&"; - }); + ids.forEach(id => idQuery += `ids=${id}&`); return umbRequestHelper.resourcePromise( $http.get( @@ -455,9 +453,7 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) { 'Failed to retrieve data for content with multiple ids') .then(function (result) { //each item needs to be re-formatted - _.each(result, function (r) { - umbDataFormatter.formatContentGetData(r) - }); + result.forEach(r => umbDataFormatter.formatContentGetData(r)); return $q.when(result); }); }, diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js index 60b87e919f..a3be6996b1 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/currentuser.resource.js @@ -2,7 +2,7 @@ * @ngdoc service * @name umbraco.resources.currentUserResource * @description Used for read/updates for the currently logged in user - * + * * **/ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { @@ -35,10 +35,10 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { * .then(function() { * alert('You are allowed to publish this item'); * }); - * + * * * @param {String} permission char representing the permission to check - * @param {Int} id id of content item to delete + * @param {Int} id id of content item to delete * @returns {Promise} resourcePromise object. * */ @@ -52,6 +52,16 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { 'Failed to check permission for item ' + id); }, + getCurrentUserLinkedLogins: function () { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "currentUserApiBaseUrl", + "GetCurrentUserLinkedLogins")), + 'Server call failed for getting current users linked logins'); + }, + saveTourStatus: function (tourStatus) { if (!tourStatus) { @@ -68,7 +78,7 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { }, getTours: function () { - + return umbRequestHelper.resourcePromise( $http.get( umbRequestHelper.getApiUrl( @@ -98,7 +108,7 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { * * @description * Changes the current users password - * + * * @returns {Promise} resourcePromise object containing the user array. * */ @@ -108,7 +118,7 @@ function currentUserResource($q, $http, umbRequestHelper, umbDataFormatter) { if (!changePasswordArgs) { throw 'No password data to change'; } - + return umbRequestHelper.resourcePromise( $http.post( umbRequestHelper.getApiUrl( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js index e24f4786eb..06eb2ed4d2 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js @@ -226,9 +226,7 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) { getByIds: function (ids) { var idQuery = ""; - _.each(ids, function (item) { - idQuery += "ids=" + item + "&"; - }); + ids.forEach(id => idQuery += `ids=${id}&`); return umbRequestHelper.resourcePromise( $http.get( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js index c83a31e47c..f9b9da9944 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js @@ -32,9 +32,7 @@ function memberGroupResource($q, $http, umbRequestHelper) { getByIds: function (ids) { var idQuery = ""; - _.each(ids, function (item) { - idQuery += "ids=" + item + "&"; - }); + ids.forEach(id => idQuery += `ids=${id}&`); return umbRequestHelper.resourcePromise( $http.get( diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js index 6c15b89c0e..2314fa6d6c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js @@ -16,16 +16,15 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter) { } var query = ""; - _.each(filterContentTypes, function (item) { - query += "filterContentTypes=" + item + "&"; - }); + filterContentTypes.forEach(fct => query += `filterContentTypes=${fct}&`); + // if filterContentTypes array is empty we need a empty variable in the querystring otherwise the service returns a error if (filterContentTypes.length === 0) { query += "filterContentTypes=&"; } - _.each(filterPropertyTypes, function (item) { - query += "filterPropertyTypes=" + item + "&"; - }); + + filterPropertyTypes.forEach(fpt => query += `filterPropertyTypes=${fpt}&`); + // if filterPropertyTypes array is empty we need a empty variable in the querystring otherwise the service returns a error if (filterPropertyTypes.length === 0) { query += "filterPropertyTypes=&"; diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js index 2b9e0c0fd5..91f00a36e3 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js @@ -295,6 +295,38 @@ "Failed to retrieve data for user " + userId); } + + /** + * @ngdoc method + * @name umbraco.resources.usersResource#getUsers + * @methodOf umbraco.resources.usersResource + * + * @description + * Gets users from ids + * + * ##usage + *
+          * usersResource.getUsers([1,2,3])
+          *    .then(function(data) {
+          *        alert("It's here");
+          *    });
+          * 
+ * + * @param {Array} userIds user ids. + * @returns {Promise} resourcePromise object containing the users array. + * + */ + function getUsers(userIds) { + + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "userApiBaseUrl", + "GetByIds", + { ids: userIds })), + "Failed to retrieve data for users " + userIds); + } + /** * @ngdoc method * @name umbraco.resources.usersResource#createUser @@ -481,6 +513,7 @@ setUserGroupsOnUsers: setUserGroupsOnUsers, getPagedResults: getPagedResults, getUser: getUser, + getUsers: getUsers, createUser: createUser, inviteUser: inviteUser, saveUser: saveUser, diff --git a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js index 30e59e9a88..b474b66174 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js @@ -276,7 +276,7 @@ angular.module('umbraco.services') //blocking var promises = []; var assets = []; - _.each(nonEmpty, function (path) { + nonEmpty.forEach(path => { path = convertVirtualPath(path); var asset = service._getAssetPromise(path); //if not previously loaded, add to list of promises @@ -325,19 +325,17 @@ angular.module('umbraco.services') scope = $rootScope; } angularHelper.safeApply(scope, - function () { - asset.deferred.resolve(true); - }); + () => asset.deferred.resolve(true)); } if (cssAssets.length > 0) { - var cssPaths = _.map(cssAssets, function (asset) { return appendRnd(asset.path) }); - LazyLoad.css(cssPaths, function () { _.each(cssAssets, assetLoaded); }); + var cssPaths = cssAssets.map(css => appendRnd(css.path)); + LazyLoad.css(cssPaths, () => cssAssets.forEach(assetLoaded)); } if (jsAssets.length > 0) { - var jsPaths = _.map(jsAssets, function (asset) { return appendRnd(asset.path) }); - LazyLoad.js(jsPaths, function () { _.each(jsAssets, assetLoaded); }); + var jsPaths = jsAssets.map(js => appendRnd(js.path)); + LazyLoad.js(jsPaths, () => jsAssets.forEach(assetLoaded)); } return promise; diff --git a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js index cb583546a5..0d2ca6623b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js @@ -11,13 +11,13 @@ * */ function clipboardService(notificationsService, eventsService, localStorageService, iconHelper) { - + var clearPropertyResolvers = []; - + var STORAGE_KEY = "umbClipboardService"; - + var retriveStorage = function() { if (localStorageService.isSupported === false) { return null; @@ -27,32 +27,32 @@ function clipboardService(notificationsService, eventsService, localStorageServi if (dataString != null) { dataJSON = JSON.parse(dataString); } - + if(dataJSON == null) { dataJSON = new Object(); } - + if(dataJSON.entries === undefined) { dataJSON.entries = []; } - + return dataJSON; } - + var saveStorage = function(storage) { var storageString = JSON.stringify(storage); - + try { var storageJSON = JSON.parse(storageString); localStorageService.set(STORAGE_KEY, storageString); - + eventsService.emit("clipboardService.storageUpdate"); - + return true; } catch(e) { return false; } - + return false; } @@ -86,17 +86,17 @@ function clipboardService(notificationsService, eventsService, localStorageServi var isEntryCompatible = function(entry, type, allowedAliases) { return entry.type === type - && + && ( (entry.alias && allowedAliases.filter(allowedAlias => allowedAlias === entry.alias).length > 0) - || + || (entry.aliases && entry.aliases.filter(entryAlias => allowedAliases.filter(allowedAlias => allowedAlias === entryAlias).length > 0).length === entry.aliases.length) ); } - - + + var service = {}; - + /** * @ngdoc method @@ -160,29 +160,29 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Saves a single JS-object with a type and alias to the clipboard. */ service.copy = function(type, alias, data, displayLabel, displayIcon, uniqueKey, firstLevelClearupMethod) { - + var storage = retriveStorage(); displayLabel = displayLabel || data.name; displayIcon = displayIcon || iconHelper.convertFromLegacyIcon(data.icon); uniqueKey = uniqueKey || data.key || console.error("missing unique key for this content"); - + // remove previous copies of this entry: storage.entries = storage.entries.filter( (entry) => { return entry.unique !== uniqueKey; } ); - - var entry = {unique:uniqueKey, type:type, alias:alias, data:prepareEntryForStorage(data, firstLevelClearupMethod), label:displayLabel, icon:displayIcon}; + + var entry = {unique:uniqueKey, type:type, alias:alias, data:prepareEntryForStorage(data, firstLevelClearupMethod), label:displayLabel, icon:displayIcon, date:Date.now()}; storage.entries.push(entry); - + if (saveStorage(storage) === true) { notificationsService.success("Clipboard", "Copied to clipboard."); } else { notificationsService.error("Clipboard", "Couldnt copy this data to clipboard."); } - + }; @@ -203,32 +203,31 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Saves a single JS-object with a type and alias to the clipboard. */ service.copyArray = function(type, aliases, datas, displayLabel, displayIcon, uniqueKey, firstLevelClearupMethod) { - + var storage = retriveStorage(); - + // Clean up each entry var copiedDatas = datas.map(data => prepareEntryForStorage(data, firstLevelClearupMethod)); - + // remove previous copies of this entry: storage.entries = storage.entries.filter( (entry) => { return entry.unique !== uniqueKey; } ); - - var entry = {unique:uniqueKey, type:type, aliases:aliases, data:copiedDatas, label:displayLabel, icon:displayIcon}; + var entry = {unique:uniqueKey, type:type, aliases:aliases, data:copiedDatas, label:displayLabel, icon:displayIcon, date:Date.now()}; storage.entries.push(entry); - + if (saveStorage(storage) === true) { notificationsService.success("Clipboard", "Copied to clipboard."); } else { notificationsService.error("Clipboard", "Couldnt copy this data to clipboard."); } - + }; - - + + /** * @ngdoc method * @name umbraco.services.supportsCopy#supported @@ -240,7 +239,7 @@ function clipboardService(notificationsService, eventsService, localStorageServi service.isSupported = function() { return localStorageService.isSupported; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#hasEntriesOfType @@ -253,14 +252,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Determines whether the current clipboard has entries that match a given type and one of the aliases. */ service.hasEntriesOfType = function(type, aliases) { - + if(service.retriveEntriesOfType(type, aliases).length > 0) { return true; } - + return false; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -268,24 +267,24 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to recive. * @param {string} aliases A array of strings providing the alias of the data you want to recive. - * + * * @description * Returns an array of entries matching the given type and one of the provided aliases. */ service.retriveEntriesOfType = function(type, allowedAliases) { - + var storage = retriveStorage(); - + // Find entries that are fulfilling the criteria for this nodeType and nodeTypesAliases. var filteretEntries = storage.entries.filter( (entry) => { return isEntryCompatible(entry, type, allowedAliases); } ); - + return filteretEntries; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -293,14 +292,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to recive. * @param {string} aliases A array of strings providing the alias of the data you want to recive. - * + * * @description * Returns an array of data of entries matching the given type and one of the provided aliases. */ service.retriveDataOfType = function(type, aliases) { return service.retriveEntriesOfType(type, aliases).map((x) => x.data); }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -308,12 +307,12 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to remove. * @param {string} aliases A array of strings providing the alias of the data you want to remove. - * + * * @description * Removes entries matching the given type and one of the provided aliases. */ service.clearEntriesOfType = function(type, allowedAliases) { - + var storage = retriveStorage(); // Find entries that are NOT fulfilling the criteria for this nodeType and nodeTypesAliases. @@ -322,14 +321,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi return !isEntryCompatible(entry, type, allowedAliases); } ); - + storage.entries = filteretEntries; saveStorage(storage); }; - - - + + + return service; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js index 4ffd0c3c0b..c27283d5ad 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js @@ -123,10 +123,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, editorSt self.handleSaveError({ showNotifications: args.showNotifications, softRedirect: args.softRedirect, - err: err, - rebindCallback: function () { - rebindCallback.apply(self, [args.content, err.data]); - } + err: err }); //update editor state to what is current diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js index 538bd41ce0..0f4f04c6bf 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js @@ -669,23 +669,6 @@ When building a custom infinite editor view you can use the same components as a open(editor); } - /** - * @ngdoc method - * @name umbraco.services.editorService#memberTypeEditor - * @methodOf umbraco.services.editorService - * - * @description - * Opens the member type editor in infinite editing, the submit callback returns the saved member type - * @param {Object} editor rendering options - * @param {Callback} editor.submit Submits the editor - * @param {Callback} editor.close Closes the editor - * @returns {Object} editor object - */ - function memberTypeEditor(editor) { - editor.view = "views/membertypes/edit.html"; - open(editor); - } - /** * @ngdoc method * @name umbraco.services.editorService#queryBuilder diff --git a/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js b/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js new file mode 100644 index 0000000000..a3dd91194e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js @@ -0,0 +1,26 @@ +(function () { + "use strict"; + + function focusLockService() { + var elementToInert = document.querySelector('#mainwrapper'); + + function addInertAttribute() { + elementToInert.setAttribute('inert', true); + } + + function removeInertAttribute() { + elementToInert.removeAttribute('inert'); + } + + var service = { + addInertAttribute: addInertAttribute, + removeInertAttribute: removeInertAttribute + } + + return service; + + } + + angular.module("umbraco.services").factory("focusLockService", focusLockService); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js index 5866e28b1e..d9c11770cc 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js @@ -17,10 +17,10 @@ function formHelper(angularHelper, serverValidationManager, notificationsService * @function * * @description - * Called by controllers when submitting a form - this ensures that all client validation is checked, + * Called by controllers when submitting a form - this ensures that all client validation is checked, * server validation is cleared, that the correct events execute and status messages are displayed. * This returns true if the form is valid, otherwise false if form submission cannot continue. - * + * * @param {object} args An object containing arguments for form submission */ submitForm: function (args) { @@ -33,6 +33,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService if (!args.scope) { throw "args.scope cannot be null"; } + if (!args.formCtrl) { //try to get the closest form controller currentForm = angularHelper.getRequiredCurrentForm(args.scope); @@ -44,15 +45,13 @@ function formHelper(angularHelper, serverValidationManager, notificationsService //the first thing any form must do is broadcast the formSubmitting event args.scope.$broadcast("formSubmitting", { scope: args.scope, action: args.action }); - // Some property editors need to perform an action after all property editors have reacted to the formSubmitting. - args.scope.$broadcast("formSubmittingFinalPhase", { scope: args.scope, action: args.action }); - - // Set the form state to submitted - currentForm.$setSubmitted(); + this.focusOnFirstError(currentForm); + args.scope.$broadcast("postFormSubmitting", { scope: args.scope, action: args.action }); //then check if the form is valid if (!args.skipValidation) { if (currentForm.$invalid) { + return false; } } @@ -68,6 +67,32 @@ function formHelper(angularHelper, serverValidationManager, notificationsService return true; }, + /** + * @ngdoc function + * @name umbraco.services.formHelper#focusOnFirstError + * @methodOf umbraco.services.formHelper + * @function + * + * @description + * Called by submitForm when a form has been submitted, it will fire a focus on the first found invalid umb-property it finds in the form.. + * + * @param {object} form Pass in a form object. + */ + focusOnFirstError: function(form) { + var invalidNgForms = form.$$element.find(`.umb-property ng-form.ng-invalid, .umb-property-editor ng-form.ng-invalid-required`); + var firstInvalidNgForm = invalidNgForms.first(); + + if(firstInvalidNgForm.length !== 0) { + var focusableFields = [...firstInvalidNgForm.find("umb-range-slider .noUi-handle,input,textarea,select,button")]; + if(focusableFields.length !== 0) { + var firstErrorEl = focusableFields.find(el => el.type !== "hidden" && el.hasAttribute("readonly") === false); + if(firstErrorEl.length !== 0) { + firstErrorEl.focus(); + } + } + } + }, + /** * @ngdoc function * @name umbraco.services.formHelper#submitForm @@ -76,32 +101,18 @@ function formHelper(angularHelper, serverValidationManager, notificationsService * * @description * Called by controllers when a form has been successfully submitted, this ensures the correct events are raised. - * + * * @param {object} args An object containing arguments for form submission */ resetForm: function (args) { - - var currentForm; - if (!args) { throw "args cannot be null"; } if (!args.scope) { throw "args.scope cannot be null"; } - if (!args.formCtrl) { - //try to get the closest form controller - currentForm = angularHelper.getRequiredCurrentForm(args.scope); - } - else { - currentForm = args.formCtrl; - } - // Set the form state to pristine - currentForm.$setPristine(); - currentForm.$setUntouched(); - - args.scope.$broadcast(args.hasErrors ? "formSubmittedValidationFailed" : "formSubmitted", { scope: args.scope }); + args.scope.$broadcast("formSubmitted", { scope: args.scope }); }, showNotifications: function (args) { @@ -126,7 +137,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService * @description * Needs to be called when a form submission fails, this will wire up all server validation errors in ModelState and * add the correct messages to the notifications. If a server error has occurred this will show a ysod. - * + * * @param {object} err The error object returned from the http promise */ handleError: function (err) { @@ -165,7 +176,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService * * @description * This wires up all of the server validation model state so that valServer and valServerField directives work - * + * * @param {object} err The error object returned from the http promise */ handleServerValidation: function (modelState) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js index 0fa2d0df1a..0d0135fff8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js @@ -3,7 +3,7 @@ * @name umbraco.services.iconHelper * @description A helper service for dealing with icons, mostly dealing with legacy tree icons **/ -function iconHelper($q, $timeout) { +function iconHelper($http, $q, $sce, $timeout, umbRequestHelper) { var converter = [ { oldIcon: ".sprNew", newIcon: "add" }, @@ -85,11 +85,15 @@ function iconHelper($q, $timeout) { { oldIcon: ".sprTreeDeveloperPython", newIcon: "icon-linux" } ]; + var collectedIcons; + var imageConverter = [ {oldImage: "contour.png", newIcon: "icon-umb-contour"} ]; - var collectedIcons; + var iconCache = []; + var liveRequests = []; + var allIconsRequested = false; return { @@ -154,9 +158,110 @@ function iconHelper($q, $timeout) { return false; }, - /** Return a list of icons, optionally filter them */ + /** Converts the icon from legacy to a new one if an old one is detected */ + convertFromLegacyIcon: function (icon) { + if (this.isLegacyIcon(icon)) { + //its legacy so convert it if we can + var found = _.find(converter, function (item) { + return item.oldIcon.toLowerCase() === icon.toLowerCase(); + }); + return (found ? found.newIcon : icon); + } + return icon; + }, + + convertFromLegacyImage: function (icon) { + var found = _.find(imageConverter, function (item) { + return item.oldImage.toLowerCase() === icon.toLowerCase(); + }); + return (found ? found.newIcon : undefined); + }, + + /** If we detect that the tree node has legacy icons that can be converted, this will convert them */ + convertFromLegacyTreeNodeIcon: function (treeNode) { + if (this.isLegacyTreeNodeIcon(treeNode)) { + return this.convertFromLegacyIcon(treeNode.icon); + } + return treeNode.icon; + }, + + /** Gets a single IconModel */ + getIcon: function(iconName) { + return $q((resolve, reject) => { + var icon = this._getIconFromCache(iconName); + + if(icon !== undefined) { + resolve(icon); + } else { + var iconRequestPath = Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl + 'GetIcon?iconName=' + iconName; + + // If the current icon is being requested, wait a bit so that we don't have to make another http request and can instead get the icon from the cache. + // This is a bit rough and ready and could probably be improved used an event based system + if(liveRequests.indexOf(iconRequestPath) >= 0) { + setTimeout(() => { + resolve(this.getIcon(iconName)); + }, 10); + } else { + liveRequests.push(iconRequestPath); + // TODO - fix bug where Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl is undefinied when help icon + umbRequestHelper.resourcePromise( + $http.get(iconRequestPath) + ,'Failed to retrieve icon: ' + iconName) + .then(icon => { + if(icon) { + var trustedIcon = { + name: icon.Name, + svgString: $sce.trustAsHtml(icon.SvgString) + }; + this._cacheIcon(trustedIcon); + + liveRequests = _.filter(liveRequests, iconRequestPath); + + resolve(trustedIcon); + } + }) + .catch(err => { + console.warn(err); + }); + }; + + } + }); + }, + + /** Gets all the available icons in the backoffice icon folder and returns them as an array of IconModels */ + getAllIcons: function() { + return $q((resolve, reject) => { + if(allIconsRequested === false) { + allIconsRequested = true; + + umbRequestHelper.resourcePromise( + $http.get(Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl + 'GetAllIcons') + ,'Failed to retrieve icons') + .then(icons => { + icons.forEach(icon => { + var trustedIcon = { + name: icon.Name, + svgString: $sce.trustAsHtml(icon.SvgString) + }; + + this._cacheIcon(trustedIcon); + }); + + resolve(iconCache); + }) + .catch(err => { + console.warn(err); + });; + } else { + resolve(iconCache); + } + }); + }, + + /** LEGACY - Return a list of icons from icon fonts, optionally filter them */ /** It fetches them directly from the active stylesheets in the browser */ - getIcons: function(){ + getLegacyIcons: function(){ var deferred = $q.defer(); $timeout(function(){ if(collectedIcons){ @@ -188,8 +293,13 @@ function iconHelper($q, $timeout) { s = s.substring(0, hasPseudo); } - if(collectedIcons.indexOf(s) < 0){ - collectedIcons.push(s); + var icon = { + name: s, + svgString: undefined + }; + + if(collectedIcons.indexOf(icon) < 0 && s !== "icon-chevron-up" && s !== "icon-chevron-down"){ + collectedIcons.push(icon); } } } @@ -198,35 +308,20 @@ function iconHelper($q, $timeout) { deferred.resolve(collectedIcons); } }, 100); - + return deferred.promise; }, - /** Converts the icon from legacy to a new one if an old one is detected */ - convertFromLegacyIcon: function (icon) { - if (this.isLegacyIcon(icon)) { - //its legacy so convert it if we can - var found = _.find(converter, function (item) { - return item.oldIcon.toLowerCase() === icon.toLowerCase(); - }); - return (found ? found.newIcon : icon); - } - return icon; + /** A simple cache to ensure that the icon is only requested from the server if is isn't already in memory */ + _cacheIcon: function(icon) { + if(_.find(iconCache, {name: icon.name}) === undefined) { + iconCache = _.union(iconCache, [icon]); + } }, - convertFromLegacyImage: function (icon) { - var found = _.find(imageConverter, function (item) { - return item.oldImage.toLowerCase() === icon.toLowerCase(); - }); - return (found ? found.newIcon : undefined); - }, - - /** If we detect that the tree node has legacy icons that can be converted, this will convert them */ - convertFromLegacyTreeNodeIcon: function (treeNode) { - if (this.isLegacyTreeNodeIcon(treeNode)) { - return this.convertFromLegacyIcon(treeNode.icon); - } - return treeNode.icon; + /** Returns the cached icon or undefined */ + _getIconFromCache: function(iconName) { + return _.find(iconCache, {name: iconName}); } }; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js index 75c9dccc30..6e5ee82ec7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js @@ -435,11 +435,16 @@ function mediaHelper(umbRequestHelper, $http, $log) { imagePath, animationProcessMode: options.animationProcessMode, cacheBusterValue: options.cacheBusterValue, - focalPoint: options.focalPoint, + focalPointLeft: options.focalPoint.left, + focalPointTop: options.focalPoint.top, height: options.height, mode: options.mode, upscale: options.upscale || false, - width: options.width + width: options.width, + cropX1: options.crop.x1, + cropX2: options.crop.x2, + cropY1: options.crop.y1, + cropY2: options.crop.y2 })), "Failed to retrieve processed image URL for image: " + imagePath); } 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 f903c44ad5..0907538b24 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 @@ -169,7 +169,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService //if the routing parameter keys are the same, we'll compare their values to see if any have changed and if so then the routing will be allowed. if (diff1.length === 0 && diff2.length === 0) { var partsChanged = 0; - _.each(currRoutingKeys, function (k) { + currRoutingKeys.forEach(k => { if (currUrlParams[k] != nextUrlParams[k]) { partsChanged++; } @@ -206,7 +206,8 @@ function navigationService($routeParams, $location, $q, $injector, eventsService var toRetain = _.union(retainedQueryStrings, toRetain); var currentSearch = $location.search(); $location.search(''); - _.each(toRetain, function (k) { + + toRetain.forEach(k => { if (currentSearch[k]) { $location.search(k, currentSearch[k]); } @@ -240,7 +241,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService var toRetain = Utilities.copy(nextRouteParams); var updated = false; - _.each(retainedQueryStrings, function (r) { + retainedQueryStrings.forEach(r => { // if mculture is set to null in nextRouteParams, the value will be undefined and we will not retain any query string that has a value of "null" if (currRouteParams[r] && nextRouteParams[r] !== undefined && !nextRouteParams[r]) { toRetain[r] = currRouteParams[r]; @@ -319,7 +320,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService appState.setGlobalState("showTray", false); }, - /** + /** * @ngdoc method * @name umbraco.services.navigationService#syncTree * @methodOf umbraco.services.navigationService @@ -352,14 +353,14 @@ 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) { @@ -628,12 +629,12 @@ function navigationService($routeParams, $location, $q, $injector, eventsService getTreeTemplateUrl: function (treeAlias, action) { var packageTreeFolder = treeService.getTreePackageFolder(treeAlias); if (packageTreeFolder) { - return Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + + return (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + "/" + packageTreeFolder + - "/backoffice/" + treeAlias + "/" + action + ".html"; + "/backoffice/" + treeAlias + "/" + action + ".html").toLowerCase(); } else { - return "views/" + treeAlias + "/" + action + ".html"; + return ("views/" + treeAlias + "/" + action + ".html").toLowerCase();; } }, 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 123845a63b..ea05dad4e7 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 @@ -8,14 +8,14 @@ (function () { "use strict"; - function overlayService(eventsService, backdropService) { + function overlayService(eventsService, backdropService, focusLockService) { var currentOverlay = null; function open(newOverlay) { // prevent two open overlays at the same time - if(currentOverlay) { + if (currentOverlay) { close(); } @@ -23,32 +23,34 @@ var overlay = newOverlay; // set the default overlay position to center - if(!overlay.position) { + if (!overlay.position) { overlay.position = "center"; } // set the default overlay size to small - if(!overlay.size) { + if (!overlay.size) { overlay.size = "small"; } // use a default empty view if nothing is set - if(!overlay.view) { + if (!overlay.view) { overlay.view = "views/common/overlays/default/default.html"; } // option to disable backdrop clicks - if(overlay.disableBackdropClick) { + if (overlay.disableBackdropClick) { backdropOptions.disableEventsOnClick = true; } overlay.show = true; + focusLockService.addInertAttribute(); backdropService.open(backdropOptions); currentOverlay = overlay; eventsService.emit("appState.overlay", overlay); } function close() { + focusLockService.removeInertAttribute(); backdropService.close(); currentOverlay = null; eventsService.emit("appState.overlay", null); @@ -90,7 +92,6 @@ } open(overlay); - } function confirmDelete(overlay) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js index fef286ec7e..803cd857b7 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js @@ -21,8 +21,8 @@ * */ angular.module('umbraco.services') - .factory('searchService', function ($q, $log, entityResource, contentResource, umbRequestHelper, $injector, searchResultFormatter) { - + .factory('searchService', function (entityResource, $injector, searchResultFormatter) { + return { /** @@ -42,12 +42,11 @@ angular.module('umbraco.services') throw "args.term is required"; } - return entityResource.search(args.term, "Member", args.searchFrom).then(function (data) { - _.each(data, function (item) { - searchResultFormatter.configureMemberResult(item); + return entityResource.search(args.term, "Member", args.searchFrom) + .then(data => { + data.forEach(item => searchResultFormatter.configureMemberResult(item)); + return data; }); - return data; - }); }, /** @@ -67,12 +66,11 @@ angular.module('umbraco.services') throw "args.term is required"; } - return entityResource.search(args.term, "Document", args.searchFrom, args.canceler, args.dataTypeKey).then(function (data) { + return entityResource.search(args.term, "Document", args.searchFrom, args.canceler, args.dataTypeKey) _.each(data, function (item) { - searchResultFormatter.configureContentResult(item); + data.forEach(item => searchResultFormatter.configureContentResult(item)); + return data; }); - return data; - }); }, /** @@ -92,12 +90,11 @@ angular.module('umbraco.services') throw "args.term is required"; } - return entityResource.search(args.term, "Media", args.searchFrom, args.canceler, args.dataTypeKey).then(function (data) { - _.each(data, function (item) { - searchResultFormatter.configureMediaResult(item); + return entityResource.search(args.term, "Media", args.searchFrom, args.canceler, args.dataTypeKey) + .then(data => { + data.forEach(item => searchResultFormatter.configureMediaResult(item)); + return data; }); - return data; - }); }, /** @@ -117,10 +114,8 @@ angular.module('umbraco.services') throw "args.term is required"; } - return entityResource.searchAll(args.term, args.canceler).then(function (data) { - - _.each(data, function (resultByType) { - + return entityResource.searchAll(args.term, args.canceler).then(data => { + Object.values(data).forEach(resultByType => { //we need to format the search result data to include things like the subtitle, urls, etc... // this is done with registered angular services as part of the SearchableTreeAttribute, if that // is not found, than we format with the default formatter @@ -140,7 +135,7 @@ angular.module('umbraco.services') } } //now apply the formatter for each result - _.each(resultByType.results, function (item) { + resultByType.results.forEach(item => { formatterMethod.apply(this, [item, resultByType.treeAlias, resultByType.appAlias]); }); @@ -148,12 +143,10 @@ angular.module('umbraco.services') return data; }); - }, // TODO: This doesn't do anything! setCurrent: function (sectionAlias) { - var currentSection = sectionAlias; } }; 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 9945396262..5d6b4646a3 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 @@ -1372,6 +1372,9 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s // throw "args.model.value is required"; //} + // force TinyMCE to load plugins/themes from minified files (see http://archive.tinymce.com/wiki.php/api4:property.tinymce.suffix.static) + args.editor.suffix = ".min"; + var unwatch = null; //Starts a watch on the model value so that we can update TinyMCE if the model changes behind the scenes or from the server @@ -1516,6 +1519,8 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s }); args.editor.on('Dirty', function (e) { + syncContent(); // Set model.value to the RTE's content + //make the form dirty manually so that the track changes works, setting our model doesn't trigger // the angular bits because tinymce replaces the textarea. if (args.currentForm) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js index 0d6216f7cc..37485ea7eb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js @@ -54,7 +54,7 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS //take the last child var childPath = this.getPath(node.children[node.children.length - 1]).join(","); //check if this already exists, if so exit - if (expandedPaths.indexOf(childPath) !== -1) { + if (expandedPaths.includes(childPath)) { return; } @@ -65,18 +65,18 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS var clonedPaths = expandedPaths.slice(0); //make a copy to iterate over so we can modify the original in the iteration - _.each(clonedPaths, function (p) { + clonedPaths.forEach(p => { if (childPath.startsWith(p + ",")) { //this means that the node's path supercedes this path stored so we can remove the current 'p' and replace it with node.path expandedPaths.splice(expandedPaths.indexOf(p), 1); //remove it - if (expandedPaths.indexOf(childPath) === -1) { + if (expandedPaths.includes(childPath) === false) { expandedPaths.push(childPath); //replace it } } else if (p.startsWith(childPath + ",")) { //this means we've already tracked a deeper node so we shouldn't track this one } - else if (expandedPaths.indexOf(childPath) === -1) { + else if (expandedPaths.includes(childPath) === false) { expandedPaths.push(childPath); //track it } }); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js index 90125e7de6..78c8b5fa88 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js @@ -264,9 +264,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe //reset the tabs and set the active one if (response.data.tabs && response.data.tabs.length > 0) { - _.each(response.data.tabs, function (item) { - item.active = false; - }); + response.data.tabs.forEach(item => item.active = false); response.data.tabs[activeTabIndex].active = true; } @@ -327,7 +325,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe if (!jsonData) { throw "jsonData cannot be null"; } if (Utilities.isArray(jsonData)) { - _.each(jsonData, function (item) { + jsonData.forEach(item => { if (!item.key || !item.value) { throw "jsonData array item must have both a key and a value property"; } }); } @@ -345,7 +343,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe var formData = new FormData(); //add the json data if (Utilities.isArray(data)) { - _.each(data, function(item) { + data.forEach(item => { formData.append(item.key, !Utilities.isString(item.value) ? Utilities.toJson(item.value) : item.value); }); } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js index 1bda86c3b3..e6450798fb 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js @@ -12,36 +12,23 @@ { "value": 4, "name": "Inactive", "key": "Inactive", "color": "warning" } ]; - localizationService.localizeMany(_.map(userStates, function (userState) { - return "user_state" + userState.key; - })).then(function (data) { - var reg = /^\[[\S\s]*]$/g; - _.each(data, function (value, index) { - if (!reg.test(value)) { - // Only translate if key exists - userStates[index].name = value; - } + localizationService.localizeMany(userStates.map(userState => "user_state" + userState.key)) + .then(data => { + var reg = /^\[[\S\s]*]$/g; + data.forEach((value, index) => { + if (!reg.test(value)) { + // Only translate if key exists + userStates[index].name = value; + } + }); }); - }); - function getUserStateFromValue(value) { - var foundUserState; - angular.forEach(userStates, function (userState) { - if(userState.value === value) { - foundUserState = userState; - } - }); - return foundUserState; + function getUserStateFromValue(value) { + return userStates.find(userState => userState.value === value); } function getUserStateByKey(key) { - var foundUserState; - angular.forEach(userStates, function (userState) { - if(userState.key === key) { - foundUserState = userState; - } - }); - return foundUserState; + return userStates.find(userState => userState.key === key); } function getUserStatesFilter(userStatesObject) { @@ -49,7 +36,7 @@ var userStatesFilter = []; for (var key in userStatesObject) { - if (userStatesObject.hasOwnProperty(key)) { + if (hasOwnProperty.call(userStatesObject, key)) { var userState = getUserStateByKey(key); if(userState) { userState.count = userStatesObject[key]; @@ -59,7 +46,6 @@ } return userStatesFilter; - } //////////// @@ -71,10 +57,7 @@ }; return service; - } angular.module('umbraco.services').factory('usersHelper', usersHelperService); - - })(); diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js index 82353df744..1fb5884d4c 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js @@ -173,9 +173,9 @@ function umbModelMapper() { /** This converts the source model to a basic entity model, it will throw an exception if there isn't enough data to create the model */ convertToEntityBasic: function (source) { var required = ["id", "name", "icon", "parentId", "path"]; - _.each(required, function (k) { - if (!_.has(source, k)) { - throw "The source object does not contain the property " + k; + required.forEach(k => { + if (!hasOwnProperty.call(source, k)) { + throw `The source object does not contain the property ${k}`; } }); var optional = ["metaData", "key", "alias"]; diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html index fc870858cf..cfe0940aa2 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html @@ -1,118 +1,121 @@
-

Configure your database

-

- Enter connection and authentication details for the database you want to install Umbraco on -

+

Configure your database

+

+ Enter connection and authentication details for the database you want to install Umbraco on +

-
-
- What type of database do you use? - -
- -
-
+ +
+ What type of database do you use? + +
+ +
+
-
+

Great! No need to configure anything, you can simply click the continue button below to continue to the next step

-
+
-
- What is the exact connection string we should use? -
- -
- - - Enter a valid database connection string. -
-
-
- -
-
- Where do we find your database? -
-
- -
- - Enter server domain or IP -
-
-
- -
-
- -
- - Enter the name of the database -
-
-
-
- -
- What credentials are used to access the database? -
-
- -
- - Enter the database user name -
-
-
- -
-
- -
- - Enter the database password -
-
-
- -
-
- -
-
-
-
- -
-
-
- - - - - - Validating your database connection... - - - - Could not connect to database - +
+ What is the exact connection string we should use? +
+ +
+ + Enter a valid database connection string.
-
-
+
+
+
+
+ Where do we find your database? +
+
+ +
+ + Enter server domain or IP +
+
+
- +
+
+ +
+ + Enter the name of the database +
+
+
+
+ +
+ What credentials are used to access the database? +
+
+ +
+ + Enter the database user name +
+
+
+ +
+
+ +
+ + Enter the database password +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + + + + + Validating your database connection... + + + + Could not connect to database + +
+
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html index aea63869ba..4dd8afd512 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/steps/user.html +++ b/src/Umbraco.Web.UI.Client/src/installer/steps/user.html @@ -1,7 +1,7 @@ 
-

Install Umbraco 9

+

Install Umbraco

-

Enter your name, email and password to install Umbraco 9 with its default settings, alternatively you can customize your installation

+

Enter your name, email and password to install Umbraco with its default settings, alternatively you can customize your installation

diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index cdccbf527b..d99573decb 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -147,6 +147,7 @@ @import "components/umb-color-swatches.less"; @import "components/check-circle.less"; @import "components/umb-file-icon.less"; +@import "components/umb-icon.less"; @import "components/umb-iconpicker.less"; @import "components/umb-insert-code-box.less"; @import "components/umb-packages.less"; @@ -174,11 +175,13 @@ @import "components/umb-dropdown.less"; @import "components/umb-range-slider.less"; @import "components/umb-number.less"; +@import "components/umb-tags-editor.less"; @import "components/buttons/umb-button.less"; @import "components/buttons/umb-button-group.less"; @import "components/buttons/umb-toggle.less"; @import "components/buttons/umb-toggle-group.less"; +@import "components/buttons/umb-button-ellipsis.less"; @import "components/notifications/umb-notifications.less"; @import "components/umb-file-dropzone.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/buttons.less b/src/Umbraco.Web.UI.Client/src/less/buttons.less index 2b50b60ae8..2caa223647 100644 --- a/src/Umbraco.Web.UI.Client/src/less/buttons.less +++ b/src/Umbraco.Web.UI.Client/src/less/buttons.less @@ -336,20 +336,17 @@ input[type="submit"].btn { // This is lifted from umb-group-builder.less .btn-icon { - border: none; - + border: none; font-size: 18px; position: relative; cursor: pointer; color: @ui-icon; - margin: 0; padding: 5px 10px; width: auto; overflow: visible; background: transparent; line-height: normal; - outline: 0; -webkit-appearance: none; &:hover { diff --git a/src/Umbraco.Web.UI.Client/src/less/colors.less b/src/Umbraco.Web.UI.Client/src/less/colors.less index 4cb70cdf5e..ba4909c997 100644 --- a/src/Umbraco.Web.UI.Client/src/less/colors.less +++ b/src/Umbraco.Web.UI.Client/src/less/colors.less @@ -24,7 +24,7 @@ /* Colors based on https://zavoloklom.github.io/material-design-color-palette/colors.html */ .btn-color-black {background-color: @black;} -.color-black i { color: @black;} +.color-black, .color-black i { color: @black !important;} .btn-color-blue-grey {background-color: @blueGrey;} .color-blue-grey, .color-blue-grey i { color: @blueGrey !important;} @@ -78,4 +78,4 @@ .color-deep-purple, .color-deep-purple i { color: @deepPurpleIcon !important; } .btn-color-indigo{background-color: @indigoIcon;} -.color-indigo, .color-indigo i { color: @indigoIcon !important; } \ No newline at end of file +.color-indigo, .color-indigo i { color: @indigoIcon !important; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-ellipsis.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-ellipsis.less new file mode 100644 index 0000000000..54302ba869 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-ellipsis.less @@ -0,0 +1,76 @@ +.umb-button-ellipsis{ + padding: 0 5px; + text-align: center; + margin: 0 auto; + cursor: pointer; + border-radius: @baseBorderRadius; + color: black; + position: relative; + opacity: 0.8; + transition: opacity .3s ease-out; + + &--absolute { + position: absolute; + } + + &--small { + height: 15px; + } + + &.show-text { + display: flex; + flex-wrap: wrap; + justify-content: center; + } + + .umb-button-ellipsis--tab, + .umb-tour-is-visible .umb-tree &, + &:hover, + &:focus{ + opacity: 1; + } + + &--hidden{ + opacity: 0; + + &:hover, + &:focus { + opacity: 1; + } + } + + &__content { + display: flex; + flex-wrap: wrap; + } + + &__icon { + color: inherit; + flex-basis: 100%; + + .umb-button-ellipsis--tab & { + margin: 0 0 7px; + } + + .umb-button-ellipsis--small & { + font-size: 8px; + position: relative; + top: -2px; + } + } + + &__text { + color: inherit; + font-size: 12px; + line-height: 1em; + flex-basis: 100%; + + .umb-button-ellipsis--tab & { + position: absolute; + right: 0; + left: 0; + bottom: 13px; + margin: 0 auto; + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less index 02b67460f6..24800c1142 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button-group.less @@ -14,7 +14,7 @@ display: flex; } -.umb-button-group { +.umb-button-group.-with-button-group-toggle { .umb-button__button { border-radius: @baseBorderRadius 0 0 @baseBorderRadius; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less index 4127c2201c..d523b24141 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-button.less @@ -31,6 +31,11 @@ margin-left: 5px; } +.umb-button__button[disabled] .umb-button__caret { + border-top-color: @gray-7; + border-bottom-color: @gray-7; +} + .umb-button__progress { position: absolute; left: 50%; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less index ff4122b258..701af849cc 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/buttons/umb-toggle.less @@ -41,9 +41,6 @@ } } - - - .umb-toggle__handler { position: absolute; top: 1px; @@ -59,10 +56,8 @@ transform: translateX(20px); background-color: @white; } - } - /* Icons */ .umb-toggle__icon { @@ -78,9 +73,7 @@ color:@white; transition: opacity 120ms; opacity: 0; - // .umb-toggle:hover & { - // color: @ui-btn-hover; - // } + .umb-toggle--checked & { opacity: 1; } @@ -93,6 +86,7 @@ right: 5px; color: @ui-btn; transition: opacity 120ms; + .umb-toggle--checked & { opacity: 0; } @@ -101,23 +95,41 @@ } } - - -.umb-toggle.umb-toggle--disabled.umb-toggle--checked, .umb-toggle.umb-toggle--disabled { .umb-toggle__toggle { cursor: not-allowed; - background-color: @gray-9; - border-color: @gray-9; } - .umb-toggle__icon--left { - color: @gray-6; + + &, &.umb-toggle--checked { + + .umb-toggle__toggle { + .umb-toggle__handler { + background-color: @gray-10; + } + } } - .umb-toggle__icon--right { - color: @gray-6; + + &:not(.umb-toggle--checked) { + .umb-toggle__toggle { + background-color: @gray-8; + border-color: @gray-8; + } + + .umb-toggle__icon--left, + .umb-toggle__icon--right { + color: @gray-6; + } } - .umb-toggle__handler { - background-color: @gray-10; + + &.umb-toggle--checked { + .umb-toggle__toggle { + background-color: lighten(@ui-btn, 50%); + border-color: lighten(@ui-btn, 50%); + } + .umb-toggle__icon--left, + .umb-toggle__icon--right { + color: @gray-9; + } } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/editor.less b/src/Umbraco.Web.UI.Client/src/less/components/editor.less index ac55c6ffb1..d4069cdd2b 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/editor.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/editor.less @@ -73,6 +73,11 @@ height: @editorHeaderHeight; } +.umb-editor-header .umb-button__button[disabled] { + // do not dim down the background color of disabled buttons in the header + background-color: unset; +} + .umb-editor-header__back { background: transparent; border: 0; @@ -135,22 +140,19 @@ input.umb-editor-header__name-input:disabled { margin-left: auto; } -a.umb-editor-header__close-split-view { - +.umb-editor-header__close-split-view { display: flex; justify-content: center; align-items: center; position: relative; height: 69px; width: 69px; - - font-size: 20px; - color: @gray-6; - text-decoration: none !important; -} + font-size: 20px; + color: @gray-6; -a.umb-editor-header__close-split-view:hover { - color: @black; + &:hover { + color: @black; + } } .umb-editor-header { @@ -162,9 +164,7 @@ a.umb-editor-header__close-split-view:hover { } } - // container - .umb-editor-container { position: absolute; top: @editorHeaderHeight; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/editor/umb-variant-switcher.less b/src/Umbraco.Web.UI.Client/src/less/components/editor/umb-variant-switcher.less index eae25b273c..95625d9e73 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/editor/umb-variant-switcher.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/editor/umb-variant-switcher.less @@ -90,6 +90,7 @@ button.umb-variant-switcher__toggle { align-items: center; border-bottom: 1px solid @gray-9; position: relative; + .umb-variant-switcher__name-wrapper:hover { .umb-variant-switcher__name { color: @blueMid; @@ -99,6 +100,11 @@ button.umb-variant-switcher__toggle { } } } + +.umb-variant-switcher__item.--not-allowed:not(.--current) .umb-variant-switcher__name-wrapper:hover { + cursor: default; +} + .umb-variant-switcher__item.--state-notCreated:not(.--active) { .umb-variant-switcher__name-wrapper::before { content: "+"; @@ -106,38 +112,44 @@ button.umb-variant-switcher__toggle { float: left; font-size: 15px; font-weight: 900; - padding: 8px 16px 8px 6px; + padding: 8px 12px 8px 0; color: @gray-5; } + .umb-variant-switcher__item-expand-button + .umb-variant-switcher__name-wrapper::before { padding: 8px 16px 8px 20px; } + .umb-variant-switcher__name { color: @gray-5; } + .umb-variant-switcher__state { color: @gray-6; } + .umb-variant-switcher__name-wrapper::after { content: ""; position: absolute; z-index: 1; - border: 1px dashed @gray-9; - top: 7px; - bottom: 7px; - left: 7px; - right: 7px; - border-radius: 3px; + border: 2px dashed @gray-9; + margin: 2px; + top: 0; + bottom: 0; + left: 0; + right: 0; pointer-events: none; } - + .umb-variant-switcher__name-wrapper:hover { &::before { color: @blueMid; } + .umb-variant-switcher__name { color: @blueMid; } + .umb-variant-switcher__state { color: @blueMid; } @@ -183,8 +195,11 @@ button.umb-variant-switcher__toggle { } .umb-variant-switcher__item.--current { - //color: @ui-light-active-type; + color: @ui-light-active-type; //background-color: @pinkExtraLight; + .umb-variant-switcher__name-wrapper { + border-left: 4px solid @ui-active; + } .umb-variant-switcher__name { //color: @ui-light-active-type; font-weight: 700; @@ -216,7 +231,7 @@ button.umb-variant-switcher__toggle { .umb-variant-switcher__item:focus-within .umb-variant-switcher__split-view, .umb-variant-switcher__item:hover .umb-variant-switcher__split-view, .umb-variant-switcher__split-view:focus { - display: block; + display: flex; cursor: pointer; } @@ -263,7 +278,10 @@ button.umb-variant-switcher__toggle { cursor: pointer; background-color: transparent; border: none; + padding-top: 6px !important; + padding-bottom: 6px !important; } + .dropdown-menu>li { > .umb-variant-switcher__name-wrapper { padding-top: 10px; @@ -290,7 +308,7 @@ button.umb-variant-switcher__toggle { .umb-variant-switcher__split-view { font-size: 12px; display: none; - padding: 20px 20px; + padding: 16px 20px; position: absolute; right: 0; top: 0; @@ -303,7 +321,6 @@ button.umb-variant-switcher__toggle { } } - .umb-variant-switcher__sub-variants { position: relative; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less index 25bfc2fce5..035bf02f91 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less @@ -106,7 +106,6 @@ height: auto; top: 50%; left: 50%; - transform: translate(-50%, 0); transform: translate(-50%, -50%); border-radius: @baseBorderRadius; } @@ -128,6 +127,7 @@ width: 400px; max-height: 100vh; box-sizing: border-box; + visibility: hidden; border-radius: @baseBorderRadius; &.umb-overlay--small { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree-item.less b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree-item.less index 4a483ce3f0..97caf66497 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree-item.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree-item.less @@ -17,8 +17,9 @@ .umb-tree-item__arrow { position: relative; margin-left: -16px; - width: 16px; - height: 16px; + margin-right: 4px; + width: 12px; + height: 12px; visibility: hidden; text-decoration: none; font-size: 12px; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less index 839e61c5f9..59d81eb3ea 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/tree/umb-tree.less @@ -15,6 +15,16 @@ text-decoration: none; } + .umb-tree-item__arrow { + visibility: hidden; + text-decoration: none; + font-size: 12px; + transition: color 120ms; + + &:hover { + color: @ui-option-type-hover; + } + } i.noSpr { display: inline-block; margin-top: 1px; @@ -75,8 +85,8 @@ body.touch .umb-tree { &:hover { background: @ui-option-hover; - color: @ui-option-type-hover; + a { color: @ui-option-type-hover; } @@ -85,11 +95,15 @@ body.touch .umb-tree { position: relative; width: auto; height: auto; - margin: 0 10px 0 auto; - padding: 9px 5px; + margin: 0 5px 0 auto; + padding: 7px 5px; overflow: visible; clip: auto; } + + .umb-button-ellipsis--hidden { + opacity: 1; + } .umb-tree-icon { color: @ui-option-type-hover; @@ -171,9 +185,9 @@ body.touch .umb-tree { display: flex; flex: 0 0 auto; justify-content: flex-end; - padding: 9px 5px; + padding: 7px 5px; text-align: center; - margin: 0 10px 0 auto; + margin: 0 5px 0 auto; cursor: pointer; border-radius: @baseBorderRadius; @@ -184,18 +198,20 @@ body.touch .umb-tree { display: inline-block; margin: 0 2px 0 0; background: @ui-active-type; - + &:last-child { margin: 0; } } + &:hover { background: rgba(255, 255, 255, .5); + i { background: @ui-active-type-hover; } } - + // NOTE - We're having to repeat ourselves here due to an .sr-only class appearing in umbraco/lib/font-awesome/css/font-awesome.min.css &.sr-only--hoverable:hover, &.sr-only--focusable:focus { @@ -203,9 +219,9 @@ body.touch .umb-tree { display: flex; flex: 0 0 auto; justify-content: flex-end; - padding: 9px 5px; + padding: 7px 5px; text-align: center; - margin: 0 10px 0 auto; + margin: 0 auto; cursor: pointer; border-radius: 3px; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less index 9a18bef2de..d79bbbde20 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-badge.less @@ -29,6 +29,11 @@ color: @white; } +.umb-badge--info { + background-color: @blue; + color: @white; +} + .umb-badge--warning { background-color: @orange; color: @white; @@ -39,6 +44,11 @@ color: @white; } +.umb-badge--dark { + background-color: @grayDark; + color: @white; +} + // Size .umb-badge--xxs { font-size: 11px; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-code-snippet.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-code-snippet.less index b372841910..96b4fc08c8 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-code-snippet.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-code-snippet.less @@ -18,6 +18,7 @@ justify-content: flex-start; flex-grow: 1; padding: 2px 10px; + text-transform: uppercase; } button { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less index f972633bf4..a6548123ac 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-confirm-action.less @@ -1,3 +1,8 @@ +//WRAPPER +.umb_confirm-action { + display: inline-block; +} + // OVERLAY .umb_confirm-action__overlay { position: absolute; @@ -13,19 +18,6 @@ left: 0; animation: fadeInUp 0.2s; flex-direction: column; - - .umb_confirm-action__overlay-action { - margin-bottom: 5px; - } - - .umb_confirm-action__overlay-action.-confirm { - order: 1; - } - - .umb_confirm-action__overlay-action.-cancel { - order: 2; - } - } .umb_confirm-action__overlay.-right { @@ -35,18 +27,6 @@ left: auto; animation: fadeInLeft 0.2s; flex-direction: row; - - .umb_confirm-action__overlay-action { - margin-left: 5px; - } - - .umb_confirm-action__overlay-action.-confirm { - order: 2; - } - - .umb_confirm-action__overlay-action.-cancel { - order: 1; - } } .umb_confirm-action__overlay.-bottom { @@ -56,18 +36,6 @@ left: 0; animation: fadeInDown 0.2s; flex-direction: column; - - .umb_confirm-action__overlay-action { - margin-top: 5px; - } - - .umb_confirm-action__overlay-action.-confirm { - order: 2; - } - - .umb_confirm-action__overlay-action.-cancel { - order: 1; - } } .umb_confirm-action__overlay.-left { @@ -77,55 +45,59 @@ left: -50px; animation: fadeInRight 0.2s; flex-direction: row; +} + +.umb_confirm-action__overlay { .umb_confirm-action__overlay-action { margin-right: 5px; + + &.-confirm { + order: 1; + } + + &.-cancel { + order: 2; + } } - .umb_confirm-action__overlay-action.-confirm { - order: 1; - } + // BUTTONS + .umb_confirm-action__overlay-action { + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + color: @white; + border-radius: 40px; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); + font-size: 18px; + cursor: pointer; + user-select: none; - .umb_confirm-action__overlay-action.-cancel { - order: 2; + &:hover { + text-decoration: none; + color: @white; + } + + // confirm button + &.-confirm { + background: @white; + color: @green !important; + + &:hover { + color: @green !important; + } + } + + // cancel button + &.-cancel { + background: @white; + color: @red !important; + + &:hover { + color: @red !important; + } + } } } - -// BUTTONS -.umb_confirm-action__overlay-action { - width: 20px; - height: 20px; - display: flex; - align-items: center; - justify-content: center; - color: @white; - border-radius: 40px; - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26); - font-size: 18px; - cursor: pointer; -} - -.umb_confirm-action__overlay-action:hover { - text-decoration: none; - color: @white; -} - -// confirm button -.umb_confirm-action__overlay-action.-confirm { - background: @white; - color: @green !important; -} - -.umb_confirm-action__overlay-action.-confirm:hover { - color: @green !important; -} - -// cancel button -.umb_confirm-action__overlay-action.-cancel { - background: @white; - color: @red !important; -} - -.umb_confirm-action__overlay-action.-cancel:hover { - color: @red !important; -} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-date-time-picker.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-date-time-picker.less index 5bcfdd1c71..b8084bc435 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-date-time-picker.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-date-time-picker.less @@ -3,23 +3,28 @@ box-shadow: 0 5px 10px 0 rgba(0,0,0,0.16); } -span.flatpickr-day { +.flatpickr-day { border-radius: @baseBorderRadius; border: none; &.today:not(.active) { border: 1px solid; } -} -span.flatpickr-day:hover { - background-color: @gray-10; -} + &:hover { + background-color: @gray-10; + } -span.flatpickr-day.selected { - background-color: @ui-selected; -} + &.selected, &.startRange, &.endRange { + background-color: @ui-selected-type !important; + border-color: @ui-selected-type !important; -span.flatpickr-day.selected:hover { - background-color: @ui-selected-hover; + &:hover { + background-color: @ui-selected-type-hover !important; + } + + &.startRange + .endRange:not(:nth-child(7n+1)) { + box-shadow: -10px 0 0 @ui-selected-type !important; + } + } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-editor-navigation-item.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-editor-navigation-item.less index 2fc705b11b..641e0dc7a7 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-editor-navigation-item.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-editor-navigation-item.less @@ -46,7 +46,7 @@ } &.is-active { - color: @ui-light-active-type; + color: @ui-light-active-type !important; &::before { opacity: 1; @@ -93,8 +93,8 @@ .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); } - &:focus-within &__anchor_dropdown, - &:hover &__anchor_dropdown { + &:focus-within > &__anchor_dropdown, + &:hover > &__anchor_dropdown { visibility: visible; opacity: 1; transition: opacity 20ms 0; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less index 8a24d948ac..cff9980483 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-form-check.less @@ -1,25 +1,18 @@ @checkboxWidth: 18px; @checkboxHeight: 18px; -label.umb-form-check--checkbox{ - margin:3px 0; -} .umb-form-check { display: flex; + align-items: center; position: relative; - padding-left: 0px; - margin: 0; - min-height: 22px; + padding-left: 0; + margin: 5px 0; + min-height: 20px; cursor: pointer !important; - .umb-form-check__symbol { - margin-top: 4px; - margin-right: 10px; - } .umb-form-check__info { - margin-left:20px; + margin-left: 30px; position: relative; - top: 3px; } @@ -84,7 +77,6 @@ label.umb-form-check--checkbox{ } .tabbing-active &.umb-form-check--radiobutton &__input:focus ~ .umb-form-check__state .umb-form-check__check { - //outline: 2px solid @inputBorderTabFocus; border: 2px solid @inputBorderTabFocus; margin: -1px; } @@ -102,11 +94,10 @@ label.umb-form-check--checkbox{ &__state { display: flex; - height: 18px; + height: 20px; + width: 20px; position: absolute; - margin-top: 2px; - top: 0; - left: -1px; + top: -1px; } &__check { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less index 26d61412ae..a8c428ba7a 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-grid.less @@ -751,9 +751,19 @@ margin-right: 5px; position: relative; cursor: pointer; - display:inline-block; + display: inline-block; } +.umb-grid .cell-tools, +.umb-grid .umb-control-tool { + .btn-icon { + padding: 0; + } +} + +.umb-grid .umb-control-tool .btn-icon { + color: @white; +} // Template @@ -1007,8 +1017,6 @@ display: block; } - - // Configuration specific styles // ------------------------- .umb-grid-configuration .umb-templates { 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 6eded29b8b..2590e0610a 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 @@ -347,23 +347,20 @@ input.umb-group-builder__group-title-input:disabled:hover { .umb-group-builder__property-actions { flex: 0 0 44px; display: flex; - align-items: center; + align-items: flex-start; justify-content: flex-end; } .umb-group-builder__property-action { - position: relative; margin: 5px 0; > button { border: none; - font-size: 18px; position: relative; cursor: pointer; color: @ui-icon; - margin: 0; padding: 5px 10px; width: auto; @@ -399,18 +396,21 @@ input.umb-group-builder__group-title-input:disabled:hover { padding: 0 4px; display: flex; border-radius: 3px; -} + align-items: center; -.umb-group-builder__property-tag:first-child { - margin-left: 0; -} + &:first-child { + margin-left: 0; + } -.umb-group-builder__property-tag.-white { - background-color: @white; + &.-white { + background-color: @white; + } } .umb-group-builder__property-tag-icon { margin-right: 3px; + display: flex; + align-items: center; } /* ---------- SORTABLE ---------- */ @@ -513,17 +513,14 @@ input.umb-group-builder__group-sort-value { display: flex; align-items: center; align-content: stretch; - min-height: 80px; - border: 1px solid @gray-9; color: @ui-action-discreet-type; border-radius: @baseBorderRadius; - } .editor-info { - flex: 1 0 auto; + flex: 1 1 auto; text-align: left; display: flex; align-items: center; @@ -537,6 +534,9 @@ input.umb-group-builder__group-sort-value { } .editor-icon-wrapper { + display: flex; + justify-content: center; + align-items: center; width: 60px; height: 60px; text-align: center; @@ -548,12 +548,12 @@ input.umb-group-builder__group-sort-value { font-size: 32px; } } - + .editor-details { flex: 1 1 auto; margin-top: 10px; margin-bottom: 10px; - + .editor-name { display: block; font-weight: bold; @@ -570,9 +570,9 @@ input.umb-group-builder__group-sort-value { width: 48px; height: 48px; font-size: 18px; - min-height: 80px; color: @ui-action-discreet-type; + &:hover { color: @ui-action-discreet-type-hover; background-color: @ui-action-discreet-hover; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-icon.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-icon.less new file mode 100644 index 0000000000..e3b0550d15 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-icon.less @@ -0,0 +1,9 @@ +.umb-icon { + &:before, &:after { + content: none !important; + } + + > i { + font-family: inherit; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-iconpicker.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-iconpicker.less index 98b2b1d72d..e23325a7d2 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-iconpicker.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-iconpicker.less @@ -26,6 +26,11 @@ padding: 15px 0; text-decoration: none; border-radius: 3px; + background: none; + background: none; + border: none; + cursor: pointer; + color: currentColor; } .umb-iconpicker-item button:hover, @@ -41,34 +46,41 @@ box-sizing: border-box; } +.umb-iconpicker-svg svg { + display: block; + width: 30px; + height: 30px; + fill: currentColor; +} + .umb-iconpicker-item button:active { background: @gray-10; } .umb-iconpicker-item i { + font-family: inherit; font-size: 30px; } - // Color swatch .button { - border: none; - color: @white; - padding: 5px; - text-align: center; - text-decoration: none; - display: inline-block; - margin: 5px; - border-radius: 3px; - } + border: none; + color: @white; + padding: 5px; + text-align: center; + text-decoration: none; + display: inline-block; + margin: 5px; + border-radius: 3px; +} - // Circle behind the checkmark - i.small.active{ - font-size: 14px; - display: inline-block; - width: 20px; - height: 20px; - border-radius: 50%; - background-color: rgba(0,0,0,.15); - float: right; - } +// Circle behind the checkmark +i.small.active{ + font-size: 14px; + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + background-color: rgba(0,0,0,.15); + float: right; +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-list.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-list.less index 44955e8f8e..57ba73305a 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-list.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-list.less @@ -40,7 +40,7 @@ a.umb-list-item:focus { } .umb-list-item__description--checkbox{ - margin: 0 0 0 26px; + margin: 0 0 0 30px; } .umb-list-checkbox { diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less index 8beff55b7c..56fa905310 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-logviewer.less @@ -78,19 +78,22 @@ padding-right: 160px; } - .icon-rate { + .save-search, + .filter-search { position: absolute; top: 0; - line-height: 32px; + display: flex; + align-items: center;; + height: 32px; + } + + .save-search { right: 140px; color: @yellow-d1; cursor: pointer; } - .icon-wrong { - position: absolute; - top: 0; - line-height: 32px; + .filter-search { right: 120px; color: @gray-7; cursor: pointer; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less index 5d6b7ad962..abd1bfd047 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less @@ -217,3 +217,19 @@ text-decoration: none; box-shadow: 0 1px 2px rgba(0,0,0,.2); } + +/*for the listview*/ + +.umb-media-grid__list-item.selected, .umb-media-grid__list-item.selected:hover, .umb-media-grid__list-item.selected:focus { + border: 2px solid #f5c1bc !important; +} + +.umb-media-grid__list-view .umb-table-cell.umb-table__name { + flex: 1 1 25%; + max-width: none; + white-space: normal; +} + +.umb-media-grid__list-view .umb-table-cell.umb-table__name .item-name { + white-space:normal; +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-list-view.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-list-view.less index 8cd08f5045..ecb1ad1904 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-list-view.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-mini-list-view.less @@ -44,6 +44,10 @@ color: @black; } +.umb-minilistview { + overflow: hidden; +} + /* Animations */ .umb-mini-list-view.ng-animate { transition: 120ms cubic-bezier(0.250, 0.250, 0.750, 0.750) all; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less index 30a32b8123..39eb7e92e4 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-multiple-textbox.less @@ -1,9 +1,11 @@ -.umb-multiple-textbox{ - &__confirm{ +.umb-multiple-textbox { + .umb-property-editor--limit-width(); + + &__confirm { position: relative; display: inline-block; - &-action{ + &-action { margin: -2px 0 0 0; padding: 2px; background: transparent; @@ -12,10 +14,6 @@ } } -.umb-multiple-textbox .icon-wrapper { - width: 50px; -} - .umb-multiple-textbox .textbox-wrapper { align-items: center; margin-bottom: 15px; @@ -30,15 +28,10 @@ } .umb-multiple-textbox .textbox-wrapper i.handle { - margin-left: 5px; + margin-left: 10px; cursor: move; } -.umb-multiple-textbox .textbox-wrapper a.remove { - margin-left: 5px; - text-decoration: none; -} - .umb-multiple-textbox .add-link { &:extend(.umb-node-preview-add); } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less index 0f2b1402dc..384d9b4ac1 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less @@ -210,7 +210,7 @@ .umb-nested-content__add-content.--disabled:hover { color: @gray-7; border-color: @gray-7; - cursor: default; + cursor: not-allowed; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less index b808e6574a..197a5eb176 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-packages.less @@ -59,15 +59,12 @@ .umb-package-link { display: block; - flex-wrap: wrap; - flex-direction: column; - justify-content: center; position: relative; box-sizing: border-box; height: 100%; width: 100%; border-radius: 3px; - border: 0 none; + border: 1px solid transparent; text-decoration: none !important; transition: border-color 100ms ease; background-color: @white; @@ -78,8 +75,6 @@ } } - - // Icon .umb-package-icon { display: flex; @@ -94,22 +89,20 @@ border-top-right-radius: 3px; border-top-left-radius: 3px; min-height: 60px; -} -.umb-package-icon img { - max-width: 70px; - width: 70px; - height: auto; + img { + max-width: 70px; + width: 70px; + height: auto; + } } - // Info .umb-package-info { padding: 15px; text-align: center; } - // Name .umb-package-name { font-size: 14px; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-pagination.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-pagination.less index 8d3d563cab..f44aa645c4 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-pagination.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-pagination.less @@ -1,3 +1,5 @@ -.umb-pagination ul { - box-shadow: none; -} \ No newline at end of file +.umb-pagination { + ul { + box-shadow: none; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less index 17c4bf1a55..f86b27af17 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-actions.less @@ -85,7 +85,7 @@ .umb-contextmenu { border-top-left-radius: 0; - margin-top:1px; + margin-top:-2px; } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less index 39b2f4002e..83774e2dae 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-property-file-upload.less @@ -14,6 +14,12 @@ color: @gray-8; } + &:focus-within { + .tabbing-active & { + box-shadow: 0 0 2px @ui-outline, inset 0 0 2px 1px @ui-outline; + } + } + i.icon { font-size: 55px; line-height: 70px @@ -26,4 +32,10 @@ width: 100%; } } + + .drag-over { + .umb-upload-button-big { + border-color: @gray-1; + } + } } diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-stylesheet.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-stylesheet.less index 38ceba2a59..36d9913d66 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-stylesheet.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-stylesheet.less @@ -41,6 +41,7 @@ textarea.umb-stylesheet-rule-styles { width: 300px; height: 100px; resize: none; + font-family: @monoFontFamily; } .umb-stylesheet-rule-preview { 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 202c488bb4..d0427cad0a 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 @@ -164,7 +164,7 @@ input.umb-table__input { } } -.umb-table-body__icon { +.umb-table-body .umb-table-body__icon { margin: 0 auto; font-size: 20px; line-height: 20px; @@ -173,7 +173,7 @@ input.umb-table__input { text-decoration: none; } -.umb-table-body__checkicon { +.umb-table-body .umb-table-body__icon.umb-table-body__checkicon { display: none; font-size: 18px; line-height: 20px; @@ -218,15 +218,15 @@ input.umb-table__input { } // Show checkmark when checked, hide file icon -.umb-table-row.-selected { - - .umb-table-body__fileicon { - display: none; - } - .umb-table-body__checkicon { - display: inline-block; - } - +.umb-table-body .umb-table-row.-selected { + .umb-table-body__icon { + &.umb-table-body__fileicon { + display: none; + } + &.umb-table-body__checkicon { + display: inline-block; + } + } } // Table Row Styles diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-tags-editor.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-tags-editor.less new file mode 100644 index 0000000000..9a80aa4ff3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-tags-editor.less @@ -0,0 +1,53 @@ +.umb-tags-editor { + border: @inputBorder solid 1px; + padding: 5px; + min-height: 54px; + font-size: 13px; + text-shadow: none; + box-sizing: border-box; + + .tag { + cursor: default; + margin: 10px; + padding: 10px 15px; + background: @blueExtraDark; + position: relative; + user-select: all; + + .umb_confirm-action { + + > .btn-icon { + color: @white; + padding: 0; + position: relative; + cursor: pointer; + padding-left: 2px; + font-size: 15px; + right: -5px; + bottom: -1px; + user-select: none; + } + + .umb_confirm-action__overlay.-left { + top: 8px; + left: auto; + right: 15px; + } + } + } + + input { + border: none; + background: @white; + } + + .twitter-typeahead { + margin: 10px; + margin-top: 16px; + vertical-align: top; + + input { + padding-left: 0; + } + } +} diff --git a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-preview.less b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-preview.less index f62f3afd37..d0dca54403 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-preview.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/users/umb-user-preview.less @@ -4,6 +4,11 @@ display: flex; box-sizing: border-box; border-bottom: 1px solid @gray-9; + flex-wrap: wrap; +} + +.umb-editor-wrapper .umb-user-preview { + .umb-property-editor--limit-width(); } .umb-user-preview:last-of-type { @@ -29,22 +34,26 @@ flex: 0 0 auto; display: flex; align-items: center; + margin-left: auto; } .umb-user-preview__action { + background: transparent; + padding: 0; + border: 0 none; margin-left: 5px; margin-right: 5px; font-size: 13px; font-weight: bold; - color: @gray-5; + color: @ui-action-type; } .umb-user-preview__action:hover { - color: @turquoise; + color: @ui-action-type-hover; text-decoration: none; opacity: 1; } .umb-user-preview__action--red:hover { color: @red; -} \ No newline at end of file +} diff --git a/src/Umbraco.Web.UI.Client/src/less/forms.less b/src/Umbraco.Web.UI.Client/src/less/forms.less index ffc0626981..ed5a2c0622 100644 --- a/src/Umbraco.Web.UI.Client/src/less/forms.less +++ b/src/Umbraco.Web.UI.Client/src/less/forms.less @@ -29,7 +29,7 @@ label.control-label, .control-label { } -.controls-row label{padding: 0 10px 0 10px; vertical-align: middle;} +.controls-row label:not(.umb-form-check){padding: 0 10px 0 10px; vertical-align: middle;} @@ -68,8 +68,9 @@ label.control-label, .control-label { .form-search .icon, .form-search .icon-search { position: absolute; z-index: 1; - top: 6px; + top: 50%; left: 6px; + transform: translateY(-50%); color: @gray-8; } @@ -113,6 +114,9 @@ label.control-label, .control-label { } } +.form-search .umb-search-field { + width: 100%; +} // GENERAL STYLES // -------------- diff --git a/src/Umbraco.Web.UI.Client/src/less/helveticons.less b/src/Umbraco.Web.UI.Client/src/less/helveticons.less index 82663270e9..a51f4e9f6f 100644 --- a/src/Umbraco.Web.UI.Client/src/less/helveticons.less +++ b/src/Umbraco.Web.UI.Client/src/less/helveticons.less @@ -8,35 +8,57 @@ font-style: normal; } +span[class^="icon-"], +span[class*=" icon-"] { + display: inline-block; + width: 1em; + height: 1em; + *margin-right: .3em; + + svg { + width: 100%; + height: 100%; + fill: currentColor; + } + + &.large{ + width: 32px; + height: 32px; + } + &.medium{ + width: 24px; + height: 24px; + } + &.small{ + width: 14px; + height: 14px; + } +} + [class^="icon-"], -[class*=" icon-"] { - font-family: icomoon; - font-weight: normal; - font-style: normal; - text-decoration: inherit; - -webkit-font-smoothing: antialiased; - *margin-right: .3em; +[class*=" icon-"], +button.icon-trash { + font-family: 'icomoon'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } [class^="icon-"]:before, -[class*=" icon-"]:before { - text-decoration: inherit; - display: inline-block; - speak: none; +[class*=" icon-"]:before, +button.icon-trash { + text-decoration: inherit; + display: inline-block; + speak: none; } -/* -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: 'icomoon'; - speak: none; - font-weight: normal; - font-style: normal; - display: inline-block; - text-decoration: inherit; - font-size: 14px; - -webkit-font-smoothing: antialiased; -}*/ - i.large{ font-size: 32px; } @@ -47,1834 +69,1838 @@ i.small{ font-size: 14px; } -.icon-zoom-out:before { +i.icon-zoom-out:before { content: "\e000"; } -.icon-truck:before { +i.icon-truck:before { content: "\e001"; } -.icon-zoom-in:before { +i.icon-zoom-in:before { content: "\e002"; } -.icon-zip:before { +i.icon-zip:before { content: "\e003"; } -.icon-axis-rotation:before { +i.icon-axis-rotation:before { content: "\e004"; } -.icon-yen-bag:before { +i.icon-yen-bag:before { content: "\e005"; } -.icon-axis-rotation-2:before { +i.icon-axis-rotation-2:before { content: "\e006"; } -.icon-axis-rotation-3:before { +i.icon-axis-rotation-3:before { content: "\e007"; } -.icon-wrench:before { +i.icon-wrench:before { content: "\e008"; } -.icon-wine-glass:before { +i.icon-wine-glass:before { content: "\e009"; } -.icon-wrong:before { +i.icon-wrong:before { content: "\e00a"; } -.icon-windows:before { +i.icon-windows:before { content: "\e00b"; } -.icon-window-sizes:before { +i.icon-window-sizes:before { content: "\e00c"; } -.icon-window-popin:before { +i.icon-window-popin:before { content: "\e00d"; } -.icon-wifi:before { +i.icon-wifi:before { content: "\e00e"; } -.icon-width:before { +i.icon-width:before { content: "\e00f"; } -.icon-weight:before { +i.icon-weight:before { content: "\e010"; } -.icon-war:before { +i.icon-war:before { content: "\e011"; } -.icon-wand:before { +i.icon-wand:before { content: "\e012"; } -.icon-wallet:before { +i.icon-wallet:before { content: "\e013"; } -.icon-wall-plug:before { +i.icon-wall-plug:before { content: "\e014"; } -.icon-voice:before { +i.icon-voice:before { content: "\e016"; } -.icon-video:before { +i.icon-video:before { content: "\e017"; } -.icon-vcard:before { +i.icon-vcard:before { content: "\e018"; } -.icon-utilities:before { +i.icon-utilities:before { content: "\e019"; } -.icon-users:before { +i.icon-users:before { content: "\e01a"; } -.icon-users-alt:before { +i.icon-users-alt:before { content: "\e01b"; } -.icon-user:before { +i.icon-user:before { content: "\e01c"; } -.icon-user-glasses:before { +i.icon-user-glasses:before { content: "\e01d"; } -.icon-user-females:before { +i.icon-user-females:before { content: "\e01e"; } -.icon-user-females-alt:before { +i.icon-user-females-alt:before { content: "\e01f"; } -.icon-user-female:before { +i.icon-user-female:before { content: "\e020"; } -.icon-usb:before { +i.icon-usb:before { content: "\e021"; } -.icon-usb-connector:before { +i.icon-usb-connector:before { content: "\e022"; } -.icon-unlocked:before { +i.icon-unlocked:before { content: "\e023"; } -.icon-universal:before { +i.icon-universal:before { content: "\e024"; } -.icon-undo:before { +i.icon-undo:before { content: "\e025"; } -.icon-umbrella:before { +i.icon-umbrella:before { content: "\e026"; } -.icon-umb-deploy:before { +i.icon-umb-deploy:before { content: "\e027"; } -.icon-umb-contour:before, .traycontour:before, { +i.icon-umb-contour:before, .traycontour:before { content: "\e028"; } -.icon-umb-settings:before, .traysettings:before, { +i.icon-umb-settings:before, .traysettings:before { content: "\e029"; } -.icon-umb-users:before, .trayuser:before, .trayusers:before{ +i.icon-umb-users:before, .trayuser:before, .trayusers:before{ content: "\e02a"; } -.icon-umb-media:before, .traymedia:before, { +i.icon-umb-media:before, .traymedia:before { content: "\e02b"; } -.icon-umb-content:before, .traycontent:before{ +i.icon-umb-content:before, .traycontent:before{ content: "\e02c"; } -.icon-umb-developer:before, .traydeveloper:before, { +i.icon-umb-developer:before, .traydeveloper:before { content: "\e02d"; } -.icon-umb-members:before, .traymember:before { +i.icon-umb-members:before, .traymember:before { content: "\e015"; } -.icon-umb-translation:before, .traytranslation:before { +i.icon-umb-translation:before, .traytranslation:before { content: "\e1fd"; } -.icon-tv:before { +i.icon-tv:before { content: "\e02e"; } -.icon-tv-old:before { +i.icon-tv-old:before { content: "\e02f"; } -.icon-trophy:before { +i.icon-trophy:before { content: "\e030"; } -.icon-tree:before { +i.icon-tree:before { content: "\e031"; } -.icon-trash:before { +i.icon-trash:before, +button.icon-trash:before { content: "\e032"; } -.icon-trash-alt:before { +i.icon-trash-alt:before, +button.icon-trash-alt:before { content: "\e033"; } -.icon-trash-alt-2:before { +i.icon-trash-alt-2:before, +button.icon-trash-alt-2:before { content: "\e034"; } -.icon-train:before { +i.icon-train:before { content: "\e035"; } -.icon-trafic:before, -.icon-traffic:before { +i.icon-trafic:before, +i.icon-traffic:before { content: "\e036"; } -.icon-traffic-alt:before { +i.icon-traffic-alt:before { content: "\e037"; } -.icon-top:before { +i.icon-top:before { content: "\e038"; } -.icon-tools:before { +i.icon-tools:before { content: "\e039"; } -.icon-timer:before { +i.icon-timer:before { content: "\e03a"; } -.icon-time:before { +i.icon-time:before { content: "\e03b"; } -.icon-t-shirt:before { +i.icon-t-shirt:before { content: "\e03c"; } -.icon-tab-key:before { +i.icon-tab-key:before { content: "\e03d"; } -.icon-tab:before { +i.icon-tab:before { content: "\e03e"; } -.icon-tactics:before { +i.icon-tactics:before { content: "\e03f"; } -.icon-tag:before { +i.icon-tag:before { content: "\e040"; } -.icon-tags:before { +i.icon-tags:before { content: "\e041"; } -.icon-takeaway-cup:before { +i.icon-takeaway-cup:before { content: "\e042"; } -.icon-target:before { +i.icon-target:before { content: "\e043"; } -.icon-temperature-alt:before, -.icon-temperatrure-alt:before { +i.icon-temperature-alt:before, +i.icon-temperatrure-alt:before { content: "\e044"; } -.icon-temperature:before { +i.icon-temperature:before { content: "\e045"; } -.icon-terminal:before { +i.icon-terminal:before { content: "\e046"; } -.icon-theater:before { +i.icon-theater:before { content: "\e047"; } -.icon-thief:before, -.icon-theif:before { +i.icon-thief:before, +i.icon-theif:before { content: "\e048"; } -.icon-thought-bubble:before { +i.icon-thought-bubble:before { content: "\e049"; } -.icon-thumb-down:before { +i.icon-thumb-down:before { content: "\e04a"; } -.icon-thumb-up:before { +i.icon-thumb-up:before { content: "\e04b"; } -.icon-thumbnail-list:before { +i.icon-thumbnail-list:before { content: "\e04c"; } -.icon-thumbnails-small:before { +i.icon-thumbnails-small:before { content: "\e04d"; } -.icon-thumbnails:before { +i.icon-thumbnails:before { content: "\e04e"; } -.icon-ticket:before { +i.icon-ticket:before { content: "\e04f"; } -.icon-sync:before { +i.icon-sync:before { content: "\e050"; } -.icon-sweatshirt:before { +i.icon-sweatshirt:before { content: "\e051"; } -.icon-sunny:before { +i.icon-sunny:before { content: "\e052"; } -.icon-stream:before { +i.icon-stream:before { content: "\e053"; } -.icon-store:before { +i.icon-store:before { content: "\e054"; } -.icon-stop:before { +i.icon-stop:before { content: "\e055"; } -.icon-stop-hand:before { +i.icon-stop-hand:before { content: "\e056"; } -.icon-stop-alt:before { +i.icon-stop-alt:before { content: "\e057"; } -.icon-stamp:before { +i.icon-stamp:before { content: "\e058"; } -.icon-stacked-disks:before { +i.icon-stacked-disks:before { content: "\e059"; } -.icon-ssd:before { +i.icon-ssd:before { content: "\e05a"; } -.icon-squiggly-line:before { +i.icon-squiggly-line:before { content: "\e05b"; } -.icon-sprout:before { +i.icon-sprout:before { content: "\e05c"; } -.icon-split:before { +i.icon-split:before { content: "\e05d"; } -.icon-split-alt:before { +i.icon-split-alt:before { content: "\e05e"; } -.icon-speed-gauge:before { +i.icon-speed-gauge:before { content: "\e05f"; } -.icon-speaker:before { +i.icon-speaker:before { content: "\e060"; } -.icon-sound:before { +i.icon-sound:before { content: "\e061"; } -.icon-spades:before { +i.icon-spades:before { content: "\e062"; } -.icon-sound-waves:before { +i.icon-sound-waves:before { content: "\e063"; } -.icon-shipping-box:before { +i.icon-shipping-box:before { content: "\e064"; } -.icon-shipping:before { +i.icon-shipping:before { content: "\e065"; } -.icon-shoe:before { +i.icon-shoe:before { content: "\e066"; } -.icon-shopping-basket-alt-2:before { +i.icon-shopping-basket-alt-2:before { content: "\e067"; } -.icon-shopping-basket:before { +i.icon-shopping-basket:before { content: "\e068"; } -.icon-shopping-basket-alt:before { +i.icon-shopping-basket-alt:before { content: "\e069"; } -.icon-shorts:before { +i.icon-shorts:before { content: "\e06a"; } -.icon-shuffle:before { +i.icon-shuffle:before { content: "\e06b"; } -.icon-science:before, -.icon-sience:before { +i.icon-science:before, +i.icon-sience:before { content: "\e06c"; } -.icon-simcard:before { +i.icon-simcard:before { content: "\e06d"; } -.icon-single-note:before { +i.icon-single-note:before { content: "\e06e"; } -.icon-sitemap:before { +i.icon-sitemap:before { content: "\e06f"; } -.icon-sleep:before { +i.icon-sleep:before { content: "\e070"; } -.icon-slideshow:before { +i.icon-slideshow:before { content: "\e071"; } -.icon-smiley-inverted:before { +i.icon-smiley-inverted:before { content: "\e072"; } -.icon-smiley:before { +i.icon-smiley:before { content: "\e073"; } -.icon-snow:before { +i.icon-snow:before { content: "\e074"; } -.icon-sound-low:before { +i.icon-sound-low:before { content: "\e075"; } -.icon-sound-medium:before { +i.icon-sound-medium:before { content: "\e076"; } -.icon-sound-off:before { +i.icon-sound-off:before { content: "\e077"; } -.icon-shift:before { +i.icon-shift:before { content: "\e078"; } -.icon-shield:before { +i.icon-shield:before { content: "\e079"; } -.icon-sharing-iphone:before { +i.icon-sharing-iphone:before { content: "\e07a"; } -.icon-share:before { +i.icon-share:before { content: "\e07b"; } -.icon-share-alt:before { +i.icon-share-alt:before { content: "\e07c"; } -.icon-share-alt-2:before { +i.icon-share-alt-2:before { content: "\e07d"; } -.icon-settings:before { +i.icon-settings:before, +button.icon-settings:before { content: "\e07e"; } -.icon-settings-alt:before { +i.icon-settings-alt:before { content: "\e07f"; } -.icon-settings-alt-2:before { +i.icon-settings-alt-2:before { content: "\e080"; } -.icon-server:before { +i.icon-server:before { content: "\e081"; } -.icon-server-alt:before { +i.icon-server-alt:before { content: "\e082"; } -.icon-sensor:before { +i.icon-sensor:before { content: "\e083"; } -.icon-security-camera:before { +i.icon-security-camera:before { content: "\e084"; } -.icon-search:before { +i.icon-search:before { content: "\e085"; } -.icon-scull:before { +i.icon-scull:before { content: "\e086"; } -.icon-script:before { +i.icon-script:before { content: "\e087"; } -.icon-script-alt:before { +i.icon-script-alt:before { content: "\e088"; } -.icon-screensharing:before { +i.icon-screensharing:before { content: "\e089"; } -.icon-school:before { +i.icon-school:before { content: "\e08a"; } -.icon-scan:before { +i.icon-scan:before { content: "\e08b"; } -.icon-refresh:before { +i.icon-refresh:before { content: "\e08c"; } -.icon-remote:before { +i.icon-remote:before { content: "\e08d"; } -.icon-remove:before { +i.icon-remove:before { content: "\e08e"; } -.icon-repeat-one:before { +i.icon-repeat-one:before { content: "\e08f"; } -.icon-repeat:before { +i.icon-repeat:before { content: "\e090"; } -.icon-resize:before { +i.icon-resize:before { content: "\e091"; } -.icon-reply-arrow:before { +i.icon-reply-arrow:before { content: "\e092"; } -.icon-return-to-top:before { +i.icon-return-to-top:before { content: "\e093"; } -.icon-right-double-arrow:before { +i.icon-right-double-arrow:before { content: "\e094"; } -.icon-road:before { +i.icon-road:before { content: "\e095"; } -.icon-roadsign:before { +i.icon-roadsign:before { content: "\e096"; } -.icon-rocket:before { +i.icon-rocket:before { content: "\e097"; } -.icon-rss:before { +i.icon-rss:before { content: "\e098"; } -.icon-ruler-alt:before { +i.icon-ruler-alt:before { content: "\e099"; } -.icon-ruler:before { +i.icon-ruler:before { content: "\e09a"; } -.icon-sandbox-toys:before { +i.icon-sandbox-toys:before { content: "\e09b"; } -.icon-satellite-dish:before { +i.icon-satellite-dish:before { content: "\e09c"; } -.icon-save:before { +i.icon-save:before { content: "\e09d"; } -.icon-safedial:before { +i.icon-safedial:before { content: "\e09e"; } -.icon-safe:before { +i.icon-safe:before { content: "\e09f"; } -.icon-redo:before { +i.icon-redo:before { content: "\e0a0"; } -.icon-printer-alt:before { +i.icon-printer-alt:before { content: "\e0a1"; } -.icon-planet:before { +i.icon-planet:before { content: "\e0a2"; } -.icon-paste-in:before { +i.icon-paste-in:before { content: "\e0a3"; } -.icon-os-x:before { +i.icon-os-x:before { content: "\e0a4"; } -.icon-navigation-left:before { +i.icon-navigation-left:before { content: "\e0a5"; } -.icon-message:before { +i.icon-message:before { content: "\e0a6"; } -.icon-lock:before { +i.icon-lock:before { content: "\e0a7"; } -.icon-layers-alt:before { +i.icon-layers-alt:before { content: "\e0a8"; } -.icon-record:before { +i.icon-record:before { content: "\e0a9"; } -.icon-print:before { +i.icon-print:before { content: "\e0aa"; } -.icon-plane:before { +i.icon-plane:before { content: "\e0ab"; } -.icon-partly-cloudy:before { +i.icon-partly-cloudy:before { content: "\e0ac"; } -.icon-ordered-list:before { +i.icon-ordered-list:before { content: "\e0ad"; } -.icon-navigation-last:before { +i.icon-navigation-last:before { content: "\e0ae"; } -.icon-message-unopened:before { +i.icon-message-unopened:before { content: "\e0af"; } -.icon-location-nearby:before { +i.icon-location-nearby:before { content: "\e0b0"; } -.icon-laptop:before { +i.icon-laptop:before { content: "\e0b1"; } -.icon-reception:before { +i.icon-reception:before { content: "\e0b2"; } -.icon-price-yen:before { +i.icon-price-yen:before { content: "\e0b3"; } -.icon-piracy:before { +i.icon-piracy:before { content: "\e0b4"; } -.icon-parental-control:before { +i.icon-parental-control:before { content: "\e0b5"; } -.icon-operator:before { +i.icon-operator:before { content: "\e0b6"; } -.icon-navigation-horizontal:before { +i.icon-navigation-horizontal:before { content: "\e0b7"; } -.icon-message-open:before { +i.icon-message-open:before { content: "\e0b8"; } -.icon-lab:before { +i.icon-lab:before { content: "\e0b9"; } -.icon-location-near-me:before { +i.icon-location-near-me:before { content: "\e0ba"; } -.icon-receipt-yen:before { +i.icon-receipt-yen:before { content: "\e0bb"; } -.icon-price-pound:before { +i.icon-price-pound:before { content: "\e0bc"; } -.icon-pin-location:before { +i.icon-pin-location:before { content: "\e0bd"; } -.icon-parachute-drop:before { +i.icon-parachute-drop:before { content: "\e0be"; } -.icon-old-phone:before { +i.icon-old-phone:before { content: "\e0bf"; } -.icon-merge:before { +i.icon-merge:before { content: "\e0c0"; } -.icon-navigation-first:before { +i.icon-navigation-first:before { content: "\e0c1"; } -.icon-locate:before { +i.icon-locate:before { content: "\e0c2"; } -.icon-keyhole:before { +i.icon-keyhole:before { content: "\e0c3"; } -.icon-receipt-pound:before { +i.icon-receipt-pound:before { content: "\e0c4"; } -.icon-price-euro:before { +i.icon-price-euro:before { content: "\e0c5"; } -.icon-piggy-bank:before { +i.icon-piggy-bank:before { content: "\e0c6"; } -.icon-paper-plane:before { +i.icon-paper-plane:before { content: "\e0c7"; } -.icon-old-key:before { +i.icon-old-key:before { content: "\e0c8"; } -.icon-navigation-down:before { +i.icon-navigation-down:before { content: "\e0c9"; } -.icon-megaphone:before { +i.icon-megaphone:before { content: "\e0ca"; } -.icon-loading:before { +i.icon-loading:before { content: "\e0cb"; } -.icon-keychain:before { +i.icon-keychain:before { content: "\e0cc"; } -.icon-receipt-euro:before { +i.icon-receipt-euro:before { content: "\e0cd"; } -.icon-price-dollar:before { +i.icon-price-dollar:before { content: "\e0ce"; } -.icon-pie-chart:before { +i.icon-pie-chart:before { content: "\e0cf"; } -.icon-paper-plane-alt:before { +i.icon-paper-plane-alt:before { content: "\e0d0"; } -.icon-notepad:before { +i.icon-notepad:before { content: "\e0d1"; } -.icon-navigation-bottom:before { +i.icon-navigation-bottom:before { content: "\e0d2"; } -.icon-meeting:before { +i.icon-meeting:before { content: "\e0d3"; } -.icon-keyboard:before { +i.icon-keyboard:before { content: "\e0d4"; } -.icon-load:before { +i.icon-load:before { content: "\e0d5"; } -.icon-receipt-dollar:before { +i.icon-receipt-dollar:before { content: "\e0d6"; } -.icon-previous:before { +i.icon-previous:before { content: "\e0d7"; } -.icon-pictures:before { +i.icon-pictures:before { content: "\e0d8"; } -.icon-notepad-alt:before { +i.icon-notepad-alt:before { content: "\e0d9"; } -.icon-paper-bag:before { +i.icon-paper-bag:before { content: "\e0da"; } -.icon-name-badge:before { +i.icon-badge:before { content: "\e0db"; } -.icon-medicine:before { +i.icon-medicine:before { content: "\e0dc"; } -.icon-list:before { +i.icon-list:before { content: "\e0dd"; } -.icon-key:before { +i.icon-key:before { content: "\e0de"; } -.icon-receipt-alt:before { +i.icon-receipt-alt:before { content: "\e0df"; } -.icon-previous-media:before { +i.icon-previous-media:before { content: "\e0e0"; } -.icon-pictures-alt:before { +i.icon-pictures-alt:before { content: "\e0e1"; } -.icon-pants:before { +i.icon-pants:before { content: "\e0e2"; } -.icon-nodes:before { +i.icon-nodes:before { content: "\e0e3"; } -.icon-music:before { +i.icon-music:before { content: "\e0e4"; } -.icon-readonly:before { +i.icon-readonly:before { content: "\e0e5"; } -.icon-presentation:before { +i.icon-presentation:before { content: "\e0e6"; } -.icon-pictures-alt-2:before { +i.icon-pictures-alt-2:before { content: "\e0e7"; } -.icon-panel-close:before, -.icon-pannel-close:before { +i.icon-panel-close:before, +i.icon-pannel-close:before { content: "\e0e8"; } -.icon-next:before { +i.icon-next:before { content: "\e0e9"; } -.icon-multiple-windows:before { +i.icon-multiple-windows:before { content: "\e0ea"; } -.icon-medical-emergency:before { +i.icon-medical-emergency:before { content: "\e0eb"; } -.icon-medal:before { +i.icon-medal:before { content: "\e0ec"; } -.icon-link:before { +i.icon-link:before { content: "\e0ed"; } -.icon-linux-tux:before { +i.icon-linux-tux:before { content: "\e0ee"; } -.icon-junk:before { +i.icon-junk:before { content: "\e0ef"; } -.icon-item-arrangement:before { +i.icon-item-arrangement:before { content: "\e0f0"; } -.icon-iphone:before { +i.icon-iphone:before { content: "\e0f1"; } -.icon-lightning:before { +i.icon-lightning:before { content: "\e0f2"; } -.icon-map:before { +i.icon-map:before { content: "\e0f3"; } -.icon-multiple-credit-cards:before { +i.icon-multiple-credit-cards:before { content: "\e0f4"; } -.icon-next-media:before { +i.icon-next-media:before { content: "\e0f5"; } -.icon-panel-show:before { +i.icon-panel-show:before { content: "\e0f6"; } -.icon-picture:before { +i.icon-picture:before { content: "\e0f7"; } -.icon-power:before { +i.icon-power:before { content: "\e0f8"; } -.icon-re-post:before { +i.icon-re-post:before { content: "\e0f9"; } -.icon-rate:before { +i.icon-rate:before { content: "\e0fa"; } -.icon-rain:before { +i.icon-rain:before { content: "\e0fb"; } -.icon-radio:before { +i.icon-radio:before { content: "\e0fc"; } -.icon-radio-receiver:before { +i.icon-radio-receiver:before { content: "\e0fd"; } -.icon-radio-alt:before { +i.icon-radio-alt:before { content: "\e0fe"; } -.icon-quote:before { +i.icon-quote:before { content: "\e0ff"; } -.icon-qr-code:before { +i.icon-qr-code:before { content: "\e100"; } -.icon-pushpin:before { +i.icon-pushpin:before { content: "\e101"; } -.icon-pulse:before { +i.icon-pulse:before { content: "\e102"; } -.icon-projector:before { +i.icon-projector:before { content: "\e103"; } -.icon-play:before { +i.icon-play:before { content: "\e104"; } -.icon-playing-cards:before { +i.icon-playing-cards:before { content: "\e105"; } -.icon-playlist:before { +i.icon-playlist:before { content: "\e106"; } -.icon-plugin:before { +i.icon-plugin:before { content: "\e107"; } -.icon-podcast:before { +i.icon-podcast:before { content: "\e108"; } -.icon-poker-chip:before { +i.icon-poker-chip:before { content: "\e109"; } -.icon-poll:before { +i.icon-poll:before { content: "\e10a"; } -.icon-post-it:before { +i.icon-post-it:before { content: "\e10b"; } -.icon-pound-bag:before { +i.icon-pound-bag:before { content: "\e10c"; } -.icon-power-outlet:before { +i.icon-power-outlet:before { content: "\e10d"; } -.icon-photo-album:before { +i.icon-photo-album:before { content: "\e10e"; } -.icon-phone:before { +i.icon-phone:before { content: "\e10f"; } -.icon-phone-ring:before { +i.icon-phone-ring:before { content: "\e110"; } -.icon-people:before { +i.icon-people:before { content: "\e111"; } -.icon-people-female:before { +i.icon-people-female:before { content: "\e112"; } -.icon-people-alt:before { +i.icon-people-alt:before { content: "\e113"; } -.icon-people-alt-2:before { +i.icon-people-alt-2:before { content: "\e114"; } -.icon-pc:before { +i.icon-pc:before { content: "\e115"; } -.icon-pause:before { +i.icon-pause:before { content: "\e116"; } -.icon-path:before { +i.icon-path:before { content: "\e117"; } -.icon-out:before { +i.icon-out:before { content: "\e118"; } -.icon-outbox:before { +i.icon-outbox:before { content: "\e119"; } -.icon-outdent:before { +i.icon-outdent:before { content: "\e11a"; } -.icon-page-add:before { +i.icon-page-add:before { content: "\e11b"; } -.icon-page-down:before { +i.icon-page-down:before { content: "\e11c"; } -.icon-page-remove:before { +i.icon-page-remove:before { content: "\e11d"; } -.icon-page-restricted:before { +i.icon-page-restricted:before { content: "\e11e"; } -.icon-page-up:before { +i.icon-page-up:before { content: "\e11f"; } -.icon-paint-roller:before { +i.icon-paint-roller:before { content: "\e120"; } -.icon-palette:before { +i.icon-palette:before { content: "\e121"; } -.icon-newspaper:before { +i.icon-newspaper:before { content: "\e122"; } -.icon-newspaper-alt:before { +i.icon-newspaper-alt:before { content: "\e123"; } -.icon-network-alt:before { +i.icon-network-alt:before { content: "\e124"; } -.icon-navigational-arrow:before { +i.icon-navigational-arrow:before { content: "\e125"; } -.icon-navigation:before { +i.icon-navigation:before { content: "\e126"; } -.icon-navigation-vertical:before { +i.icon-navigation-vertical:before { content: "\e127"; } -.icon-navigation-up:before { +i.icon-navigation-up:before { content: "\e128"; } -.icon-navigation-top:before { +i.icon-navigation-top:before { content: "\e129"; } -.icon-navigation-road:before { +i.icon-navigation-road:before { content: "\e12a"; } -.icon-navigation-right:before { +i.icon-navigation-right:before { content: "\e12b"; } -.icon-microscope:before { +i.icon-microscope:before { content: "\e12c"; } -.icon-mindmap:before { +i.icon-mindmap:before { content: "\e12d"; } -.icon-molecular-network:before { +i.icon-molecular-network:before { content: "\e12e"; } -.icon-molecular:before { +i.icon-molecular:before { content: "\e12f"; } -.icon-mountain:before { +i.icon-mountain:before { content: "\e130"; } -.icon-mouse-cursor:before { +i.icon-mouse-cursor:before { content: "\e131"; } -.icon-mouse:before { +i.icon-mouse:before { content: "\e132"; } -.icon-movie-alt:before { +i.icon-movie-alt:before { content: "\e133"; } -.icon-map-marker:before { +i.icon-map-marker:before { content: "\e134"; } -.icon-movie:before { +i.icon-movie:before { content: "\e135"; } -.icon-map-location:before { +i.icon-map-location:before { content: "\e136"; } -.icon-map-alt:before { +i.icon-map-alt:before { content: "\e137"; } -.icon-male-symbol:before { +i.icon-male-symbol:before { content: "\e138"; } -.icon-male-and-female:before { +i.icon-male-and-female:before { content: "\e139"; } -.icon-mailbox:before { +i.icon-mailbox:before { content: "\e13a"; } -.icon-magnet:before { +i.icon-magnet:before { content: "\e13b"; } -.icon-loupe:before { +i.icon-loupe:before { content: "\e13c"; } -.icon-mobile:before { +i.icon-mobile:before { content: "\e13d"; } -.icon-logout:before { +i.icon-logout:before { content: "\e13e"; } -.icon-log-out:before { +i.icon-log-out:before { content: "\e13f"; } -.icon-layers:before { +i.icon-layers:before { content: "\e140"; } -.icon-left-double-arrow:before { +i.icon-left-double-arrow:before { content: "\e141"; } -.icon-layout:before { +i.icon-layout:before { content: "\e142"; } -.icon-legal:before { +i.icon-legal:before { content: "\e143"; } -.icon-lense:before { +i.icon-lense:before { content: "\e144"; } -.icon-library:before { +i.icon-library:before { content: "\e145"; } -.icon-light-down:before { +i.icon-light-down:before { content: "\e146"; } -.icon-light-up:before { +i.icon-light-up:before { content: "\e147"; } -.icon-lightbulb-active:before { +i.icon-lightbulb-active:before { content: "\e148"; } -.icon-lightbulb:before { +i.icon-lightbulb:before { content: "\e149"; } -.icon-ipad:before { +i.icon-ipad:before { content: "\e14a"; } -.icon-invoice:before { +i.icon-invoice:before { content: "\e14b"; } -.icon-info:before { +i.icon-info:before { content: "\e14c"; } -.icon-infinity:before { +i.icon-infinity:before { content: "\e14d"; } -.icon-indent:before { +i.icon-indent:before { content: "\e14e"; } -.icon-inbox:before { +i.icon-inbox:before { content: "\e14f"; } -.icon-inbox-full:before { +i.icon-inbox-full:before { content: "\e150"; } -.icon-inactive-line:before { +i.icon-inactive-line:before { content: "\e151"; } -.icon-imac:before { +i.icon-imac:before { content: "\e152"; } -.icon-hourglass:before { +i.icon-hourglass:before { content: "\e153"; } -.icon-home:before { +i.icon-home:before { content: "\e154"; } -.icon-grid:before { +i.icon-grid:before { content: "\e155"; } -.icon-food:before { +i.icon-food:before { content: "\e156"; } -.icon-favorite:before { +i.icon-favorite:before { content: "\e157"; } -.icon-door-open-alt:before { +i.icon-door-open-alt:before { content: "\e158"; } -.icon-diagnostics:before { +i.icon-diagnostics:before { content: "\e159"; } -.icon-contrast:before { +i.icon-contrast:before { content: "\e15a"; } -.icon-coins-dollar-alt:before { +i.icon-coins-dollar-alt:before { content: "\e15b"; } -.icon-circle-dotted-active:before { +i.icon-circle-dotted-active:before { content: "\e15c"; } -.icon-cinema:before { +i.icon-cinema:before { content: "\e15d"; } -.icon-chip:before { +i.icon-chip:before { content: "\e15e"; } -.icon-chip-alt:before { +i.icon-chip-alt:before { content: "\e15f"; } -.icon-chess:before { +i.icon-chess:before { content: "\e160"; } -.icon-checkbox:before { +i.icon-checkbox:before { content: "\e161"; } -.icon-checkbox-empty:before { +i.icon-checkbox-empty:before { content: "\e162"; } -.icon-checkbox-dotted:before { +i.icon-checkbox-dotted:before { content: "\e163"; } -.icon-checkbox-dotted-active:before { +i.icon-checkbox-dotted-active:before { content: "\e164"; } -.icon-check:before { +i.icon-check:before { content: "\e165"; } -.icon-chat:before { +i.icon-chat:before { content: "\e166"; } -.icon-chat-active:before { +i.icon-chat-active:before { content: "\e167"; } -.icon-chart:before { +i.icon-chart:before { content: "\e168"; } -.icon-chart-curve:before { +i.icon-chart-curve:before { content: "\e169"; } -.icon-certificate:before { +i.icon-certificate:before { content: "\e16a"; } -.icon-categories:before { +i.icon-categories:before { content: "\e16b"; } -.icon-cash-register:before { +i.icon-cash-register:before { content: "\e16c"; } -.icon-car:before { +i.icon-car:before { content: "\e16d"; } -.icon-caps-lock:before { +i.icon-caps-lock:before { content: "\e16e"; } -.icon-candy:before { +i.icon-candy:before { content: "\e16f"; } -.icon-circle-dotted:before { +i.icon-circle-dotted:before { content: "\e170"; } -.icon-circuits:before { +i.icon-circuits:before { content: "\e171"; } -.icon-circus:before { +i.icon-circus:before { content: "\e172"; } -.icon-client:before { +i.icon-client:before { content: "\e173"; } -.icon-clothes-hanger:before { +i.icon-clothes-hanger:before { content: "\e174"; } -.icon-cloud-drive:before { +i.icon-cloud-drive:before { content: "\e175"; } -.icon-cloud-upload:before { +i.icon-cloud-upload:before { content: "\e176"; } -.icon-cloud:before { +i.icon-cloud:before { content: "\e177"; } -.icon-cloudy:before { +i.icon-cloudy:before { content: "\e178"; } -.icon-clubs:before { +i.icon-clubs:before { content: "\e179"; } -.icon-cocktail:before { +i.icon-cocktail:before { content: "\e17a"; } -.icon-code:before { +i.icon-code:before { content: "\e17b"; } -.icon-coffee:before { +i.icon-coffee:before { content: "\e17c"; } -.icon-coin-dollar:before { +i.icon-coin-dollar:before { content: "\e17d"; } -.icon-coin-pound:before { +i.icon-coin-pound:before { content: "\e17e"; } -.icon-coin-yen:before { +i.icon-coin-yen:before { content: "\e17f"; } -.icon-coin:before { +i.icon-coin:before { content: "\e180"; } -.icon-coins-alt:before { +i.icon-coins-alt:before { content: "\e181"; } -.icon-console:before { +i.icon-console:before { content: "\e182"; } -.icon-connection:before { +i.icon-connection:before { content: "\e183"; } -.icon-compress:before { +i.icon-compress:before { content: "\e184"; } -.icon-company:before { +i.icon-company:before { content: "\e185"; } -.icon-command:before { +i.icon-command:before { content: "\e186"; } -.icon-coin-euro:before { +i.icon-coin-euro:before { content: "\e187"; } -.icon-combination-lock:before { +i.icon-combination-lock:before { content: "\e188"; } -.icon-combination-lock-open:before { +i.icon-combination-lock-open:before { content: "\e189"; } -.icon-comb:before { +i.icon-comb:before { content: "\e18a"; } -.icon-columns:before { +i.icon-columns:before { content: "\e18b"; } -.icon-colorpicker:before { +i.icon-colorpicker:before { content: "\e18c"; } -.icon-color-bucket:before { +i.icon-color-bucket:before { content: "\e18d"; } -.icon-coins:before { +i.icon-coins:before { content: "\e18e"; } -.icon-coins-yen:before { +i.icon-coins-yen:before { content: "\e18f"; } -.icon-coins-yen-alt:before { +i.icon-coins-yen-alt:before { content: "\e190"; } -.icon-coins-pound:before { +i.icon-coins-pound:before { content: "\e191"; } -.icon-coins-pound-alt:before { +i.icon-coins-pound-alt:before { content: "\e192"; } -.icon-coins-euro:before { +i.icon-coins-euro:before { content: "\e193"; } -.icon-coins-euro-alt:before { +i.icon-coins-euro-alt:before { content: "\e194"; } -.icon-coins-dollar:before { +i.icon-coins-dollar:before { content: "\e195"; } -.icon-conversation-alt:before { +i.icon-conversation-alt:before { content: "\e196"; } -.icon-conversation:before { +i.icon-conversation:before { content: "\e197"; } -.icon-coverflow:before { +i.icon-coverflow:before { content: "\e198"; } -.icon-credit-card-alt:before { +i.icon-credit-card-alt:before { content: "\e199"; } -.icon-credit-card:before { +i.icon-credit-card:before { content: "\e19a"; } -.icon-crop:before { +i.icon-crop:before { content: "\e19b"; } -.icon-crosshair:before { +i.icon-crosshair:before { content: "\e19c"; } -.icon-crown-alt:before { +i.icon-crown-alt:before { content: "\e19d"; } -.icon-crown:before { +i.icon-crown:before { content: "\e19e"; } -.icon-cupcake:before { +i.icon-cupcake:before { content: "\e19f"; } -.icon-curve:before { +i.icon-curve:before { content: "\e1a0"; } -.icon-cut:before { +i.icon-cut:before { content: "\e1a1"; } -.icon-dashboard:before { +i.icon-dashboard:before { content: "\e1a2"; } -.icon-defrag:before { +i.icon-defrag:before { content: "\e1a3"; } -.icon-delete:before { +i.icon-delete:before { content: "\e1a4"; } -.icon-delete-key:before { +i.icon-delete-key:before { content: "\e1a5"; } -.icon-departure:before { +i.icon-departure:before { content: "\e1a6"; } -.icon-desk:before { +i.icon-desk:before { content: "\e1a7"; } -.icon-desktop:before { +i.icon-desktop:before { content: "\e1a8"; } -.icon-donate:before { +i.icon-donate:before { content: "\e1a9"; } -.icon-dollar-bag:before { +i.icon-dollar-bag:before { content: "\e1aa"; } -.icon-documents:before { +i.icon-documents:before { content: "\e1ab"; } -.icon-document:before { +i.icon-document:before { content: "\e1ac"; } -.icon-document-dashed-line:before { +i.icon-document-dashed-line:before { content: "\e1ad"; } -.icon-dock-connector:before { +i.icon-dock-connector:before { content: "\e1ae"; } -.icon-dna:before { +i.icon-dna:before { content: "\e1af"; } -.icon-display:before { +i.icon-display:before { content: "\e1b0"; } -.icon-disk-image:before { +i.icon-disk-image:before { content: "\e1b1"; } -.icon-disc:before { +i.icon-disc:before { content: "\e1b2"; } -.icon-directions:before { +i.icon-directions:before { content: "\e1b3"; } -.icon-directions-alt:before { +i.icon-directions-alt:before { content: "\e1b4"; } -.icon-diploma:before { +i.icon-diploma:before { content: "\e1b5"; } -.icon-diploma-alt:before { +i.icon-diploma-alt:before { content: "\e1b6"; } -.icon-dice:before { +i.icon-dice:before { content: "\e1b7"; } -.icon-diamonds:before { +i.icon-diamonds:before { content: "\e1b8"; } -.icon-diamond:before { +i.icon-diamond:before { content: "\e1b9"; } -.icon-diagonal-arrow:before { +i.icon-diagonal-arrow:before { content: "\e1ba"; } -.icon-diagonal-arrow-alt:before { +i.icon-diagonal-arrow-alt:before { content: "\e1bb"; } -.icon-door-open:before { +i.icon-door-open:before { content: "\e1bc"; } -.icon-download-alt:before { +i.icon-download-alt:before { content: "\e1bd"; } -.icon-download:before { +i.icon-download:before { content: "\e1be"; } -.icon-drop:before { +i.icon-drop:before { content: "\e1bf"; } -.icon-eco:before { +i.icon-eco:before { content: "\e1c0"; } -.icon-economy:before { +i.icon-economy:before { content: "\e1c1"; } -.icon-edit:before { +i.icon-edit:before { content: "\e1c2"; } -.icon-eject:before { +i.icon-eject:before { content: "\e1c3"; } -.icon-employee:before { +i.icon-employee:before { content: "\e1c4"; } -.icon-energy-saving-bulb:before { +i.icon-energy-saving-bulb:before { content: "\e1c5"; } -.icon-enter:before { +i.icon-enter:before { content: "\e1c6"; } -.icon-equalizer:before { +i.icon-equalizer:before { content: "\e1c7"; } -.icon-escape:before { +i.icon-escape:before { content: "\e1c8"; } -.icon-ethernet:before { +i.icon-ethernet:before { content: "\e1c9"; } -.icon-euro-bag:before { +i.icon-euro-bag:before { content: "\e1ca"; } -.icon-exit-fullscreen:before { +i.icon-exit-fullscreen:before { content: "\e1cb"; } -.icon-eye:before { +i.icon-eye:before { content: "\e1cc"; } -.icon-facebook-like:before { +i.icon-facebook-like:before { content: "\e1cd"; } -.icon-factory:before { +i.icon-factory:before { content: "\e1ce"; } -.icon-font:before { +i.icon-font:before { content: "\e1cf"; } -.icon-folders:before { +i.icon-folders:before { content: "\e1d0"; } -.icon-folder:before, .icon-folder-close:before { +i.icon-folder:before, i.icon-folder-close:before { content: "\e1d1"; } -.icon-folder-outline:before { +i.icon-folder-outline:before { content: "\e1d2"; } -.icon-folder-open:before { +i.icon-folder-open:before { content: "\e1d3"; } -.icon-flowerpot:before { +i.icon-flowerpot:before { content: "\e1d4"; } -.icon-flashlight:before { +i.icon-flashlight:before { content: "\e1d5"; } -.icon-flash:before { +i.icon-flash:before { content: "\e1d6"; } -.icon-flag:before { +i.icon-flag:before { content: "\e1d7"; } -.icon-flag-alt:before { +i.icon-flag-alt:before { content: "\e1d8"; } -.icon-firewire:before { +i.icon-firewire:before { content: "\e1d9"; } -.icon-firewall:before { +i.icon-firewall:before { content: "\e1da"; } -.icon-fire:before { +i.icon-fire:before { content: "\e1db"; } -.icon-fingerprint:before { +i.icon-fingerprint:before { content: "\e1dc"; } -.icon-filter:before { +i.icon-filter:before { content: "\e1dd"; } -.icon-filter-arrows:before { +i.icon-filter-arrows:before { content: "\e1de"; } -.icon-files:before { +i.icon-files:before { content: "\e1df"; } -.icon-file-cabinet:before { +i.icon-file-cabinet:before { content: "\e1e0"; } -.icon-female-symbol:before { +i.icon-female-symbol:before { content: "\e1e1"; } -.icon-footprints:before { +i.icon-footprints:before { content: "\e1e2"; } -.icon-hammer:before { +i.icon-hammer:before { content: "\e1e3"; } -.icon-hand-active-alt:before { +i.icon-hand-active-alt:before { content: "\e1e4"; } -.icon-forking:before { +i.icon-forking:before { content: "\e1e5"; } -.icon-hand-active:before { +i.icon-hand-active:before { content: "\e1e6"; } -.icon-hand-pointer-alt:before { +i.icon-hand-pointer-alt:before { content: "\e1e7"; } -.icon-hand-pointer:before { +i.icon-hand-pointer:before { content: "\e1e8"; } -.icon-handprint:before { +i.icon-handprint:before { content: "\e1e9"; } -.icon-handshake:before { +i.icon-handshake:before { content: "\e1ea"; } -.icon-handtool:before { +i.icon-handtool:before { content: "\e1eb"; } -.icon-hard-drive:before { +i.icon-hard-drive:before { content: "\e1ec"; } -.icon-help:before { +i.icon-help:before { content: "\e1ed"; } -.icon-graduate:before { +i.icon-graduate:before { content: "\e1ee"; } -.icon-gps:before { +i.icon-gps:before { content: "\e1ef"; } -.icon-help-alt:before { +i.icon-help-alt:before { content: "\e1f0"; } -.icon-height:before { +i.icon-height:before { content: "\e1f1"; } -.icon-globe:before { +i.icon-globe:before { content: "\e1f2"; } -.icon-hearts:before { +i.icon-hearts:before { content: "\e1f3"; } -.icon-globe-inverted-europe-africa:before { +i.icon-globe-inverted-europe-africa:before { content: "\e1f4"; } -.icon-headset:before { +i.icon-headset:before { content: "\e1f5"; } -.icon-globe-inverted-asia:before { +i.icon-globe-inverted-asia:before { content: "\e1f6"; } -.icon-headphones:before { +i.icon-headphones:before { content: "\e1f7"; } -.icon-globe-inverted-america:before { +i.icon-globe-inverted-america:before { content: "\e1f8"; } -.icon-hd:before { +i.icon-hd:before { content: "\e1f9"; } -.icon-globe-europe-africa:before, -.icon-globe-europe---africa:before { +i.icon-globe-europe-africa:before, +i.icon-globe-europe---africa:before { content: "\e1fa"; } -.icon-hat:before { +i.icon-hat:before { content: "\e1fb"; } -.icon-globe-asia:before { +i.icon-globe-asia:before { content: "\e1fc"; } -.icon-globe-alt:before { +i.icon-globe-alt:before { content: "\e1fd"; } -.icon-hard-drive-alt:before { +i.icon-hard-drive-alt:before { content: "\e1fe"; } -.icon-glasses:before { +i.icon-glasses:before { content: "\e1ff"; } -.icon-gift:before { +i.icon-gift:before { content: "\e200"; } -.icon-handtool-alt:before { +i.icon-handtool-alt:before { content: "\e201"; } -.icon-geometry:before { +i.icon-geometry:before { content: "\e202"; } -.icon-game:before { +i.icon-game:before { content: "\e203"; } -.icon-fullscreen:before { +i.icon-fullscreen:before { content: "\e204"; } -.icon-fullscreen-alt:before { +i.icon-fullscreen-alt:before { content: "\e205"; } -.icon-frame:before { +i.icon-frame:before { content: "\e206"; } -.icon-frame-alt:before { +i.icon-frame-alt:before { content: "\e207"; } -.icon-camera-roll:before { +i.icon-camera-roll:before { content: "\e208"; } -.icon-bookmark:before { +i.icon-bookmark:before { content: "\e209"; } -.icon-bill:before { +i.icon-bill:before { content: "\e20a"; } -.icon-baby-stroller:before { +i.icon-baby-stroller:before { content: "\e20b"; } -.icon-alarm-clock:before { +i.icon-alarm-clock:before { content: "\e20c"; } -.icon-addressbook:before, -.icon-adressbook:before { +i.icon-addressbook:before, +i.icon-adressbook:before { content: "\e20d"; } -.icon-add:before { +i.icon-add:before { content: "\e20e"; } -.icon-activity:before { +i.icon-activity:before { content: "\e20f"; } -.icon-untitled:before { +i.icon-untitled:before { content: "\e210"; } -.icon-glasses:before { +i.icon-glasses:before { content: "\e211"; } -.icon-camcorder:before { +i.icon-camcorder:before { content: "\e212"; } -.icon-calendar:before { +i.icon-calendar:before { content: "\e213"; } -.icon-calendar-alt:before { +i.icon-calendar-alt:before { content: "\e214"; } -.icon-calculator:before { +i.icon-calculator:before { content: "\e215"; } -.icon-bus:before { +i.icon-bus:before { content: "\e216"; } -.icon-burn:before { +i.icon-burn:before { content: "\e217"; } -.icon-bulleted-list:before { +i.icon-bulleted-list:before { content: "\e218"; } -.icon-bug:before { +i.icon-bug:before { content: "\e219"; } -.icon-brush:before { +i.icon-brush:before { content: "\e21a"; } -.icon-brush-alt:before { +i.icon-brush-alt:before { content: "\e21b"; } -.icon-brush-alt-2:before { +i.icon-brush-alt-2:before { content: "\e21c"; } -.icon-browser-window:before { +i.icon-browser-window:before { content: "\e21d"; } -.icon-briefcase:before { +i.icon-briefcase:before { content: "\e21e"; } -.icon-brick:before { +i.icon-brick:before { content: "\e21f"; } -.icon-brackets:before { +i.icon-brackets:before { content: "\e220"; } -.icon-box:before { +i.icon-box:before { content: "\e221"; } -.icon-box-open:before { +i.icon-box-open:before { content: "\e222"; } -.icon-box-alt:before { +i.icon-box-alt:before { content: "\e223"; } -.icon-books:before { +i.icon-books:before { content: "\e224"; } -.icon-billboard:before { +i.icon-billboard:before { content: "\e225"; } -.icon-bills-dollar:before { +i.icon-bills-dollar:before { content: "\e226"; } -.icon-bills-euro:before { +i.icon-bills-euro:before { content: "\e227"; } -.icon-bills-pound:before { +i.icon-bills-pound:before { content: "\e228"; } -.icon-bills-yen:before { +i.icon-bills-yen:before { content: "\e229"; } -.icon-bills:before { +i.icon-bills:before { content: "\e22a"; } -.icon-binarycode:before { +i.icon-binarycode:before { content: "\e22b"; } -.icon-binoculars:before { +i.icon-binoculars:before { content: "\e22c"; } -.icon-bird:before { +i.icon-bird:before { content: "\e22d"; } -.icon-birthday-cake:before { +i.icon-birthday-cake:before { content: "\e22e"; } -.icon-blueprint:before { +i.icon-blueprint:before { content: "\e22f"; } -.icon-block:before { +i.icon-block:before { content: "\e230"; } -.icon-bluetooth:before { +i.icon-bluetooth:before { content: "\e231"; } -.icon-boat-shipping:before { +i.icon-boat-shipping:before { content: "\e232"; } -.icon-bomb:before { +i.icon-bomb:before { content: "\e233"; } -.icon-book-alt-2:before { +i.icon-book-alt-2:before { content: "\e234"; } -.icon-bones:before { +i.icon-bones:before { content: "\e235"; } -.icon-book-alt:before { +i.icon-book-alt:before { content: "\e236"; } -.icon-book:before { +i.icon-book:before { content: "\e237"; } -.icon-bill-yen:before { +i.icon-bill-yen:before { content: "\e238"; } -.icon-award:before { +i.icon-award:before { content: "\e239"; } -.icon-bill-pound:before { +i.icon-bill-pound:before { content: "\e23a"; } -.icon-autofill:before { +i.icon-autofill:before { content: "\e23b"; } -.icon-bill-euro:before { +i.icon-bill-euro:before { content: "\e23c"; } -.icon-auction-hammer:before { +i.icon-auction-hammer:before { content: "\e23d"; } -.icon-bill-dollar:before { +i.icon-bill-dollar:before { content: "\e23e"; } -.icon-attachment:before { +i.icon-attachment:before { content: "\e23f"; } -.icon-bell:before { +i.icon-bell:before { content: "\e240"; } -.icon-article:before { +i.icon-article:before { content: "\e241"; } -.icon-bell-off:before { +i.icon-bell-off:before { content: "\e242"; } -.icon-art-easel:before { +i.icon-art-easel:before { content: "\e243"; } -.icon-beer-glass:before { +i.icon-beer-glass:before { content: "\e244"; } -.icon-arrow-up:before { +i.icon-arrow-up:before { content: "\e245"; } -.icon-battery-low:before { +i.icon-battery-low:before { content: "\e246"; } -.icon-arrow-right:before { +i.icon-arrow-right:before { content: "\e247"; } -.icon-battery-full:before { +i.icon-battery-full:before { content: "\e248"; } -.icon-arrow-left:before { +i.icon-arrow-left:before { content: "\e249"; } -.icon-bars:before { +i.icon-bars:before { content: "\e24a"; } -.icon-arrow-down:before { +i.icon-arrow-down:before { content: "\e24b"; } -.icon-barcode:before { +i.icon-barcode:before { content: "\e24c"; } -.icon-arrivals:before { +i.icon-arrivals:before { content: "\e24d"; } -.icon-bar-chart:before { +i.icon-bar-chart:before { content: "\e24e"; } -.icon-application-window:before { +i.icon-application-window:before { content: "\e24f"; } -.icon-band-aid:before { +i.icon-band-aid:before { content: "\e250"; } -.icon-application-window-alt:before { +i.icon-application-window-alt:before { content: "\e251"; } -.icon-ball:before { +i.icon-ball:before { content: "\e252"; } -.icon-application-error:before { +i.icon-application-error:before { content: "\e253"; } -.icon-badge-restricted:before { +i.icon-badge-restricted:before { content: "\e254"; } -.icon-app:before { +i.icon-app:before { content: "\e255"; } -.icon-badge-remove:before { +i.icon-badge-remove:before { content: "\e256"; } -.icon-anchor:before { +i.icon-anchor:before { content: "\e257"; } -.icon-badge-count:before { +i.icon-badge-count:before { content: "\e258"; } -.icon-alt:before { +i.icon-alt:before { content: "\e259"; } -.icon-badge-add:before { +i.icon-badge-add:before { content: "\e25a"; } -.icon-alert:before { +i.icon-alert:before { content: "\e25b"; } -.icon-backspace:before { +i.icon-backspace:before { content: "\e25c"; } -.icon-alert-alt:before { +i.icon-alert-alt:before { content: "\e25d"; } -.icon-section:before { +i.icon-section:before { content: "\e24f"; } diff --git a/src/Umbraco.Web.UI.Client/src/less/listview.less b/src/Umbraco.Web.UI.Client/src/less/listview.less index fe8af6dbc4..9d0ed002bb 100644 --- a/src/Umbraco.Web.UI.Client/src/less/listview.less +++ b/src/Umbraco.Web.UI.Client/src/less/listview.less @@ -32,7 +32,10 @@ position: absolute; padding: 5px 8px; pointer-events: none; - top: 2px; + + &i { + top: 2px; + } } input[type="text"] { diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index 2354e96d38..3bf00fb25c 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -284,7 +284,7 @@ label:not([for]) { margin-left: 0; } -.controls-row label { +.controls-row label:not(.umb-form-check) { display: inline-block; } diff --git a/src/Umbraco.Web.UI.Client/src/less/modals.less b/src/Umbraco.Web.UI.Client/src/less/modals.less index 4ce907d06f..a23756f412 100644 --- a/src/Umbraco.Web.UI.Client/src/less/modals.less +++ b/src/Umbraco.Web.UI.Client/src/less/modals.less @@ -24,18 +24,18 @@ } .umb-modalcolumn-body { - padding: 0px; + padding: 0; background: @white; top: @editorHeaderHeight; position: absolute; - left: 0px; - right: 0px; - bottom: 0px; + left: 0; + right: 0; + bottom: 0; overflow: auto; } .no-padding .umb-modalcolumn-body { - padding: 0px + padding: 0; } .umb-modalcolumn .umb-modalcolumn-header .btn { @@ -46,12 +46,12 @@ .umb-modalcolumn iframe.auto-expand, .umb-modal iframe.auto-expand { border: none; - padding: 0px; - margin: 0px; - top: 0px; - bottom: 0px; - left: 0px; - right: 0px; + padding: 0; + margin: 0; + top: 0; + bottom: 0; + left: 0; + right: 0; position: absolute; } @@ -79,12 +79,12 @@ /* umb.dialog is used for the dialogs on the conent tree*/ .umb-dialog { outline: none; - top: 0px; - left: 0px; - right: 0px; - bottom: 0px; + top: 0; + left: 0; + right: 0; + bottom: 0; position: absolute; - padding: 0px; + padding: 0; background: @white; } @@ -100,9 +100,9 @@ .umb-dialog-body{ position: absolute; overflow:auto; - top: 0px; - left: 0px; - right: 0px; + top: 0; + left: 0; + right: 0; bottom: 49px; } .umb-dialog-body .umb-pane{margin-top: 15px;} @@ -112,9 +112,9 @@ overflow:auto; text-align: right; height: 32px; - left: 0px; - right: 0px; - bottom: 0px; + left: 0; + right: 0; + bottom: 0; padding: 8px; margin: 0; @@ -129,13 +129,13 @@ height: auto !Important; padding: 20px; } -.umbracoDialog .umb-pane{margin-left: 0px; margin-right: 0px; margin-top: 0px;} +.umbracoDialog .umb-pane{margin-left: 0; margin-right: 0; margin-top: 0;} .umbracoDialog .umb-dialog-body .umb-pane{margin-left: 20px; margin-right: 20px; margin-top: 20px;} .umbracoDialog form{height: 100%;} /*ensures dialogs doesnt have side-by-side labels*/ .umbracoDialog .controls-row, -.umb-modal .controls-row{margin-left: 0px !important;} +.umb-modal .controls-row{margin-left: 0 !important;} /* modal and umb-modal are used for right.hand dialogs */ .modal { @@ -185,7 +185,7 @@ height: auto; } .umb-modal .umb-panel-body{ - padding: 0px 20px 0px 20px; + padding: 0 20px 0 20px; } .umb-modal.fade.in.wide { diff --git a/src/Umbraco.Web.UI.Client/src/less/pages/welcome-dashboard.less b/src/Umbraco.Web.UI.Client/src/less/pages/welcome-dashboard.less index 59c58c914e..426ffcb5e2 100644 --- a/src/Umbraco.Web.UI.Client/src/less/pages/welcome-dashboard.less +++ b/src/Umbraco.Web.UI.Client/src/less/pages/welcome-dashboard.less @@ -39,21 +39,20 @@ text-decoration: none; display: block; margin: 10px; -} -.welcome-dashboard__info-box:hover { - border: 2px solid @turquoise; - cursor: pointer; - transition: border-color 150ms ease-in-out; - text-decoration: none; -} + &:hover { + border: 2px solid @turquoise; + cursor: pointer; + transition: border-color 150ms ease-in-out; + text-decoration: none; + } -.welcome-dashboard__info-box:active, -.welcome-dashboard__info-box:focus { - text-decoration: none; + &:active, + &:focus { + text-decoration: none; + } } - .welcome-dashboard__info-box-title { color: @turquoise-d1; font-size: 16px; @@ -74,7 +73,7 @@ } .welcome-dashboard__card { - background-color: @gray-10; + background-color: @grayLighter; border-radius: 3px; margin: 10px; display: flex; @@ -113,6 +112,6 @@ } .welcome-dashboard__card-teaser { - font-size: 14px; + font-size: 13px; margin-bottom: 15px; -} \ No newline at end of file +} diff --git a/src/Umbraco.Web.UI.Client/src/less/panel.less b/src/Umbraco.Web.UI.Client/src/less/panel.less index 40c70f5331..115bdaed70 100644 --- a/src/Umbraco.Web.UI.Client/src/less/panel.less +++ b/src/Umbraco.Web.UI.Client/src/less/panel.less @@ -48,6 +48,10 @@ .form-search { flex: 1; + .icon-search { + top: 16px; + } + &__toggle { margin: 10px 0; display: flex; @@ -392,6 +396,7 @@ font-size: 30px; color: @gray-7; transition: opacity 120ms; + line-height: 1; } .umb-panel-header-icon-text { @@ -428,7 +433,7 @@ input.umb-panel-header-description { .umb-panel-header-locked-description { font-size: 12px; - margin-top: 2px; + margin: 2px 0 0 0; height: 22px; line-height: 22px; } diff --git a/src/Umbraco.Web.UI.Client/src/less/properties.less b/src/Umbraco.Web.UI.Client/src/less/properties.less index 9e951feb1a..dc6d2ff6cd 100644 --- a/src/Umbraco.Web.UI.Client/src/less/properties.less +++ b/src/Umbraco.Web.UI.Client/src/less/properties.less @@ -16,8 +16,8 @@ border-left: 1px solid @gray-10; } -.date-wrapper__date .flatpickr-input > a { - +.date-wrapper__date .flatpickr-input > a, +.date-wrapper__date .flatpickr-input > button { display: flex; align-items: center; justify-content: center; @@ -25,16 +25,15 @@ padding: 4px 15px; box-sizing: border-box; min-width: 200px; - color: @ui-action-discreet-type; border: 1px dashed @ui-action-discreet-border; border-radius: 3px; - + &:hover, &:focus { text-decoration: none; color: @ui-action-discreet-type-hover; border-color: @ui-action-discreet-border-hover; - + localize { text-decoration: none; } diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 1d68c9f927..664be1dafc 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -131,7 +131,7 @@ pre { display: inline-flex; - font-family: monospace; + font-family: @monoFontFamily; margin-left: 15px; margin-right: 15px; white-space: nowrap; @@ -168,7 +168,7 @@ label { border: 1px solid @white; padding: 6px 10px; - font-family: monospace; + font-family: @monoFontFamily; border: 1px solid @gray-8; background: @gray-11; margin: 0 15px 0 3px; @@ -712,8 +712,9 @@ margin-top: 0; } } + // -// folder-browser +// Folder browser // -------------------------------------------------- .umb-folderbrowser .add-link { display: inline-block; @@ -811,55 +812,18 @@ } +// +// Slider +// -------------------------------------------------- +.umb-slider { + .umb-property-editor--limit-width(); +} + // // Tags // -------------------------------------------------- .umb-tags { - border: @inputBorder solid 1px; - padding: 5px; - min-height: 54px; - font-size: 13px; - text-shadow: none; - box-sizing: border-box; .umb-property-editor--limit-width(); - - .tag { - cursor: default; - margin: 10px; - padding: 10px 15px; - background: @blueExtraDark; - position: relative; - user-select: all; - - .icon-trash { - position: relative; - cursor: pointer; - padding-left: 2px; - font-size: 15px; - right: -5px; - bottom: -1px; - } - - .umb_confirm-action__overlay.-left{ - top: 6px; - left: auto; - right: 15px; - } - } - - input { - border: none; - background: @white; - } - - .twitter-typeahead { - margin: 10px; - margin-top: 16px; - vertical-align: top; - input { - padding-left: 0; - } - } } // diff --git a/src/Umbraco.Web.UI.Client/src/less/variables.less b/src/Umbraco.Web.UI.Client/src/less/variables.less index 840c6d529f..cab0745a42 100644 --- a/src/Umbraco.Web.UI.Client/src/less/variables.less +++ b/src/Umbraco.Web.UI.Client/src/less/variables.less @@ -156,11 +156,11 @@ @ui-active-type-hover: @blueMid; @ui-selected: @sand-5; -@ui-selected-hover: ligthen(@sand-5, 10); +@ui-selected-hover: ligthen(@sand-5, 10%); @ui-selected-type: @blueExtraDark; @ui-selected-type-hover: @blueMid; @ui-selected-border: @blueDark; -@ui-selected-border-hover: darken(@blueDark, 10); +@ui-selected-border-hover: darken(@blueDark, 10%); @ui-light-border: @pinkLight; @ui-light-type: @gray-4; @@ -518,7 +518,7 @@ // ------------------------- @gridColumns: 12; @gridColumnWidth: 60px; -@gridGutterWidth: 0px; +@gridGutterWidth: 0; @gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); // 1200px min diff --git a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.controller.js index 268bfb3a8c..c212a08951 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.controller.js @@ -157,8 +157,8 @@ } function openTourGroup(tourAlias) { - angular.forEach(vm.tours, function (group) { - angular.forEach(group, function (tour) { + vm.tours.forEach(function (group) { + group.tours.forEach(function (tour) { if (tour.alias === tourAlias) { group.open = true; } @@ -168,9 +168,9 @@ function getTourGroupCompletedPercentage() { // Finding out, how many tours are completed for the progress circle - angular.forEach(vm.tours, function(group){ + vm.tours.forEach(function(group){ var completedTours = 0; - angular.forEach(group.tours, function(tour){ + group.tours.forEach(function(tour){ if(tour.completed) { completedTours++; } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html index aa6126e73e..6b924d0aef 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.html @@ -18,16 +18,16 @@
-
+
{{ tour.name }}
- +
-
+
@@ -102,10 +102,10 @@ {{topic.name}} - + {{topic.description}} - + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js index aa0cd54dff..ab8c133211 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js @@ -1,15 +1,17 @@ (function () { "use strict"; - function CompositionsController($scope, $location, $filter, overlayService, localizationService) { + function CompositionsController($scope, $location, $filter, $timeout, overlayService, localizationService) { var vm = this; var oldModel = null; vm.showConfirmSubmit = false; + vm.loading = false; vm.isSelected = isSelected; vm.openContentType = openContentType; + vm.selectCompositeContentType = selectCompositeContentType; vm.submit = submit; vm.close = close; @@ -23,10 +25,13 @@ $scope.model.title = "Compositions"; } - // group the content types by their container paths + // Group the content types by their container paths vm.availableGroups = $filter("orderBy")( _.map( _.groupBy($scope.model.availableCompositeContentTypes, function (compositeContentType) { + + compositeContentType.selected = isSelected(compositeContentType.contentType.alias); + return compositeContentType.contentType.metaData.containerPath; }), function (group) { return { @@ -39,12 +44,12 @@ }); } - - + function isSelected(alias) { if ($scope.model.contentType.compositeContentTypes.indexOf(alias) !== -1) { return true; } + return false; } function openContentType(contentType, section) { @@ -52,6 +57,43 @@ $location.path(url); } + function selectCompositeContentType(compositeContentType) { + + vm.loading = true; + + var contentType = compositeContentType.contentType; + + $scope.model.selectCompositeContentType(contentType).then(function (response) { + + Utilities.forEach(vm.availableGroups, function (group) { + + Utilities.forEach(group.compositeContentTypes, function (obj) { + if (obj.allowed === false) { + obj.selected = false; + } + }); + }); + + $timeout(function () { + vm.loading = false; + }, 500); + + }, function () { + $timeout(function () { + vm.loading = false; + }, 500); + }); + + // Check if the template is already selected. + var index = $scope.model.contentType.compositeContentTypes.indexOf(contentType.alias); + + if (index === -1) { + $scope.model.contentType.compositeContentTypes.push(contentType.alias); + } else { + $scope.model.contentType.compositeContentTypes.splice(index, 1); + } + } + function submit() { if ($scope.model && $scope.model.submit) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html index 4096192081..436c4ea30a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html @@ -19,38 +19,39 @@
- +
- - + + - + +
+ +
+

diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.controller.js new file mode 100644 index 0000000000..d9ea5a7a09 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.controller.js @@ -0,0 +1,59 @@ +angular.module("umbraco") + .controller("Umbraco.Editors.MediaCropDetailsController", + function ($scope) { + + var vm = this; + + vm.submit = submit; + vm.close = close; + + if (!$scope.model.target.coordinates && !$scope.model.target.focalPoint) { + $scope.model.target.focalPoint = { left: .5, top: .5 }; + } + + vm.shouldShowUrl = shouldShowUrl; + vm.focalPointChanged = focalPointChanged; + + if (!$scope.model.target.image) { + $scope.model.target.image = $scope.model.target.url; + } + + function shouldShowUrl() { + if (!$scope.model.target) { + return false; + } + if ($scope.model.target.id) { + return false; + } + if ($scope.model.target.url && $scope.model.target.url.toLower().indexOf("blob:") === 0) { + return false; + } + return true; + } + + /** + * Called when the umbImageGravity component updates the focal point value + * @param {any} left + * @param {any} top + */ + function focalPointChanged(left, top) { + // update the model focalpoint value + $scope.model.target.focalPoint = { + left: left, + top: top + }; + } + + function submit() { + if ($scope.model && $scope.model.submit) { + $scope.model.submit($scope.model); + } + } + + function close() { + if ($scope.model && $scope.model.close) { + $scope.model.close($scope.model); + } + } + + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.html new file mode 100644 index 0000000000..3814ac851e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediapicker/overlays/mediacropdetails.html @@ -0,0 +1,78 @@ +
+ + + + + + + +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ Preview +
+ + {{model.target.name}} +
+ +
+
+ Crop section +
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js index a6d1383640..6310545b20 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.controller.js @@ -202,7 +202,7 @@ var match = false; // find and show if a match from the list has been chosen - angular.forEach(vm.validationTypes, function (validationType, index) { + vm.validationTypes.forEach(function (validationType, index) { if ($scope.model.property.validation.pattern === validationType.pattern) { vm.selectedValidationType = vm.validationTypes[index]; vm.showValidationPattern = true; @@ -212,7 +212,7 @@ // if there is no match - choose the custom validation option. if (!match) { - angular.forEach(vm.validationTypes, function (validationType) { + vm.validationTypes.forEach(function (validationType) { if (validationType.key === "custom") { vm.selectedValidationType = validationType; vm.showValidationPattern = true; diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html index 37a0d41207..05ebc56083 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/querybuilder/querybuilder.html @@ -71,7 +71,7 @@ -
+ {{property.name}} @@ -90,7 +90,7 @@ - + {{term.name}} @@ -112,13 +112,13 @@ - + - +
@@ -137,7 +137,7 @@ - + {{property.name}} @@ -159,7 +159,7 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js index 55d7a75000..f2a89ba7ea 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js @@ -47,8 +47,8 @@ } function preSelect(selection) { - angular.forEach(selection, function(selected){ - angular.forEach(vm.sections, function(section){ + selection.forEach(function(selected){ + vm.sections.forEach(function(section){ if(selected.alias === section.alias) { section.selected = true; } @@ -65,7 +65,7 @@ } else { - angular.forEach($scope.model.selection, function(selectedSection, index){ + $scope.model.selection.forEach(function(selectedSection, index){ if(selectedSection.alias === section.alias) { section.selected = false; $scope.model.selection.splice(index, 1); @@ -77,7 +77,7 @@ } function setSectionIcon(sections) { - angular.forEach(sections, function(section) { + sections.forEach(function(section) { section.icon = "icon-section"; }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js index 387dd71da8..c519a1d4fa 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js @@ -188,8 +188,17 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", //used advanced filtering if ($scope.model.filter.startsWith("{")) { $scope.model.filterAdvanced = true; - //convert to object - $scope.model.filter = Utilities.fromJson($scope.model.filter); + + if ($scope.model.filterByMetadata && !angular.isFunction($scope.model.filter)) + { + var filter = angular.fromJson($scope.model.filter); + $scope.model.filter = function (node){ return _.isMatch(node.metaData, filter);}; + } + else + { + //convert to object + $scope.model.filter = Utilities.fromJson($scope.model.filter); + } } } } @@ -274,19 +283,14 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", if (Utilities.isArray(args.children)) { //iterate children - _.each(args.children, - function (child) { - - //now we need to look in the already selected search results and - // toggle the check boxes for those ones that are listed - var exists = _.find(vm.searchInfo.selectedSearchResults, - function (selected) { - return child.id == selected.id; - }); - if (exists) { - child.selected = true; - } - }); + args.children.forEach(child => { + //now we need to look in the already selected search results and + // toggle the check boxes for those ones that are listed + var exists = vm.searchInfo.selectedSearchResults.find(selected => child.id === selected.id); + if (exists) { + child.selected = true; + } + }); //check filter performFiltering(args.children); @@ -456,8 +460,7 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", ? _.filter(nodes, $scope.model.filter) : _.where(nodes, $scope.model.filter); - angular.forEach(filtered, - function (value, key) { + filtered.forEach(function (value) { value.filtered = true; if ($scope.model.filterCssClass) { if (!value.cssClasses) { @@ -470,8 +473,7 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", } else { var a = $scope.model.filter.toLowerCase().replace(/\s/g, '').split(','); - angular.forEach(nodes, - function (value, key) { + nodes.forEach(function (value) { var found = a.indexOf(value.metaData.contentType.toLowerCase()) >= 0; @@ -541,78 +543,66 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", //we need to ensure that any currently displayed nodes that get selected // from the search get updated to have a check box! function checkChildren(children) { - _.each(children, - function (child) { - //check if the id is in the selection, if so ensure it's flagged as selected - var exists = _.find(vm.searchInfo.selectedSearchResults, - function (selected) { - return child.id == selected.id; + children.forEach(child => { + //check if the id is in the selection, if so ensure it's flagged as selected + var exists = vm.searchInfo.selectedSearchResults.find(selected => child.id === selected.id); + //if the curr node exists in selected search results, ensure it's checked + if (exists) { + child.selected = true; + } + //if the curr node does not exist in the selected search result, and the curr node is a child of a list view search result + else if (child.metaData.isSearchResult) { + //if this tree node is under a list view it means that the node was added + // to the tree dynamically under the list view that was searched, so we actually want to remove + // it all together from the tree + var listView = child.parent(); + listView.children = _.reject(listView.children, + function (c) { + return c.id == child.id; }); - //if the curr node exists in selected search results, ensure it's checked - if (exists) { - child.selected = true; - } - //if the curr node does not exist in the selected search result, and the curr node is a child of a list view search result - else if (child.metaData.isSearchResult) { - //if this tree node is under a list view it means that the node was added - // to the tree dynamically under the list view that was searched, so we actually want to remove - // it all together from the tree - var listView = child.parent(); - listView.children = _.reject(listView.children, - function (c) { - return c.id == child.id; - }); - } + } - //check if the current node is a list view and if so, check if there's any new results - // that need to be added as child nodes to it based on search results selected - if (child.metaData.isContainer) { + //check if the current node is a list view and if so, check if there's any new results + // that need to be added as child nodes to it based on search results selected + if (child.metaData.isContainer) { - child.cssClasses = _.reject(child.cssClasses, - function (c) { - return c === 'tree-node-slide-up-hide-active'; - }); + child.cssClasses = _.reject(child.cssClasses, + function (c) { + return c === 'tree-node-slide-up-hide-active'; + }); - var listViewResults = _.filter(vm.searchInfo.selectedSearchResults, - function (i) { - return i.parentId == child.id; - }); - _.each(listViewResults, - function (item) { - var childExists = _.find(child.children, - function (c) { - return c.id == item.id; - }); - if (!childExists) { - var parent = child; - child.children.unshift({ - id: item.id, - name: item.name, - cssClass: "icon umb-tree-icon sprTree " + item.icon, - level: child.level + 1, - metaData: { - isSearchResult: true - }, - hasChildren: false, - parent: function () { - return parent; - } - }); - } - }); - } + var listViewResults = vm.searchInfo.selectedSearchResults.filter(i => i.parentId === child.id); - //recurse - if (child.children && child.children.length > 0) { - checkChildren(child.children); - } - }); + listViewResults.forEach(item => { + var childExists = child.children.find(c => c.id === item.id); + + if (!childExists) { + var parent = child; + child.children.unshift({ + id: item.id, + name: item.name, + cssClass: "icon umb-tree-icon sprTree " + item.icon, + level: child.level + 1, + metaData: { + isSearchResult: true + }, + hasChildren: false, + parent: () => parent + }); + } + }); + } + + //recurse + if (child.children && child.children.length > 0) { + checkChildren(child.children); + } + }); } checkChildren(tree.root.children); } - vm.searchInfo.showSearch = false; vm.searchInfo.searchFromId = vm.startNodeId; vm.searchInfo.searchFromName = null; @@ -625,24 +615,16 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", performFiltering(results); //now actually remove all filtered items so they are not even displayed - results = _.filter(results, - function (item) { - return !item.filtered; - }); - + results = results.filter(item => !item.filtered); vm.searchInfo.results = results; //sync with the curr selected results - _.each(vm.searchInfo.results, - function (result) { - var exists = _.find($scope.model.selection, - function (item) { - return result.id == item.id; - }); - if (exists) { - result.selected = true; - } - }); + vm.searchInfo.results.forEach(result => { + var exists = $scope.model.selection.find(item => result.id === item.id); + if (exists) { + result.selected = true; + } + }); vm.searchInfo.showSearch = true; } @@ -664,12 +646,8 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController", } function listViewItemsLoaded(items) { - var selectedIds = _.pluck($scope.model.selection, "id"); - _.each(items, function (item) { - if (_.contains(selectedIds, item.id)) { - item.selected = true; - } - }); + var selectedIds = $scope.model.selection.map(x => x.id); + items.forEach(item => item.selected = selectedIds.includes(item.id)); } function submit(model) { diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html index 0c10d94136..c816c31b3e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html @@ -19,12 +19,12 @@
-
-
{{vm.selectedLanguage.name}}
-   -
+
- {{language.name}} +
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/usergrouppicker/usergrouppicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/usergrouppicker/usergrouppicker.controller.js index 8e075e1ab4..b11ae02e4e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/usergrouppicker/usergrouppicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/usergrouppicker/usergrouppicker.controller.js @@ -46,9 +46,9 @@ function preSelect(selection) { - angular.forEach(selection, function(selected){ - - angular.forEach(vm.userGroups, function(userGroup){ + selection.forEach(function (selected) { + + vm.userGroups.forEach(function(userGroup){ if(selected.id === userGroup.id) { userGroup.selected = true; } @@ -66,7 +66,7 @@ } else { - angular.forEach($scope.model.selection, function(selectedUserGroup, index){ + $scope.model.selection.forEach(function(selectedUserGroup, index){ if(selectedUserGroup.id === userGroup.id) { userGroup.selected = false; $scope.model.selection.splice(index, 1); diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.controller.js index 2bd73a5558..a7021b2867 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.controller.js @@ -1,7 +1,7 @@ (function () { "use strict"; - function UserPickerController($scope, usersResource, localizationService) { + function UserPickerController($scope, usersResource, localizationService, eventsService) { var vm = this; @@ -15,15 +15,18 @@ vm.submit = submit; vm.close = close; - ////////// + vm.multiPicker = $scope.model.multiPicker === false ? false : true; function onInit() { vm.loading = true; // set default title - if(!$scope.model.title) { - localizationService.localize("defaultdialogs_selectUsers").then(function(value){ + if (!$scope.model.title) { + + var labelKey = vm.multiPicker ? "defaultdialogs_selectUsers" : "defaultdialogs_selectUser"; + + localizationService.localize(labelKey).then(function(value){ $scope.model.title = value; }); } @@ -35,12 +38,11 @@ // get users getUsers(); - } function preSelect(selection, users) { - angular.forEach(selection, function(selected){ - angular.forEach(users, function(user){ + Utilities.forEach(selection, function(selected){ + Utilities.forEach(users, function(user){ if(selected.id === user.id) { user.selected = true; } @@ -50,22 +52,39 @@ function selectUser(user) { - if(!user.selected) { - + if (!user.selected) { user.selected = true; $scope.model.selection.push(user); - } else { - angular.forEach($scope.model.selection, function(selectedUser, index){ - if(selectedUser.id === user.id) { - user.selected = false; - $scope.model.selection.splice(index, 1); + if (user.selected) { + Utilities.forEach($scope.model.selection, function (selectedUser, index) { + if (selectedUser.id === user.id) { + user.selected = false; + $scope.model.selection.splice(index, 1); + } + }); + } else { + if (!vm.multiPicker) { + deselectAllUsers($scope.model.selection); } - }); - + eventsService.emit("dialogs.userPicker.select", user); + user.selected = true; + $scope.model.selection.push(user); + } } + if (!vm.multiPicker) { + submit($scope.model); + } + } + + function deselectAllUsers(users) { + for (var i = 0; i < users.length; i++) { + var user = users[i]; + user.selected = false; + } + users.length = 0; } var search = _.debounce(function () { @@ -95,7 +114,6 @@ preSelect($scope.model.selection, vm.users); vm.loading = false; - }); } @@ -105,14 +123,14 @@ } function submit(model) { - if($scope.model.submit) { + if ($scope.model.submit) { $scope.model.submit(model); } } function close() { - if($scope.model.close) { - $scope.model.close(); + if ($scope.model.close) { + $scope.model.close(); } } diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html index e39d693b47..5536ce38c2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/userpicker/userpicker.html @@ -19,7 +19,7 @@ -
@@ -49,27 +48,27 @@
-

{{ article.title }}

-
{{ article.description }}
- {{article.buttonText}} +

{{article.title}}

+
{{article.description}}
+ {{article.buttonText}}
-
\ No newline at end of file + diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.jpg b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.jpg deleted file mode 100644 index 22ae3653e2..0000000000 Binary files a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.jpg and /dev/null differ diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.png b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.png new file mode 100644 index 0000000000..173d2f36d0 Binary files /dev/null and b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/umbracotv.png differ diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/examinemanagementresults.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/examinemanagementresults.html index 26fa0cb72f..1d735e540f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/examinemanagementresults.html +++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/settings/examinemanagementresults.html @@ -33,6 +33,7 @@ type="button" button-style="link" label-key="general_close" + shortcut="esc" action="model.close()"> diff --git a/src/Umbraco.Web.UI.Client/src/views/dataTypes/delete.html b/src/Umbraco.Web.UI.Client/src/views/dataTypes/delete.html index 1fc9a2adfd..e27433c739 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dataTypes/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/dataTypes/delete.html @@ -106,9 +106,7 @@ - - + diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html index 88a67aaf18..9e628464b2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/create.html @@ -1,7 +1,7 @@  diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treepicker.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treepicker.html index ab1b84db97..2fb2aab352 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treepicker.html @@ -15,12 +15,11 @@ - + diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html index e693801495..865b59506b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesource.html @@ -6,7 +6,6 @@ -
- - +
+
- - Query for root node with xpath + +
- +
- +
-
    +
    • - - - Show xpath query help - + + - +

      Use Xpath query to set a root node on the tree, either based on a search from the root of the content tree, or by using a context-aware placeholder.

      - Placeholders finds the nearest published ID and runs its query from there. so for instance: + Placeholders finds the nearest published ID and runs its query from there, so for instance:

      $parent/newsArticle
      @@ -68,14 +63,14 @@ $root: root of the content tree
      $site: Ancestor node at level 1

      -
      +
    • - - Cancel and clear query + +
    - +
diff --git a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesourcetypepicker.html b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesourcetypepicker.html index f679b53093..cdbacfc7f3 100644 --- a/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesourcetypepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesourcetypepicker.html @@ -12,12 +12,11 @@ on-remove="vm.remove(itemType)">
- + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less index f4d9caa73b..878f6a8ef8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less @@ -4,7 +4,7 @@ position: relative; display: inline-flex; width: 100%; - height: auto; + height: 100%; margin-right: 20px; margin-bottom: 20px; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js index 489c1353ff..d3099154c7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js @@ -456,6 +456,7 @@ blockPickerModel.clipboardItems.push( { type: "elementType", + date: entry.date, pasteData: entry.data, blockConfigModel: modelObject.getScaffoldFromAlias(entry.alias), elementTypeModel: { @@ -471,6 +472,7 @@ blockPickerModel.clipboardItems.push( { type: "elementTypeArray", + date: entry.date, pasteData: entry.data, blockConfigModel: {}, // no block configuration for paste items of elementTypeArray. elementTypeModel: { @@ -481,6 +483,10 @@ ); }); + blockPickerModel.clipboardItems.sort( (a, b) => { + return b.date - a.date + }); + // open block picker overlay editorService.open(blockPickerModel); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js index df76c2d63a..dab8d2c6f8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.controller.js @@ -1,6 +1,28 @@ function booleanEditorController($scope, angularHelper) { + // Setup the default config + // This allow to overwrite the configuration when property editor is re-used + // in e.g. third party packages, dashboard or content app. For example when using umb-property-editor. + // At the moment this use "1/0" as default for "truevalue" and "falsevalue", but allow "True/False" as well. + // Maybe sometime later we can make it support "Yes/No" or "On/Off" as well similar to ng-true-value and ng-false-value in Angular. + var config = { + truevalue: "1", + falsevalue: "0", + showLabels: false + }; + + if ($scope.model.config && $scope.model.config.showLabels && Object.toBoolean($scope.model.config.showLabels)) { + config.showLabels = true; + } + + // Map the user config + Utilities.extend(config, $scope.model.config); + + // Map back to the model + $scope.model.config = config; + function setupViewModel() { + $scope.renderModel = { value: false }; @@ -16,12 +38,12 @@ function booleanEditorController($scope, angularHelper) { setupViewModel(); - if( $scope.model && !$scope.model.value ) { - $scope.model.value = ($scope.renderModel.value === true) ? '1' : '0'; + if ($scope.model && !$scope.model.value) { + $scope.model.value = ($scope.renderModel.value === true) ? $scope.model.config.truevalue : $scope.model.config.falsevalue; } - //here we declare a special method which will be called whenever the value has changed from the server - //this is instead of doing a watch on the model.value = faster + // Here we declare a special method which will be called whenever the value has changed from the server + // this is instead of doing a watch on the model.value = faster $scope.model.onValueChanged = function (newVal, oldVal) { //update the display val again if it has changed from the server setupViewModel(); @@ -30,13 +52,13 @@ function booleanEditorController($scope, angularHelper) { // Update the value when the toggle is clicked $scope.toggle = function(){ angularHelper.getCurrentForm($scope).$setDirty(); - if($scope.renderModel.value){ - $scope.model.value = "0"; + if ($scope.renderModel.value){ + $scope.model.value = $scope.model.config.falsevalue; setupViewModel(); return; } - $scope.model.value = "1"; + $scope.model.value = $scope.model.config.truevalue; setupViewModel(); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html index 21ed753c15..75f3f5452a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/boolean/boolean.html @@ -3,9 +3,9 @@ input-id="{{model.alias}}" checked="renderModel.value" on-click="toggle()" - show-labels="{{model.config.labelOn ? 'true': 'false'}}" + show-labels="{{model.config.showLabels}}" label-position="right" label-on="{{model.config.labelOn}}" - label-off="{{model.config.labelOn}}"> + label-off="{{model.config.labelOff}}"> diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js index 238872db40..bd80cdc42c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js @@ -3,16 +3,19 @@ * The controller that is used for a couple different Property Editors: Multi Node Tree Picker, Content Picker, * since this is used by MNTP and it supports content, media and members, there is code to deal with all 3 of those types * @param {any} $scope + * @param {any} $q + * @param {any} $routeParams + * @param {any} $location * @param {any} entityResource * @param {any} editorState * @param {any} iconHelper - * @param {any} $routeParams * @param {any} angularHelper * @param {any} navigationService - * @param {any} $location * @param {any} localizationService + * @param {any} editorService + * @param {any} userService */ -function contentPickerController($scope, entityResource, editorState, iconHelper, $routeParams, angularHelper, navigationService, $location, localizationService, editorService, $q) { +function contentPickerController($scope, $q, $routeParams, $location, entityResource, editorState, iconHelper, angularHelper, navigationService, localizationService, editorService, userService) { var vm = { labels: { @@ -139,7 +142,8 @@ function contentPickerController($scope, entityResource, editorState, iconHelper : $scope.model.config.startNode.type === "media" ? "Media" : "Document"; - $scope.allowOpenButton = entityType === "Document"; + + $scope.allowOpenButton = false; $scope.allowEditButton = entityType === "Document"; $scope.allowRemoveButton = true; @@ -303,16 +307,24 @@ function contentPickerController($scope, entityResource, editorState, iconHelper $scope.model.value = null; }; - $scope.openContentEditor = function (node) { - var contentEditor = { - id: node.id, + $scope.openEditor = function (item) { + var editor = { + id: entityType === "Member" ? item.key : item.id, submit: function (model) { + + var node = entityType === "Member" ? model.memberNode : + entityType === "Media" ? model.mediaNode : + model.contentNode; + // update the node - node.name = model.contentNode.name; - node.published = model.contentNode.hasPublishedVersion; + item.name = node.name; + if (entityType !== "Member") { - entityResource.getUrl(model.contentNode.id, entityType).then(function (data) { - node.url = data; + if (entityType === "Document") { + item.published = node.hasPublishedVersion; + } + entityResource.getUrl(node.id, entityType).then(function (data) { + item.url = data; }); } editorService.close(); @@ -321,7 +333,18 @@ function contentPickerController($scope, entityResource, editorState, iconHelper editorService.close(); } }; - editorService.contentEditor(contentEditor); + + switch (entityType) { + case "Document": + editorService.contentEditor(editor); + break; + case "Media": + editorService.mediaEditor(editor); + break; + case "Member": + editorService.memberEditor(editor); + break; + } }; //when the scope is destroyed we need to unsubscribe @@ -423,7 +446,7 @@ function contentPickerController($scope, entityResource, editorState, iconHelper if (entityType !== "Member") { entityResource.getUrl(entity.id, entityType).then(function (data) { // update url - angular.forEach($scope.renderModel, function (item) { + $scope.renderModel.forEach(function (item) { if (item.id === entity.id) { if (entity.trashed) { item.url = vm.labels.general_recycleBin; @@ -466,6 +489,7 @@ function contentPickerController($scope, entityResource, editorState, iconHelper "icon": item.icon, "path": item.path, "url": item.url, + "key": item.key, "trashed": item.trashed, "published": (item.metaData && item.metaData.IsPublished === false && entityType === "Document") ? false : true // only content supports published/unpublished content so we set everything else to published so the UI looks correct @@ -484,6 +508,26 @@ function contentPickerController($scope, entityResource, editorState, iconHelper } function init() { + + userService.getCurrentUser().then(function (user) { + switch (entityType) { + case "Document": + var hasAccessToContent = user.allowedSections.indexOf("content") !== -1; + $scope.allowOpenButton = hasAccessToContent; + break; + case "Media": + var hasAccessToMedia = user.allowedSections.indexOf("media") !== -1; + $scope.allowOpenButton = hasAccessToMedia; + break; + case "Member": + var hasAccessToMember = user.allowedSections.indexOf("member") !== -1; + $scope.allowOpenButton = hasAccessToMember; + break; + + default: + } + }); + localizationService.localizeMany(["general_recycleBin", "general_add"]) .then(function(data) { vm.labels.general_recycleBin = data[0]; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.html index ba22ca9d80..1a17ea2698 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.html @@ -15,7 +15,7 @@ allow-remove="allowRemoveButton" allow-open="model.config.showOpenButton && allowOpenButton && !dialogEditor" on-remove="remove($index)" - on-open="openContentEditor(node)"> + on-open="openEditor(node)"> diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js index 24affc6ac1..30b6fc4c8f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.controller.js @@ -55,7 +55,9 @@ function dateTimePickerController($scope, angularHelper, dateHelper, validationM }; // Don't show calendar if date format has been set to only time - if ($scope.model.config.format === "HH:mm:ss" || $scope.model.config.format === "HH:mm" || $scope.model.config.format === "HH") { + const timeFormat = $scope.model.config.format.toLowerCase(); + const timeFormatPattern = /^h{1,2}:m{1,2}:s{1,2}\s?a?$/gmi; + if (timeFormat.match(timeFormatPattern)) { $scope.datePickerConfig.enableTime = true; $scope.datePickerConfig.noCalendar = true; } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html index b35663c3df..9501a6631b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/datepicker/datepicker.html @@ -11,21 +11,20 @@ on-change="datePickerChange(dateStr)">
- +
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 4064df6a24..69de132715 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 @@ -15,14 +15,14 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo //ensure this is a bool, old data could store zeros/ones or string versions $scope.model.config.multiple = Object.toBoolean($scope.model.config.multiple); - + //ensure when form is saved that we don't store [] or [null] as string values in the database when no items are selected $scope.$on("formSubmitting", function () { - if ($scope.model.value && ($scope.model.value.length === 0 || $scope.model.value[0] === null)) { + if ($scope.model.value !== null && ($scope.model.value.length === 0 || $scope.model.value[0] === null)) { $scope.model.value = null; } }); - + function convertArrayToDictionaryArray(model){ //now we need to format the items in the dictionary because we always want to have an array var newItems = []; @@ -41,7 +41,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo var keys = _.keys($scope.model.config.items); for (var i = 0; i < vals.length; i++) { - var label = vals[i].value ? vals[i].value : vals[i]; + var label = vals[i].value ? vals[i].value : vals[i]; newItems.push({ id: keys[i], sortOrder: vals[i].sortOrder, value: label }); } @@ -65,7 +65,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo else { throw "The items property must be either an array or a dictionary"; } - + //sort the values $scope.model.config.items.sort(function (a, b) { return (a.sortOrder > b.sortOrder) ? 1 : ((b.sortOrder > a.sortOrder) ? -1 : 0); }); @@ -80,7 +80,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleCo $scope.model.value = ""; } } - + // if we run in single mode we'll store the value in a local variable // so we can pass an array as the model as our PropertyValueEditor expects that $scope.model.singleDropdownValue = ""; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.controller.js index e56bc67a49..969f675139 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.controller.js @@ -1,10 +1,66 @@ -function EditConfigController($scope) { +function EditConfigController($scope, angularHelper) { var vm = this; - + vm.submit = submit; vm.close = close; + vm.aceOption = { + mode: "json", + theme: "chrome", + showPrintMargin: false, + advanced: { + fontSize: '14px', + enableSnippets: true, + enableBasicAutocompletion: true, + enableLiveAutocompletion: false + }, + onLoad: function (_editor) { + vm.editor = _editor; + + vm.configJson = Utilities.toJson($scope.model.config, true); + + vm.editor.setValue(vm.configJson); + + vm.editor.on("blur", blurAceEditor); + } + }; + + function blurAceEditor(event, _editor) { + const code = _editor.getValue(); + + //var form = angularHelper.getCurrentForm($scope); + var form = vm.gridConfigEditor; + var isValid = isValidJson(code); + + if (isValid) { + $scope.model.config = Utilities.fromJson(code); + + setValid(form); + } + else { + setInvalid(form); + } + } + + function isValidJson(model) { + var flag = true; + try { + Utilities.fromJson(model) + } catch (err) { + flag = false; + } + return flag; + } + + function setValid(form) { + form.$setValidity('json', true); + } + + function setInvalid(form) { + form.$setValidity('json', false); + } + function submit() { if ($scope.model && $scope.model.submit) { $scope.model.submit($scope.model); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.html index 9fed19d4d9..4470c50274 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/editconfig.html @@ -16,16 +16,18 @@ - +

{{model.name}}

Settings will only save if the entered json configuration is valid

- -
+
+
+ +
This configuration is not valid json, and will not be saved.
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.controller.js index 876e4cf8f3..cf201976ad 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.controller.js @@ -2,17 +2,29 @@ angular.module("umbraco") .controller("Umbraco.PropertyEditors.GridPrevalueEditor.LayoutConfigController", function ($scope, localizationService) { + var vm = this; + + vm.labels = {}; function init() { - setTitle(); + + var labelKeys = [ + "grid_addGridLayout", + "grid_allowAllRowConfigurations" + ]; + + localizationService.localizeMany(labelKeys).then(function (data) { + + vm.labels.title = data[0]; + vm.labels.allowAllRowConfigurations = data[1]; + + setTitle(vm.labels.title); + }); } - function setTitle() { + function setTitle(value) { if (!$scope.model.title) { - localizationService.localize("grid_addGridLayout") - .then(function(data){ - $scope.model.title = data; - }); + $scope.model.title = value; } } @@ -56,13 +68,15 @@ angular.module("umbraco") }; $scope.toggleAllowed = function (section) { + section.allowAll = !section.allowAll; + if (section.allowed) { delete section.allowed; } else { section.allowed = []; } - } + }; $scope.deleteSection = function(section, template) { if ($scope.currentSection === section) { @@ -71,19 +85,32 @@ angular.module("umbraco") var index = template.sections.indexOf(section) template.sections.splice(index, 1); }; - + + $scope.selectRow = function (section, row) { + section.allowed = section.allowed || []; + + var index = section.allowed.indexOf(row.name); + if (row.allowed === true) { + if (index === -1) { + section.allowed.push(row.name); + } + } + else { + section.allowed.splice(index, 1); + } + }; $scope.close = function() { - if($scope.model.close) { + if ($scope.model.close) { $scope.model.close(); } - } + }; $scope.submit = function () { if ($scope.model.submit) { $scope.model.submit($scope.currentLayout); } - } + }; $scope.$watch("currentLayout", function(layout){ if(layout){ diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.html index 06afaa6b45..49e478a10b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/layoutconfig.html @@ -1,166 +1,165 @@ -
- - - +
- - + + - - - + + + +
+

+ +

+ + + +
+
+
-
+ + -

+ + + - - - +
+
+
-
+
-
-
+ +
+ + {{currentSection.grid}} + +
+
- - + + + + - - - + -
-
-
+ + -
+
+
- -
- - - - {{currentSection.grid}} - - - -
-
+
+
    - - - - Delete - - +
  • +
    - + + - - +
    -
    -
    +
    +
    +
    -
    -
      +
      +
    +
    +
    -
  • +
    + {{row.name}}
    + {{row.areas.length}} cells +
    +
-
-
-
-
+
+ + +
+
+ +
-
-
-
-
+
-
- {{row.name}}
- {{row.areas.length}} cells
-
- +
+
+
-
- - -
-
- -
- - - - - - -
-
- - - - - - + + + + - - + + - + - + - + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.controller.js index 263e7c0d9a..83a9fd5394 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.controller.js @@ -1,22 +1,34 @@ function RowConfigController($scope, localizationService) { + var vm = this; + + vm.labels = {}; + function init() { - setTitle(); + + var labelKeys = [ + "grid_addRowConfiguration", + "grid_allowAllEditors" + ]; + + localizationService.localizeMany(labelKeys).then(function (data) { + + vm.labels.title = data[0]; + vm.labels.allowAllEditors = data[1]; + + setTitle(vm.labels.title); + }); } - function setTitle() { + function setTitle(value) { if (!$scope.model.title) { - localizationService.localize("grid_addRowConfiguration") - .then(function(data){ - $scope.model.title = data; - }); + $scope.model.title = value; } } - $scope.currentRow = $scope.model.currentRow; - $scope.editors = $scope.model.editors; $scope.columns = $scope.model.columns; + $scope.editors = $scope.model.editors; $scope.scaleUp = function(section, max, overflow) { var add = 1; @@ -44,7 +56,7 @@ function RowConfigController($scope, localizationService) { delete $scope.currentCell; } else { - if (cell === undefined) { + if (cell === null) { var available = $scope.availableRowSpace; var space = 4; @@ -58,43 +70,64 @@ function RowConfigController($scope, localizationService) { row.areas.push(cell); } + + cell.allowed = cell.allowed || []; + + $scope.editors.forEach(function (e) { e.allowed = cell.allowed.indexOf(e.alias) !== -1 }); + $scope.currentCell = cell; $scope.currentCell.allowAll = cell.allowAll || !cell.allowed || !cell.allowed.length; } }; $scope.toggleAllowed = function (cell) { + cell.allowAll = !cell.allowAll; + if (cell.allowed) { delete cell.allowed; } else { cell.allowed = []; } - } + }; $scope.deleteArea = function (cell, row) { if ($scope.currentCell === cell) { - $scope.currentCell = undefined; + $scope.currentCell = null; } var index = row.areas.indexOf(cell) row.areas.splice(index, 1); }; $scope.closeArea = function() { - $scope.currentCell = undefined; + $scope.currentCell = null; + }; + + $scope.selectEditor = function (cell, editor) { + cell.allowed = cell.allowed || []; + + var index = cell.allowed.indexOf(editor.alias); + if (editor.allowed === true) { + if (index === -1) { + cell.allowed.push(editor.alias); + } + } + else { + cell.allowed.splice(index, 1); + } }; - $scope.close = function() { - if($scope.model.close) { + $scope.close = function () { + if ($scope.model.close) { $scope.model.close(); } - } + }; $scope.submit = function () { if ($scope.model.submit) { $scope.model.submit($scope.currentRow); } - } + }; $scope.nameChanged = false; var originalName = $scope.currentRow.name; @@ -118,11 +151,8 @@ function RowConfigController($scope, localizationService) { } } }, true); - init(); - - } angular.module("umbraco").controller("Umbraco.PropertyEditors.GridPrevalueEditor.RowConfigController", RowConfigController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.html index 9e7034688b..b74ef6bf09 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/dialogs/rowconfig.html @@ -1,10 +1,8 @@ -
+
+ - - - -
+ +
+

+
+

Modifying a row configuration name will result in loss of + data for any existing content that is based on this configuration.

+

Modifying only the label will not result in data loss.

+
+ + + + + + -
+
-

+
+
-
-

Modifying a row configuration name will result in loss of - data for any existing content that is based on this configuration.

-

Modifying only the label will not result in data loss.

-
+ + - - - + + + +
+
+
- - - +
-
+ +
+ + {{currentCell.grid}} + +
+
-
-
+ + + - - + + + + - - - -
-
-
+ -
+ + - -
- - - - {{currentCell.grid}} - - - -
-
+
+
+
    +
  • - - - + + {{editor.name}} + ({{editor.alias}}) + + +
  • +
+
+ +
- - - - Delete - - +
- -
    -
  • - -
  • -
+ + + -
-
-
    -
  • - -
  • -
-
-
-
- -
- - - - -
- - - - - + + - - - - - -

Warning!

- -

- You are deleting the row configuration {{model.dialogData.rowName}} -

- -

- - Modifying a row configuration name will result in loss of - data for any existing content that is based on this configuration. - -

- -

- Are you sure? -

- -
-
-
- - - - - - - - - - -
- -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.controller.js index 7c98fbfc5e..0d558e166c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.controller.js @@ -20,7 +20,16 @@ angular.module("umbraco") $scope.setImage = function () { var startNodeId = $scope.model.config && $scope.model.config.startNodeId ? $scope.model.config.startNodeId : undefined; var startNodeIsVirtual = startNodeId ? $scope.model.config.startNodeIsVirtual : undefined; - + var value = $scope.control.value; + var target = value + ? { + udi: value.udi, + url: value.image, + image: value.image, + focalPoint: value.focalPoint, + coordinates: value.coordinates + } + : null; var mediaPicker = { startNodeId: startNodeId, startNodeIsVirtual: startNodeIsVirtual, @@ -29,11 +38,13 @@ angular.module("umbraco") disableFolderSelect: true, onlyImages: true, dataTypeKey: $scope.model.dataTypeKey, + currentTarget: target, submit: function (model) { var selectedImage = model.selection[0]; $scope.control.value = { focalPoint: selectedImage.focalPoint, + coordinates: selectedImage.coordinates, id: selectedImage.id, udi: selectedImage.udi, image: selectedImage.image, @@ -69,25 +80,46 @@ angular.module("umbraco") } else { if ($scope.control.editor.config && $scope.control.editor.config.size) { + if ($scope.control.value.coordinates) { + // New way, crop by percent must come before width/height. + imageOptions.crop = $scope.control.value.coordinates; + imageOptions.mode = "percentage" + } else { + // Here in order not to break existing content where focalPoint were used. + // For some reason width/height have to come first when mode=crop. + if ($scope.control.value.focalPoint) { + imageOptions.focalPoint = { + left: $scope.control.value.focalPoint.left, + top: $scope.control.value.focalPoint.top + } + imageOptions.mode = "crop"; + } else { + // Prevent black padding and no crop when focal point not set / changed from default + imageOptions.focalPoint = { + left: 0.5, + top: 0.5 + } + imageOptions.mode = "crop"; + } + } imageOptions.animationprocessmode = "first"; imageOptions.height = $scope.control.editor.config.size.height; imageOptions.width = $scope.control.editor.config.size.width; } - if ($scope.control.value.focalPoint) { - imageOptions.focalPoint = { - left: $scope.control.value.focalPoint.left, - top: $scope.control.value.focalPoint.top - } - imageOptions.mode = "crop"; - } + // set default size if no crop present (moved from the view) + if (url.indexOf('?') == -1) + { + imageOptions.width = 800; + imageOptions.upscale = false; + imageOptions.animationprocessmode = false; } - - mediaHelper.getProcessedImageUrl($scope.control.value.image, imageOptions) - .then(function (url) { - $scope.thumbnailUrl = url; - }); } - }; + mediaHelper.getProcessedImageUrl($scope.control.value.image, imageOptions) + .then(function (url) { + $scope.thumbnailUrl = url; + }); + } + }; - }); + }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html index 184f707ebf..fa32821917 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/editors/media.html @@ -1,16 +1,16 @@
-
- +
+
Click to insert image
-
+
-
- +
+ -
+
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 a0826f7a96..6d3383c51e 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 @@ -405,14 +405,16 @@ angular.module("umbraco") eventsService.emit("grid.rowAdded", { scope: $scope, element: $element, row: row }); - // TODO: find a nicer way to do this without relying on setTimeout - setTimeout(function () { - var newRowEl = $element.find("[data-rowid='" + row.$uniqueId + "']"); + if (!isInit) { + // TODO: find a nicer way to do this without relying on setTimeout + setTimeout(function () { + var newRowEl = $element.find("[data-rowid='" + row.$uniqueId + "']"); - if (newRowEl !== null) { - newRowEl.focus(); - } - }, 0); + if (newRowEl !== null) { + newRowEl.focus(); + } + }, 0); + } }; @@ -953,7 +955,7 @@ angular.module("umbraco") $scope.availableEditors = response.data; //Localize the grid editor names - angular.forEach($scope.availableEditors, function (value, key) { + $scope.availableEditors.forEach(function (value) { //If no translation is provided, keep using the editor name from the manifest localizationService.localize("grid_" + value.alias, undefined, value.name).then(function (v) { value.name = v; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html index 0628766638..afb754a0ef 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/grid.html @@ -22,7 +22,7 @@
-

+

Choose a layout

{{row.label || row.name}}
- +

Settings applied

@@ -95,10 +95,10 @@
- @@ -138,24 +138,27 @@
- - + +

This content is not allowed here

- - + +

This content is allowed here

- +

+ Settings applied +

-
- -
+
@@ -163,8 +166,10 @@ @@ -196,13 +201,17 @@
- +
- - @@ -226,7 +235,7 @@
- +
@@ -266,7 +275,7 @@
-

+

Add row

@@ -41,8 +40,7 @@ - @@ -66,14 +64,13 @@
  • -
    +
    + ng-repeat="area in layout.areas | filter: vm.zeroWidthFilter" + ng-style="{width: vm.percentage(area.grid) + '%', 'max-width': '100%'}">

    {{area.maxItems}}

    @@ -84,7 +81,7 @@
    {{layout.label || layout.name}}
    - @@ -93,7 +90,7 @@
  • - @@ -121,7 +118,7 @@
  • - @@ -130,7 +127,7 @@
    • - @@ -149,7 +146,7 @@
    • - @@ -159,7 +156,7 @@
      • - diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/overlays/rowdeleteconfirm.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/overlays/rowdeleteconfirm.html new file mode 100644 index 0000000000..2ba56a5b88 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/grid/overlays/rowdeleteconfirm.html @@ -0,0 +1,16 @@ +
        + +
        + You are deleting the row configuration {{model.layout.name}}. +
        + +

        + + Modifying a row configuration name will result in loss of + data for any existing content that is based on this configuration. + +

        + + ? + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/icon.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/icon.prevalues.html index 2d3d4eeae2..8a11cb516d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/icon.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/icon.prevalues.html @@ -2,7 +2,7 @@
        - +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/includeproperties.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/includeproperties.prevalues.html index 0499bea713..42597f0c82 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/includeproperties.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/includeproperties.prevalues.html @@ -1,10 +1,12 @@ 
        - + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.controller.js index a02215f452..acfb114307 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.controller.js @@ -15,6 +15,8 @@ vm.focusLayoutName = false; vm.layoutsSortableOptions = { + axis: "y", + containment: "parent", distance: 10, tolerance: "pointer", opacity: 0.7, @@ -41,7 +43,6 @@ }; $scope.model.value.push(layout); - } function showPrompt(layout) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.html index 1240a61fbb..acc3f1d261 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts.prevalues.html @@ -1,49 +1,54 @@
        -
        +
        -
        +
        - +
        -
        + - +
        -
        - -
        + -
        +
        + +
        -
        - - {{ layout.name }} - (system layout) -
        +
        -
        - -
        +
        + + {{ layout.name }} + (system layout) +
        -
        - -
        - - - -
        -
        +
        + +
        -
        +
        + - +
        + + +
        +
        -
        +
        + +
        + + + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts/list/list.listviewlayout.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts/list/list.listviewlayout.controller.js index 4230633e96..fd49d3f706 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts/list/list.listviewlayout.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/layouts/list/list.listviewlayout.controller.js @@ -86,22 +86,20 @@ } function markAsSensitive() { - angular.forEach($scope.options.includeProperties, function (option) { + $scope.options.includeProperties.forEach(function (option) { option.isSensitive = false; - angular.forEach($scope.items, - function (item) { + $scope.items.forEach(function (item) { - angular.forEach(item.properties, - function (property) { + item.properties.forEach(function (property) { - if (option.alias === property.alias) { - option.isSensitive = property.isSensitive; - } + if (option.alias === property.alias) { + option.isSensitive = property.isSensitive; + } - }); + }); - }); + }); }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js index 9a86dc575a..d98dc92f24 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js @@ -227,26 +227,21 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time if (err.status && err.status >= 500) { // Open ysod overlay - $scope.ysodOverlay = { - view: "ysod", - error: err, - show: true - }; + overlayService.ysod(err); } $timeout(function () { $scope.bulkStatus = ""; $scope.actionInProgress = false; - }, - 500); + }, 500); - if (successMsgPromise) { - localizationService.localize("bulk_done") - .then(function (v) { - successMsgPromise.then(function (successMsg) { - notificationsService.success(v, successMsg); - }) - }); + if (successMsgPromise) + { + localizationService.localize("bulk_done").then(function (v) { + successMsgPromise.then(function (successMsg) { + notificationsService.success(v, successMsg); + }) + }); } } @@ -271,7 +266,6 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time with simple values */ $scope.getContent = function (contentId) { - $scope.reloadView($scope.contentId, true); } @@ -327,8 +321,6 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time }); }; - - $scope.makeSearch = function() { if ($scope.options.filter !== null && $scope.options.filter !== undefined) { $scope.options.pageNumber = 1; @@ -408,7 +400,6 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time dialog.title = value; overlayService.open(dialog); }); - }; function performDelete() { @@ -704,8 +695,6 @@ function listViewController($scope, $interpolate, $routeParams, $injector, $time // set what we've got on the result result[alias] = value; }); - - } function isDate(val) { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html index ee1847b430..05a294cc1c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.html @@ -14,29 +14,28 @@
        -
        - - - - @@ -53,13 +52,13 @@ - - @@ -230,11 +229,4 @@
        - - -
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewpublish.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewpublish.html index 027643eee1..c6f7c85c0b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewpublish.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewpublish.html @@ -29,8 +29,8 @@ + text="{{language.name}}"> +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js index df97d67f5d..650b1b8438 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.controller.js @@ -18,7 +18,7 @@ $scope.model.disableSubmitButton = !firstSelected; if (language.isMandatory) { - angular.forEach($scope.model.languages, function (lang) { + $scope.model.languages.forEach(function (lang) { if (lang !== language) { lang.unpublish = true; lang.disabled = language.unpublish; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html index 254187bdd1..5806bb8f02 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/overlays/listviewunpublish.html @@ -30,8 +30,8 @@ model="language.unpublish" on-change="vm.changeSelection(language)" text="{{language.name}}" - disabled="language.disabled" - /> + disabled="language.disabled"> +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html index 59e6fcd21c..f87c88a467 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/mediapicker/mediapicker.html @@ -31,6 +31,7 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergrouppicker/membergrouppicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergrouppicker/membergrouppicker.html index 4c53ac5d17..b1cafafb0d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergrouppicker/membergrouppicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergrouppicker/membergrouppicker.html @@ -10,13 +10,11 @@
        - + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergroups/membergroups.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergroups/membergroups.html index 9b59d48ab9..2715e11b15 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergroups/membergroups.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/membergroups/membergroups.html @@ -1,11 +1,15 @@ diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js index 95e595a97a..c3137360e2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js @@ -56,10 +56,9 @@ function memberPickerController($scope, entityResource, iconHelper, angularHelpe }; editorService.treePicker(memberPicker); - }; - $scope.remove =function(index){ + $scope.remove = function (index) { $scope.renderModel.splice(index, 1); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html index d968f08d71..99f7fffba8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html @@ -10,13 +10,12 @@
        - + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js index aaf41f3083..42ce10c519 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js @@ -17,7 +17,7 @@ $scope.model.value = []; } - //add any fields that there isn't values for + // Add any fields that there isn't values for if ($scope.model.config.min > 0) { for (var i = 0; i < $scope.model.config.min; i++) { if ((i + 1) > $scope.model.value.length) { @@ -37,7 +37,7 @@ if ($scope.model.config.max <= 0 && txtBoxValue.value || $scope.model.value.length < $scope.model.config.max && txtBoxValue.value) { var newItemIndex = index + 1; $scope.model.value.splice(newItemIndex, 0, { value: "" }); - //Focus on the newly added value + // Focus on the newly added value $scope.model.value[newItemIndex].hasFocus = true; } break; @@ -47,7 +47,7 @@ var remainder = []; // Used to require an extra hit on backspace for the field to be removed - if(txtBoxValue.value === "") { + if (txtBoxValue.value === "") { backspaceHits++; } else { backspaceHits = 0; @@ -64,11 +64,11 @@ var prevItemIndex = index - 1; - //Set focus back on false as the directive only watches for true - if(prevItemIndex >= 0) { + // Set focus back on false as the directive only watches for true + if (prevItemIndex >= 0) { $scope.model.value[prevItemIndex].hasFocus = false; $timeout(function () { - //Focus on the previous value + // Focus on the previous value $scope.model.value[prevItemIndex].hasFocus = true; }); } @@ -81,12 +81,13 @@ default: } validate(); - } + }; $scope.add = function () { if ($scope.model.config.max <= 0 || $scope.model.value.length < $scope.model.config.max) { $scope.model.value.push({ value: "" }); - // focus new value + + // Focus new value var newItemIndex = $scope.model.value.length - 1; $scope.model.value[newItemIndex].hasFocus = true; } @@ -106,7 +107,7 @@ $scope.model.value = remainder; }; - $scope.showPrompt = function (idx, item){ + $scope.showPrompt = function (idx, item) { var i = $scope.model.value.indexOf(item); @@ -114,11 +115,11 @@ if (i === idx) { $scope.promptIsVisible = i; } - } + }; - $scope.hidePrompt = function(){ + $scope.hidePrompt = function () { $scope.promptIsVisible = "-1"; - } + }; function validate() { if ($scope.multipleTextboxForm) { @@ -126,10 +127,22 @@ $scope.multipleTextboxForm.mandatory.$setValidity("minCount", !invalid); } } + $timeout(function () { validate(); }); - + + // We always need to ensure we dont submit anything broken + var unsubscribe = $scope.$on("formSubmitting", function (ev, args) { + + // Filter to items with values + $scope.model.value = $scope.model.value.filter(el => el.value.trim() !== "") || []; + }); + + // When the scope is destroyed we need to unsubscribe + $scope.$on('$destroy', function () { + unsubscribe(); + }); } angular.module("umbraco").controller("Umbraco.PropertyEditors.MultipleTextBoxController", MultipleTextBoxController); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html index 85221c61f7..6a9826ac3c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html @@ -2,19 +2,20 @@
        - + +
        - - + +
        - - @@ -22,11 +23,13 @@
        - Add - + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.html index ff1969aab8..36c4f8cf84 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.html @@ -1,6 +1,6 @@ 
        -

        -

        +

        You have picked a content item currently deleted or in the recycle bin

        +

        You have picked content items currently deleted or in the recycle bin

        @@ -17,13 +17,14 @@
        - +
        @@ -40,21 +41,21 @@ Add {{model.config.minNumber - renderModel.length}} item(s) - You can only have {{model.config.maxNumber}} items selected + You can only have {{model.config.maxNumber}} url(s) selected - Add up to {{model.config.maxNumber}} items + Add up to {{model.config.maxNumber}} url(s) - You can only have {{model.config.maxNumber}} items selected + You can only have {{model.config.maxNumber}} url(s) selected - Add at least {{model.config.minNumber}} item(s) + You need to add at least {{model.config.minNumber}} url(s)
        @@ -65,12 +66,12 @@
        - You need to add at least {{model.config.minNumber}} items + You need to add at least {{model.config.minNumber}} url(s)
        - You can only have {{model.config.maxNumber}} items selected + You can only have {{model.config.maxNumber}} url(s) selected
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index fe9725a7d8..4aa1ed2af2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -27,7 +27,7 @@ } } } - + clipboardService.registrerClearPropertyResolver(clearNestedContentPropertiesForStorage) @@ -49,7 +49,7 @@ } } } - + clipboardService.registrerClearPropertyResolver(clearInnerNestedContentPropertiesForStorage) }]); @@ -98,6 +98,8 @@ vm.wideMode = Object.toBoolean(model.config.hideLabel); vm.hasContentTypes = model.config.contentTypes.length > 0; + var cultureChanged = eventsService.on('editors.content.cultureChanged', (name, args) => updateModel()); + var labels = {}; vm.labels = labels; localizationService.localizeMany(["grid_addElement", "content_createEmpty", "actions_copy"]).then(function (data) { @@ -167,8 +169,6 @@ isDisabled: true } - - // helper to force the current form into the dirty state function setDirty() { if ($scope.$parent.$parent.propertyForm) { @@ -187,17 +187,29 @@ }; vm.openNodeTypePicker = function ($event) { - if (vm.overlayMenu || vm.nodes.length >= vm.maxItems) { + + if (vm.nodes.length >= vm.maxItems) { return; } - vm.overlayMenu = { - show: false, - style: {}, - filter: vm.scaffolds.length > 12 ? true : false, + var availableItems = []; + _.each(vm.scaffolds, function (scaffold) { + availableItems.push({ + alias: scaffold.contentTypeAlias, + name: scaffold.contentTypeName, + icon: iconHelper.convertFromLegacyIcon(scaffold.icon), + tooltip: scaffold.documentType.description + }); + }); + + const dialog = { + view: "itempicker", orderBy: "$index", view: "itempicker", event: $event, + filter: availableItems.length > 12, + size: availableItems.length > 6 ? "medium" : "small", + availableItems: availableItems, clickPasteItem: function (item) { if (item.type === "elementTypeArray") { _.each(item.data, function (entry) { @@ -206,45 +218,32 @@ } else { pasteFromClipboard(item.data); } - vm.overlayMenu.show = false; - vm.overlayMenu = null; + + overlayService.close(); }, submit: function (model) { if (model && model.selectedItem) { addNode(model.selectedItem.alias); } - vm.overlayMenu.show = false; - vm.overlayMenu = null; + + overlayService.close(); }, close: function () { - vm.overlayMenu.show = false; - vm.overlayMenu = null; + overlayService.close(); } }; - // this could be used for future limiting on node types - vm.overlayMenu.availableItems = []; - _.each(vm.scaffolds, function (scaffold) { - vm.overlayMenu.availableItems.push({ - alias: scaffold.contentTypeAlias, - name: scaffold.contentTypeName, - icon: iconHelper.convertFromLegacyIcon(scaffold.icon), - tooltip: scaffold.documentType.description - }); - }); - - if (vm.overlayMenu.availableItems.length === 0) { + if (dialog.availableItems.length === 0) { return; } - vm.overlayMenu.size = vm.overlayMenu.availableItems.length > 6 ? "medium" : "small"; - - vm.overlayMenu.pasteItems = []; + dialog.pasteItems = []; var singleEntriesForPaste = clipboardService.retriveEntriesOfType("elementType", contentTypeAliases); _.each(singleEntriesForPaste, function (entry) { - vm.overlayMenu.pasteItems.push({ + dialog.pasteItems.push({ type: "elementType", + date: entry.date, name: entry.label, data: entry.data, icon: entry.icon @@ -253,34 +252,36 @@ var arrayEntriesForPaste = clipboardService.retriveEntriesOfType("elementTypeArray", contentTypeAliases); _.each(arrayEntriesForPaste, function (entry) { - vm.overlayMenu.pasteItems.push({ + dialog.pasteItems.push({ type: "elementTypeArray", + date: entry.date, name: entry.label, data: entry.data, icon: entry.icon }); }); - vm.overlayMenu.title = labels.grid_addElement; - vm.overlayMenu.hideHeader = vm.overlayMenu.pasteItems.length > 0; + dialog.title = dialog.pasteItems.length > 0 ? labels.grid_addElement : labels.content_createEmpty; - vm.overlayMenu.clickClearPaste = function ($event) { + dialog.clickClearPaste = function ($event) { $event.stopPropagation(); $event.preventDefault(); clipboardService.clearEntriesOfType("elementType", contentTypeAliases); clipboardService.clearEntriesOfType("elementTypeArray", contentTypeAliases); - vm.overlayMenu.pasteItems = [];// This dialog is not connected via the clipboardService events, so we need to update manually. - vm.overlayMenu.hideHeader = false; + dialog.pasteItems = [];// This dialog is not connected via the clipboardService events, so we need to update manually. + dialog.overlayMenu.hideHeader = false; }; - if (vm.overlayMenu.availableItems.length === 1 && vm.overlayMenu.pasteItems.length === 0) { + if (dialog.availableItems.length === 1 && dialog.pasteItems.length === 0) { // only one scaffold type - no need to display the picker addNode(vm.scaffolds[0].contentTypeAlias); - vm.overlayMenu = null; + + dialog.close(); + return; } - vm.overlayMenu.show = true; + overlayService.open(dialog); }; vm.editNode = function (idx) { @@ -507,8 +508,7 @@ if (tab) { scaffold.variants[0].tabs.push(tab); - angular.forEach(tab.properties, - function (property) { + tab.properties.forEach(function (property) { if (_.find(notSupported, function (x) { return x === property.editor; })) { property.notSupported = true; // TODO: Not supported message to be replaced with 'content_nestedContentEditorNotSupported' dictionary key. Currently not possible due to async/timing quirk. @@ -713,6 +713,7 @@ $scope.$on("$destroy", function () { unsubscribe(); + cultureChanged(); watcher(); }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html index 896f8cf4a4..2f3856b101 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html @@ -47,13 +47,17 @@
        - + No content types are configured for this property.
        - @@ -75,12 +79,4 @@ - - -
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js index 33e2b834f3..47d1f401c7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js @@ -29,11 +29,15 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", // extend commands with properties for font-icon and if it is a custom command $scope.tinyMceConfig.commands = _.map($scope.tinyMceConfig.commands, function (obj) { var icon = getFontIcon(obj.alias); - return angular.extend(obj, { + + var objCmd = Utilities.extend(obj, { fontIcon: icon.name, isCustom: icon.isCustom, - selected: $scope.model.value.toolbar.indexOf(obj.alias) >= 0 + selected: $scope.model.value.toolbar.indexOf(obj.alias) >= 0, + icon: "mce-ico " + (icon.isCustom ? ' mce-i-custom ' : ' mce-i-') + icon.name }); + + return objCmd; }); }); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html index d70f469e6f..96de0cd040 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html @@ -2,11 +2,12 @@
        - +
        @@ -14,10 +15,12 @@
        - + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.html index ea0c2ef7bc..27c59194c1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/slider/slider.html @@ -1,6 +1,6 @@ -
        +
        -
        +
        + +
        + + +
        + + + + + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/relationTypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/relationTypes/edit.controller.js index a39b48c278..a0b2a6afa1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/relationTypes/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/relationTypes/edit.controller.js @@ -102,7 +102,7 @@ function RelationTypeEditController($scope, $routeParams, relationTypeResource, function formatDates(relations) { if (relations) { userService.getCurrentUser().then(function (currentUser) { - angular.forEach(relations, function (relation) { + relations.forEach(function (relation) { relation.timestampFormatted = dateHelper.getLocalDate(relation.createDate, currentUser.locale, 'LLL'); }); }); diff --git a/src/Umbraco.Web.UI.Client/src/views/stylesheets/infiniteeditors/richtextrule/richtextrule.html b/src/Umbraco.Web.UI.Client/src/views/stylesheets/infiniteeditors/richtextrule/richtextrule.html index cc5487d747..20c62cbd77 100644 --- a/src/Umbraco.Web.UI.Client/src/views/stylesheets/infiniteeditors/richtextrule/richtextrule.html +++ b/src/Umbraco.Web.UI.Client/src/views/stylesheets/infiniteeditors/richtextrule/richtextrule.html @@ -2,7 +2,7 @@ - + - - ' - + + diff --git a/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.controller.js b/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.controller.js index 7a3a51cf2e..de2865d843 100644 --- a/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.controller.js @@ -59,7 +59,6 @@ angular.module("umbraco").controller("Umbraco.Editors.StyleSheets.RulesControlle }; editorService.open(ruleDialog); - } function setDirty() { diff --git a/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.html b/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.html index 213499740f..8187b88152 100644 --- a/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.html +++ b/src/Umbraco.Web.UI.Client/src/views/stylesheets/views/rules/rules.html @@ -9,13 +9,11 @@
        - -
        - {{rule.name}} -
        + +
        {{rule.name}}
        - Edit - Remove + +
        diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js index 2e3bc6eb80..7b527804f5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.controller.js @@ -549,7 +549,7 @@ var availableMasterTemplates = []; // filter out the current template and the selected master template - angular.forEach(vm.templates, function (template) { + vm.templates.forEach(function (template) { if (template.alias !== vm.template.alias && template.alias !== vm.template.masterTemplateAlias) { var templatePathArray = template.path.split(','); // filter descendant templates of current template @@ -602,7 +602,7 @@ function getMasterTemplateName(masterTemplateAlias, templates) { if (masterTemplateAlias) { var templateName = ""; - angular.forEach(templates, function (template) { + templates.forEach(function (template) { if (template.alias === masterTemplateAlias) { templateName = template.name; } diff --git a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html index c5ad1b68d0..255b2c4885 100644 --- a/src/Umbraco.Web.UI.Client/src/views/templates/edit.html +++ b/src/Umbraco.Web.UI.Client/src/views/templates/edit.html @@ -30,12 +30,11 @@
        - - - - +
        - +
        @@ -97,7 +102,7 @@ - + - + diff --git a/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js index f996e944db..4ca4576755 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js @@ -185,7 +185,7 @@ * however the list to display the permissions isn't via the dictionary way so we need to format it */ function formatGranularPermissionSelection() { - angular.forEach(vm.userGroup.assignedPermissions, function (node) { + vm.userGroup.assignedPermissions.forEach(function (node) { formatGranularPermissionSelectionForNode(node); }); } @@ -193,8 +193,8 @@ function formatGranularPermissionSelectionForNode(node) { //the dictionary is assigned via node.permissions we will reformat to node.allowedPermissions node.allowedPermissions = []; - angular.forEach(node.permissions, function (permissions, key) { - angular.forEach(permissions, function (p) { + Object.values(node.permissions).forEach(function (permissions) { + permissions.forEach(function (p) { if (p.checked) { node.allowedPermissions.push(p); } @@ -299,7 +299,7 @@ } function setSectionIcon(sections) { - angular.forEach(sections, function (section) { + sections.forEach(function (section) { section.icon = "icon-section"; }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js index 2845c8df68..df2bd997b4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js @@ -269,7 +269,7 @@ submit: function (model) { // select items if (model.selection) { - angular.forEach(model.selection, function (item) { + model.selection.forEach(function (item) { if (item.id === "-1") { item.name = vm.labels.contentRoot; item.icon = "icon-folder"; @@ -298,7 +298,7 @@ submit: function (model) { // select items if (model.selection) { - angular.forEach(model.selection, function (item) { + model.selection.forEach(function (item) { if (item.id === "-1") { item.name = vm.labels.mediaRoot; item.icon = "icon-folder"; @@ -321,7 +321,7 @@ var found = false; // check if item is already in the selected list if (selection.length > 0) { - angular.forEach(selection, function (selectedItem) { + selection.forEach(function (selectedItem) { if (selectedItem.udi === item.udi) { found = true; } diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js index 31c52a344b..4b81e7c11c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js @@ -123,7 +123,7 @@ } function clearSelection() { - angular.forEach(vm.userGroups, function (userGroup) { + vm.userGroups.forEach(function (userGroup) { userGroup.selected = false; }); vm.selection = []; diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js index 2217628872..cb211834b2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js @@ -274,7 +274,7 @@ } function clearSelection() { - angular.forEach(vm.users, function (user) { + vm.users.forEach(function (user) { user.selected = false; }); vm.selection = []; @@ -305,7 +305,7 @@ vm.disableUserButtonState = "busy"; usersResource.disableUsers(vm.selection).then(function (data) { // update userState - angular.forEach(vm.selection, function (userId) { + vm.selection.forEach(function (userId) { var user = getUserFromArrayById(userId, vm.users); if (user) { user.userState = 1; @@ -326,7 +326,7 @@ vm.enableUserButtonState = "busy"; usersResource.enableUsers(vm.selection).then(function (data) { // update userState - angular.forEach(vm.selection, function (userId) { + vm.selection.forEach(function (userId) { var user = getUserFromArrayById(userId, vm.users); if (user) { user.userState = 0; @@ -345,7 +345,7 @@ vm.unlockUserButtonState = "busy"; usersResource.unlockUsers(vm.selection).then(function (data) { // update userState - angular.forEach(vm.selection, function (userId) { + vm.selection.forEach(function (userId) { var user = getUserFromArrayById(userId, vm.users); if (user) { user.userState = 0; @@ -423,14 +423,14 @@ function selectAll() { if (areAllSelected()) { vm.selection = []; - angular.forEach(vm.users, function (user) { + vm.users.forEach(function (user) { user.selected = false; }); } else { // clear selection so we don't add the same user twice vm.selection = []; // select all users - angular.forEach(vm.users, function (user) { + vm.users.forEach(function (user) { // prevent the current user to be selected if (!user.isCurrentUser) { user.selected = true; @@ -470,7 +470,7 @@ function getFilterName(array) { var name = vm.labels.all; var found = false; - angular.forEach(array, function (item) { + array.forEach(function (item) { if (item.selected) { if (!found) { name = item.name @@ -491,7 +491,7 @@ //If the selection is "ALL" then we need to unselect everything else since this is an 'odd' filter if (userState.key === "All") { - angular.forEach(vm.userStatesFilter, function (i) { + vm.userStatesFilter.forEach(function (i) { i.selected = false; }); //we can't unselect All @@ -500,7 +500,7 @@ vm.usersOptions.userStates = []; } else { - angular.forEach(vm.userStatesFilter, function (i) { + vm.userStatesFilter.forEach(function (i) { if (i.key === "All") { i.selected = false; } @@ -715,13 +715,13 @@ } function setUserDisplayState(users) { - angular.forEach(users, function (user) { + users.forEach(function (user) { user.userDisplayState = usersHelper.getUserStateFromValue(user.userState); }); } function formatDates(users) { - angular.forEach(users, function (user) { + users.forEach(function (user) { if (user.lastLoginDate) { var dateVal; var serverOffset = Umbraco.Sys.ServerVariables.application.serverTimeOffset; @@ -752,7 +752,7 @@ var firstSelectedUserGroups; - angular.forEach(users, function (user) { + users.forEach(function (user) { if (!user.selected) { return; diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js index 49d8914ac6..c111421d75 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js @@ -5,11 +5,11 @@ describe('Content picker controller tests', function () { beforeEach(module('umbraco')); //inject the contentMocks service - beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, entityMocks, mocksUtils, localizationMocks) { + beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, entityMocks, mocksUtils, localizationMocks, userMocks) { //for these tests we don't want any authorization to occur - mocksUtils.disableAuth(); - + mocksUtils.setAuth(); + httpBackend = $httpBackend; scope = $rootScope.$new(); @@ -34,6 +34,7 @@ describe('Content picker controller tests', function () { //see /mocks/content.mocks.js for how its setup entityMocks.register(); localizationMocks.register(); + userMocks.register(); controller = $controller('Umbraco.PropertyEditors.ContentPickerController', { $scope: scope, @@ -42,7 +43,7 @@ describe('Content picker controller tests', function () { //For controller tests its easiest to have the digest and flush happen here //since its intially always the same $http calls made - + //scope.$digest resolves the promise against the httpbackend scope.$digest(); diff --git a/src/Umbraco.Web.UI.NetCore/Startup.cs b/src/Umbraco.Web.UI.NetCore/Startup.cs index 21faae22f2..72e0d792f3 100644 --- a/src/Umbraco.Web.UI.NetCore/Startup.cs +++ b/src/Umbraco.Web.UI.NetCore/Startup.cs @@ -1,11 +1,11 @@ using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Umbraco.Extensions; +using Umbraco.Web.Common.Builder; namespace Umbraco.Web.UI.NetCore { @@ -17,8 +17,8 @@ namespace Umbraco.Web.UI.NetCore /// /// Constructor /// - /// - /// + /// The Web Host Environment + /// The Configuration /// /// Only a few services are possible to be injected here https://github.com/dotnet/aspnetcore/issues/9337 /// @@ -32,69 +32,19 @@ namespace Umbraco.Web.UI.NetCore // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { - // TODO: We will need to decide on if we want to use the ServiceBasedControllerActivator to create our controllers - // or use the default IControllerActivator: DefaultControllerActivator (which doesn't directly use the container to resolve controllers) - // This will affect whether we need to explicitly register controllers in the container like we do today in v8. - // What we absolutely must do though is make sure we explicitly opt-in to using one or the other *always* for our controllers instead of - // relying on a global configuration set by a user since if a custom IControllerActivator is used for our own controllers we may not - // guarantee it will work. And then... is that even possible? - - // TODO: we will need to simplify this and prob just have a one or 2 main method that devs call which call all other required methods, - // but for now we'll just be explicit with all of them - services.AddUmbracoConfiguration(_config); - services.AddUmbracoCore(_env, out var factory); - services.AddUmbracoWebComponents(); - services.AddUmbracoRuntimeMinifier(_config); - services.AddUmbracoBackOffice(); - services.AddUmbracoBackOfficeIdentity(); - services.AddMiniProfiler(options => - { - options.ShouldProfile = request => false; // WebProfiler determine and start profiling. We should not use the MiniProfilerMiddleware to also profile - }); - - //We need to have runtime compilation of views when using umbraco. We could consider having only this when a specific config is set. - //But as far as I can see, there are still precompiled views, even when this is activated, so maybe it is okay. - services.AddControllersWithViews().AddRazorRuntimeCompilation(); - - - // If using Kestrel: https://stackoverflow.com/a/55196057 - services.Configure(options => - { - options.AllowSynchronousIO = true; - }); - - services.Configure(options => - { - options.AllowSynchronousIO = true; - }); + var umbracoBuilder = services.AddUmbraco(_env, _config); + umbracoBuilder.BuildWithAllBackOfficeComponents(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app) { - //app.UseMiniProfiler(); if (_env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } - app.UseStatusCodePages(); - app.UseRouting(); - - app.UseUmbracoCore(); - app.UseUmbracoRouting(); - app.UseRequestLocalization(); - app.UseUmbracoRequestLogging(); - app.UseUmbracoWebsite(); - app.UseUmbracoBackOffice(); - app.UseUmbracoInstaller(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllerRoute( - name: "default", - pattern: "{controller}/{action=Index}/{id?}"); - }); + app.UseUmbraco(); } } } diff --git a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj index 0feb289806..fb417f9a31 100644 --- a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj +++ b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj @@ -24,6 +24,12 @@ + + + + + + diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.Development.json b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json index 8983e0fc1c..9f81927bdc 100644 --- a/src/Umbraco.Web.UI.NetCore/appsettings.Development.json +++ b/src/Umbraco.Web.UI.NetCore/appsettings.Development.json @@ -1,9 +1,16 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Microsoft.Hosting.Lifetime": "Information" + "Umbraco": { + "CMS": { + "Global":{ + "Smtp": { + "From": "your@email.here", + "Host": "localhost", + "Port": "25" + } + }, + "Hosting":{ + "Debug": true + } + } } - } } diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.json b/src/Umbraco.Web.UI.NetCore/appsettings.json index 31a8f95693..7f62ebd074 100644 --- a/src/Umbraco.Web.UI.NetCore/appsettings.json +++ b/src/Umbraco.Web.UI.NetCore/appsettings.json @@ -1,12 +1,63 @@ { - "ConnectionStrings": { - "umbracoDbDSN": "Data Source=|DataDirectory|\\Umbraco.sdf;Flush Interval=1;" - }, - "Umbraco": { - "CMS": { - "ModelsBuilder": { - "ModelsMode": "PureLive" - } + "ConnectionStrings": { + "umbracoDbDSN": "" + }, + "Umbraco": { + "CMS": { + "Content": { + "Notifications": { + "Email": "your@email.here" + }, + "MacroErrors": "throw" + }, + "Global": { + "DefaultUILanguage": "en-us", + "HideTopLevelNodeFromPath": true, + "Path": "~/umbraco", + "TimeOutInMinutes": 20, + "UseHttps": false + }, + "Hosting": { + "Debug": false + }, + "KeepAlive": { + "DisableKeepAliveTask": false, + "KeepAlivePingUrl": "{umbracoApplicationUrl}/api/keepalive/ping" + }, + "RequestHandler": { + "ConvertUrlsToAscii": "try" + }, + "RuntimeMinification": { + "dataFolder": "App_Data\\Smidge", + "version": "1" + }, + "Security": { + "KeepUserLoggedIn": false, + "UsernameIsEmail": true, + "HideDisabledUsersInBackoffice": false, + "UserPassword": { + "RequiredLength": 10, + "RequireNonLetterOrDigit": false, + "RequireDigit": false, + "RequireLowercase": false, + "RequireUppercase": false, + "MaxFailedAccessAttemptsBeforeLockout": 5 + }, + "MemberPassword": { + "RequiredLength": 10, + "RequireNonLetterOrDigit": false, + "RequireDigit": false, + "RequireLowercase": false, + "RequireUppercase": false, + "MaxFailedAccessAttemptsBeforeLockout": 5 } + }, + "Tours": { + "EnableTours": true + }, + "ModelsBuilder": { + "ModelsMode": "PureLive" + } } + } } diff --git a/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.Release.config b/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.Release.config deleted file mode 100644 index 44244db4e0..0000000000 --- a/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.Release.config +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - - - - - 1 - - - - - - - - your@email.here - - - - - - Preview mode - - … - - - Click to end - -
        - - ]]> - - - - throw - - - ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd,swf,xml,xhtml,html,htm,php,htaccess - - - assets/img/login.jpg - - - - - - false - - - true - - - false - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.config b/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.config deleted file mode 100644 index 5814a82095..0000000000 --- a/src/Umbraco.Web.UI.NetCore/config/umbracoSettings.config +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - - - - - - 1 - - - - - - - - your@email.here - - - - - - Preview mode - - … - - - Click to end - -
        - - ]]> - - - - throw - - - ashx,aspx,ascx,config,cshtml,vbhtml,asmx,air,axd,swf,xml,xhtml,html,htm,php,htaccess - - - assets/img/login.jpg - - - - - - false - - - true - - - false - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml index fe7e8ac638..4126d1d224 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml @@ -1,8 +1,8 @@ - umbraco - http://umbraco.org + Umbraco komunita + https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files Kultura a názvy hostitelů @@ -11,10 +11,13 @@ Změnit typ dokumentu Kopírovat Vytvořit + Exportovat Vytvořit balíček + Vytvořit skupinu Odstranit Deaktivovat Vyprázdnit koš + Aktivovat Exportovat typ dokumentu Importovat typ dokumentu Importovat balíček @@ -28,17 +31,64 @@ Znovu načíst uzly Znovu publikovat celý web Práva + Přejmenovat + Obnovit + Nastavit oprávnění pro stránku %0% + Kam zkopírovat + Kam přesunout + do struktury stromu pod + Choose where to copy the selected item(s) + Choose where to move the selected item(s) + bylo přesunuto + bylo zkopírováno + bylo smazáno Vrátit starší verzi Odeslat k publikování Odeslat k překladu + Nastavit skupinu Seřadit Přeložit Aktualizovat + Nastavit oprávnění + Odemknout + Vytvořit šablonu obsahu + Přeposlat pozvánku + + + Obsah + Administrace + Struktura + Ostatní + + + Povolit přístup k přiřazování kultury a názvů hostitelů + Povolit přístup k zobrazení protokolu historie uzlu + Povolit přístup k zobrazení uzlu + Povolit přístup ke změně typu dokumentu daného uzlu + Povolit přístup ke kopírování uzlu + Povolit přístup k vytváření uzlů + Povolit přístup k mazání uzlů + Povolit přístup k přesunutí uzlu + Povolit přístup k nastavení a změně veřejného přístupu k uzlu + Povolit přístup k publikování uzlu + Povolit přístup k zrušení publikování uzlu + Povolit přístup ke změně oprávnění pro uzel + Povolit přístup k vrácení uzlu do předchozího stavu + Povolit přístup k odeslání uzlu ke schválení před publikováním + Povolit přístup k odeslání uzlu k překladu + Povolit přístup ke změně pořadí uzlů + Povolit přístup k překladu uzlu + Povolit přístup k uložení uzlu + Povolit přístup k vytvoření šablony obsahu + + + Obsah + Info Přístup zakázán. Přidat novou doménu - odebrat + Odebrat Neplatný uzel. Neplatný tvar domény. Doména už byla přiřazena. @@ -49,16 +99,17 @@ Doména '%0%' už byla přiřazena Doména '%0%' byla aktualizována Editace aktuálních domén + + Dědit Kultura nebo dědění kultury po nadřazeném uzlu. Vztahuje se také
        na aktivní uzel.]]>
        Domény - - Zobrazení pro - + Zrušit výběr Vybrat Dělat něco jiného Tučně @@ -77,15 +128,62 @@ Číslovaný seznam Vložit makro Vložit obrázek + Publikovat a zavřít + Publikovat s potomky Editovat vztahy + Zpět na seznam Uložit + Uložit a zavřít Uložit a publikovat + Uložit a naplánovat Uložit a odeslat ke schválení Náhled + Uložit zobrazení seznamu + Naplánovat + Náhled Náhled je deaktivován, protože není přiřazena žádná šablona Vybrat styl Zobrazit styly Vložit tabulku + Generovat modely a zavřít + Uložit a generovat modely + Zpět + Znovu + Obnovit + Smazat štítek + Zrušit + Potvrdit + Další možnosti publikování + + + Zobrazení pro + Obsah smazán + Obsah nepublikován + Obsah nepublikován pro jazyky: %0% + Obsah publikován + Obsah publikován pro jazyky: %0% + Obsah uložen + Obsah uložen pro jazyky: %0% + Obsah přesunut + Obsah zkopírován + Obsah vrácen zpět + Obsah odeslán k publikování + Obsah odeslán k publikování pro jazyky: %0% + Seřadit podřízené položky prováděné uživatelem + Kopírovat + Publikovat + Publikovat + Přesunout + Uložit + Uložit + Smazat + Nepublikovat + Nepublikovat + Vrátit zpět + Odeslat k publikování + Odeslat k publikování + Seřadit + Historie (všechny jazyky) Abyste změnili typ dokumentu pro zvolený obsah, nejprve jej vyberte ze seznamu typů platných pro tohle umístění. @@ -107,7 +205,14 @@ Nelze dokončit mapování vlastností, neboť nejméně jedna z vlastností má definováno více než jedno mapování. Jsou zobrazeny pouze alternativní typy platné pro aktuální umístění. + + Nepodařilo se vytvořit složku pod rodičem s ID %0% + Nepodařilo se vytvořit složku pod rodičem s názvem %0% + Název složky nesmí obsahovat nepovolené znaky. + Odstranění položky se nezdařilo: %0% + + Is Published O této stránce Alias (jak byste popsali obrázek přes telefon) @@ -124,45 +229,146 @@ Tato položko byla změněna po publikování Tato položka není publikována Naposledy publikováno + There are no items to show + There are no items to show in the list. + No child items have been added + No members have been added Typ média Odkaz na položky medií Skupina členů Role Typ člena + No changes have been made Nevybráno žádné datum Titulek stránky + This media item has no link + No content can be added for this item Vlastnosti Tento dokument je publikován, ale není viditelný, protože jeho rodič '%0%' publikován není + Tato jazyková verze je publikována, ale není viditelná, protože její rodič '%0%' publikován není Jejda: tento dokument je publikován, ale není v mezipaměti (vnitřní chyba) + Could not get the url + This document is published but its url would collide with content %0% + This document is published but its url cannot be routed Publikovat + Published + Published (pending changes)> Stav publikování + Publish with descendants to publish %0% and all content items underneath and thereby making their content publicly available.]]> + Publish with descendants to publish the selected languages and the same languages of content items underneath and thereby making their content publicly available.]]> Datum publikování Datum ukončení publikování Datum odebrání + Set date Třídění je aktualizováno Abyste uzly setřídili, jednoduše je přetáhněte anebo klikněte na jednu z hlaviček sloupce. Podržením "shift" nebo "control" při výběru můžete označit uzlů více. Statistika Titulek (volitelně) + Alternative text (optional) Typ Nepublikovat + Draft + Not created Naposledy změněno Datum/čas poslední změny dokumentu Odebrat soubor(y) + Click here to remove the image from the media item + Click here to remove the file from the media item URL adresa dokumentu Člen skupin(y) Není člen skupin(y) Podřízené položky Cíl + This translates to the following time on the server: + What does this mean?]]> + Are you sure you want to delete this item? + Are you sure you want to delete all items? + Property %0% uses editor %1% which is not supported by Nested Content. + No content types are configured for this property. + Add element type + Select element type + Select the group whose properties should be displayed. If left blank, the first group on the element type will be used. + Enter an angular expression to evaluate against each item for its name. Use + to display the item index + Add another text box + Remove this text box + Content root + Include drafts: also publish unpublished content items. + This value is hidden. If you need access to view this value please contact your website administrator. + This value is hidden. + What languages would you like to publish? All languages with content are saved! + What languages would you like to publish? + What languages would you like to save? + All languages with content are saved on creation! + What languages would you like to send for approval? + What languages would you like to schedule? + Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages. + Published Languages + Unpublished Languages + Unmodified Languages + These languages haven't been created + Ready to Publish? + Ready to Save? + Send for approval + Select the date and time to publish and/or unpublish the content item. + Create new + Paste from clipboard + This item is in the Recycle Bin + + + Vytvořit novou šablonu obsahu z '%0%' + Prázdná + Vybrat obsahovou šablonu + Šablona obsahu byla vytvořena + Šablona obsahu byla vytvořena z '%0%' + Již existuje jiná šablona obsahu se stejným názvem + Šablona obsahu je předdefinovaný obsah, který si editor může vybrat jako základ pro vytváření nového obsahu Klikněte pro nahrání + nebo kliknutím sem vyberte soubory + Sem můžete přetáhnout a nahrát soubory. + Tento soubor nelze nahrát, nemá povolený typ souboru + Maximální velikost souboru je + Nejvyšší složka médií + Nepodařilo se přesunout média + Nadřazené a cílové složky nemohou být stejné + Médium se nepodařilo zkopírovat + Nepodařilo se vytvořit složku pod nadřazeným id %0% + Nepodařilo se přejmenovat složku s id %0% + Přetáhněte své soubory do oblasti + + + Vytvořit nového člena + Všichni členové + Členské skupiny nemají žádné další vlastnosti pro úpravy. Kde chcete vytvořit nový %0% Vytvořit položku pod + Vyberte typ dokumentu, pro který chcete vytvořit šablonu obsahu + Zadejte název složky Vyberte typ a titulek "typy dokumentů".]]> + Typy dokumentů v části Nastavení.]]> + Vybraná stránka ve stromu obsahu neumožňuje vytváření žádných stránek pod ní. + Oprávnění k úpravám pro tento typ dokumentu + Vytvořit nový typ dokumentu + Typy dokumentů v části Nastavení změnou možnosti Povolit jako root v části Oprávnění.]]> "typy medií".]]> + Vybraná média ve stromu neumožňuje vytváření pod nimi žádná další média. + Upravit oprávnění pro tento typ média + Typ dokumentu bez šablony + Nová složka + Nový datový typ + Nový skript JavaScript + Nová prázdná částečná šablona + Nové makro pro částečnou šablonu + Nová částečná šablona ze snippetu + Nové makro částečné šablony ze snippetu + Nové makro pro částečnou šablonu (bez makra) + Nový soubor stylů - stylopis + Nový soubor stylů Rich Text editoru Prohlédnout svůj web @@ -174,35 +380,42 @@ Vítejte - Stay - Discard changes - You have unsaved changes - Are you sure you want to navigate away from this page? - you have unsaved changes + Zůstat zde + Zahodit změny + Máte neuložené změny + Opravdu chcete opustit tuto stránku? Máte neuložené změny. + Publikování zviditelní vybrané položky na webu. + Zrušení publikování odstraní vybrané položky a všechny jejich potomky z webu. + Zrušení publikování odstraní tuto stránku a všechny její potomky z webu. + Máte neuložené změny. Provedením změn typu dokumentu změny zahodíte. - Done - Deleted %0% item - Deleted %0% items - Deleted %0% out of %1% item - Deleted %0% out of %1% items - Published %0% item - Published %0% items - Published %0% out of %1% item - Published %0% out of %1% items - Unpublished %0% item - Unpublished %0% items - Unpublished %0% out of %1% item - Unpublished %0% out of %1% items - Moved %0% item - Moved %0% items - Moved %0% out of %1% item - Moved %0% out of %1% items - Copied %0% item - Copied %0% items - Copied %0% out of %1% item - Copied %0% out of %1% items + Hotovo + Smazána %0% položka + Smazáno %0% položek + Smazána %0% z %1% položek + Smazáno %0% z %1% položek + Publikována %0% položka + Publikováno %0% položek + Publikována %0% z %1% položek + Publikováno %0% z %1% položek + Zrušeno publikování %0% položky + Zrušeno publikování %0% položek + Zrušeno publikování %0% z %1% položek + Zrušeno publikování %0% z %1% položek + Přesunuta %0% položka + Přesunuto %0% položek + Přesunuta %0% z %1% položek + Přesunuto %0% z %1% položek + Zkopírována %0% položka + Zkopírováno %0% položek + Zkopírována %0% z %1% položek + Zkopírováno %0% z %1% položek + Titulek odkazu + Odkaz + Kotva / dotaz Název Spravovat názvy hostitelů Zavřít toto okno @@ -213,6 +426,7 @@ Vyjmout Editovat položku slovníku Editovat jazyk + Edit selected media Vložit místní odkaz Vložit znak Vložit grafický titulek @@ -220,14 +434,20 @@ Vložit odkaz Kliknout pro přidání makra Vložit tabulku + Tím se odstraní jazyk + Změna kultury jazyka může být náročná operace a bude mít za následek opětovné sestavení mezipaměti obsahu a indexů Naposledy editováno Odkaz Místní odkaz: Při používání místních odkazů vložte znak "#" před odkaz Otevřít v novém okně? + Nastavení makra Toto makro nemá žádné vlastnosti, které by bylo možno editovat Vložit Editovat oprávnění pro + Nastavit oprávnění pro + Nastavit oprávnění pro %0% pro skupinu %1% + Vyberte skupiny uživatelů, pro které chcete nastavit oprávnění Položky koše jsou nyní mazány. Nezavírejte, prosím, toto okno, dokud operace probíhá Koš je nyní prázdný Odebrání položek z koše způsobí jejich trvalé odstranění @@ -243,21 +463,109 @@ Klikněte na obrázek pro zobrazení v plné velikosti Vybrat položku Zobrazit položku mezipaměti + Navázat na originál + Včetně potomků + Nejpřátelštější komunita + Odkaz na stránku + Otevře propojený dokument v novém okně nebo na kartě + Odkaz na média + Vybrat počáteční uzel obsahu + Vybrat média + Vybrat typ média + Vybrat ikonu + Vybrat položku + Vybrat odkaz + Vybrat makro + Vybrat obsah + Vybrat typ obsahu + Vybrat počáteční uzel média + Vybrat člena + Vybrat skupinu členů + Vybrat typ člena + Vybrat uzel + Vybrat sekce + Vybrat uživatele + Nebyly nalezeny žádné ikony + Pro toto makro neexistují žádné parametry + K dispozici nejsou žádná makra + Externí poskytovatelé přihlášení + Podrobnosti o výjimce + Stacktrace + Vnitřní výjimka + Propojit se + Odpojit se + účet + Vybrat editora + Vybrat snippet + Tímto odstraníte uzel a všechny jeho jazyky. Pokud chcete smazat pouze jeden jazyk, měli byste zrušit publikování uzlu v tomto jazyce. + + + Nejsou žádné položky ve slovníku. %0%' níže.
        Můžete přidat další jazyky v nabídce 'jazyky' nalevo.]]>
        Název jazyka + + Přehled slovníku + + + Konfigurovaní vyhledávače + Zobrazuje vlastnosti a nástroje pro libovolný konfigurovaný vyhledávač (např. pro víceindexový vyhledávač) + Hodnoty pole + Stav + Stav indexu a jeho čitelnost + Indexery + Informace o indexu + Uvádí vlastnosti indexu + Spravovat indexy Examine + Umožňuje zobrazit podrobnosti každého indexu a poskytuje některé nástroje pro správu indexů + Znovu vytvořit index + V závislosti na tom, kolik obsahu je na vašem webu, může to chvíli trvat.
        Nedoporučuje se znovu vytvářet index v době vysokého provozu na webu nebo při úpravách obsahu editory. + ]]> +
        + Vyhledávače + Prohledat index a zobrazit výsledky + Nástroje + Nástroje pro správu indexu + pole + Index nelze číst a bude nutné jej znovu sestavit + Proces trvá déle, než se očekávalo, zkontrolujte Umbraco log a zkontrolujte, zda během této operace nedošlo k chybám + Tento index nelze znovu sestavit, protože nemá přiřazen + IIndexPopulator Zadejte Vaše uživatelské jméno Zadejte Vaše heslo + Potvrďte heslo Pojmenujte %0%... Zadejte jméno... + Zadejte e-mail... + Zadejte uživatelské jméno... + Popisek... + Zadejte popis... Pište pro vyhledání... Pište pro filtrování... + Pište pro vložení štítků (po každém stiskněte klávesu Enter)... + Vložte svůj e-mail + Vložte zprávu... + Vaše uživatelské jméno je obvykle váš e-mail + #hodnota or ?klíč=hodnota + Vložte alias... + Generování aliasu... + Vytvořit vlastní zobrazení seznamu + Odebrat vlastní zobrazení seznamu + Typ obsahu, typ média nebo typ člena s tímto aliasem již existuje + + + Přejmenováno + Sem zadejte nový název složky + %0% přejmenováno na %1% Přidat předlohu @@ -271,6 +579,15 @@ Související stylopisy Zobrazit jmenovku Šířka a výška + Všechny typy vlastností a údaje o nich + použití tohoto datového typu bude trvale smazáno, potvrďte, že je chcete odstranit + Ano, smazat + a všechny typy vlastností a data vlastností používající tento typ dat + Vyberte složku, kterou chcete přesunout + do stromové struktury níže + byla přesunuta pod + %0% vymažete vlastnosti a jejich data z následujících položek]]> + Rozumím, že tato akce odstraní vlastnosti a data založená na tomto datovém typu Vaše data byla uložena, ale než budete moci publikovat tuto stránku, je třeba odstranit některé chyby: @@ -286,10 +603,12 @@ %0% není ve správném formátu + Ze serveru byla přijata chyba Použití daného typu souboru bylo zakázáno adminitrátorem UPOZORNĚNÍ! I když CodeMirror je dle konfigurace povolený, je zakázaný v Internet Exploreru, protože není dost stabilní. Vyplňte, prosím, alias i název nového typu vlastností! Vyskytl se problém při čtení/zápisu do určeného souboru nebo adresáře + Chyba při načítání skriptu částečné šablony (soubor: %0%) Uveďte, prosím, titulek Vyberte, prosím, typ Chystáte se obrázek zvětšit více, než je jeho původní rozměr. Opravdu chcete pokračovat? @@ -298,34 +617,43 @@ Žádne aktivní styly nejsou dostupné Umístěte, prosím, kurzor nalevo od těch dvou buňek, které chcete sloučit Nemužete rozdělit buňku, která nebyla sloučená. + Tato vlastnost je neplatná + Volby O... Akce Akce Přidat Alias + Vše Jste si jistí? + Zpět + Zpět na přehled Okraj o Zrušit Okraj buňky Vybrat + Vyčistit Zavřít Zavřít okno Komentovat Potvrdit + Omezit Zachovat proporce + Obsah Pokračovat Kopírovat Vytvořit - Databáse + Databáze Datum Výchozí Odstranit Odstraněno Odstraňování... Vzhled + Slovník Rozměry Dolů Stáhnout @@ -334,55 +662,85 @@ Prvky Email Chyba + Pole Najít + První + Focal point + Obecné + Skupiny + Skupina Výška Nápověda + Skrýt + Historie Ikona + Id Import + Zahrnout podsložky do vyhledávání + Info Vnitřní okraj Vložit Instalovat + Neplatné Vyrovnat + Popisek Jazyk + Poslední Rozvržení + Odkazy Nahrávání Zamčeno Přihlášení Odhlášení Odhlášení Makro + Povinné + Zpráva Přesunout Název Nový Následující Ne z + Vypnuto OK Otevřít + Zapnuto nebo + Seřadit podle Heslo Cesta Moment, prosím... Předchozí Vlastnosti + Obnovit Email pro obdržení formulářových dat Koš + Váš koš je prázdný + Znovu načíst Zbývající + Odebrat Přejmenovat Obnovit Povinné + Načíst Zopakovat Oprávnění + Plánované publikování Hledat + Litujeme, ale nemůžeme najít to, co hledáte. + Nebyly přidány žádné položky Server + Nastavení Zobrazit Zobrazit stránku při odeslání Rozměr Seřadit - Submit - - Typ - Pro hledání pište... + Stav + Potvrdit + Zadejte + Pište pro vyhledávání... + pod Nahoru Aktualizovat Povýšit @@ -397,18 +755,57 @@ Ano Složka Výsledky hledání - Reorder - I am done reordering + Přesunout + Skončil jsem s přesouváním + Náhled + Změnit heslo + na + Seznam + Ukládám... + aktuální + Vložené + vybrané + Další + Články + Videa + Vyčistit + Instalování + + + Modrá + + + Přidat skupinu + Přidat vlastnost + Přidat editor + Přidat šablonu + Přidat vnořený uzel + Přidat potomka + Upravit datový typ + Navigace v sekcích + Klávesové zkratky + zobrazit klávesové zkratky + Přepnout zobrazení seznamu + Přepnout povolení jako root + Okomentovat/Odkomentovat řádky + Odebrat řádek + Kopírovat řádky nahoru + Kopírovat řádky dolů + Přesunout řádky nahoru + Přesunout řádky dolů + Obecný + Editor + Přepnout povolení jazykových verzí - Background color - Bold - Text color + Barva pozadí + Tučně + Barva písma Font Text - Page + Stránka Instalátor se nemůže připojit k databázi. @@ -441,7 +838,7 @@ Heslo výchozího uživatele bylo úspěšně změněno od doby instalace!

        Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]> Heslo je změněno! Mějte skvělý start, sledujte naše uváděcí videa - Kliknutím na tlačítko následující (nebo modifikováním umbracoConfigurationStatus v souboru web.config) přijímáte licenci tohoto software tak, jak je uvedena v poli níže. Upozorňujeme, že tato distribuce umbraca se skládá ze dvou různých licencí, open source MIT licence pro framework a umbraco freeware licence, která pokrývá UI. + Kliknutím na tlačítko následující (nebo modifikováním umbracoConfigurationStatus v souboru web.config) přijímáte licenci tohoto software tak, jak je uvedena v poli níže. Upozorňujeme, že tato distribuce Umbraca se skládá ze dvou různých licencí, open source MIT licence pro framework a umbraco freeware licence, která pokrývá UI. Není nainstalováno. Dotčené soubory a složky Další informace o nastavování oprávnění pro umbraco zde @@ -515,8 +912,8 @@ Stiskněte "následující" pro spuštění průvodce.]]> - Kód kultury - Název kultury + Kód jazyka + Název jazyka Byli jste nečinní a odhlášení proběhne automaticky za @@ -531,8 +928,100 @@ Šťastný bláznivý pátek Šťastnou kočkobotu přihlašte se níže + Přihlásit se pomocí Relace vypršela © 2001 - %0%
        umbraco.org

        ]]>
        + Zapomenuté heslo? + Na uvedenou adresu bude zaslán e-mail s odkazem pro obnovení hesla + Pokud odpovídá našim záznamům, bude na zadanou adresu zaslán e-mail s pokyny k obnovení hesla + Zobrazit heslo + Skrýt heslo + Vrátit se na přihlašovací obrazovku + Zadejte nové heslo + Vaše heslo bylo aktualizováno + Odkaz, na který jste klikli, je neplatný nebo jeho platnost vypršela + Umbraco: Resetování hesla + + + + + + + + + + + +
        + + + + + +
        + +
        + +
        +
        + + + + + + +
        +
        +
        + + + + +
        + + + + +
        +

        + Vyžadováno resetování hesla +

        +

        + Vaše uživatelské jméno pro přihlášení do back-office Umbraco je: %0% +

        +

        + + + + + + +
        + + Kliknutím na tento odkaz obnovíte své heslo + +
        +

        +

        Pokud nemůžete kliknout na odkaz, zkopírujte a vložte tuto adresu URL do okna prohlížeče:

        + + + + +
        + + %1% + +
        +

        +
        +
        +


        +
        +
        + + + ]]>
        Ovládací panel @@ -555,6 +1044,7 @@ Upravte vaše oznámení pro %0% + Nastavení oznámení bylo uloženo pro - Hi %0%

        + Následující jazyky byly změněny %0% + Ahoj %0%

        Toto je automatická zpráva informující Vás, že úloha '%1%' byla provedena na stránce '%2%' @@ -595,14 +1086,68 @@

        Mějte hezký den!

        Zdraví umbraco robot

        ]]>
        + Byly změněny následující jazyky:

        + %0% + ]]>
        [%0%] Upozornění o %1% na %2% Upozornění + Akce + Vytvořeno + Vytvořit balíček a výběrem balíčku. Balíčky umbraco mají obvykle přípony ".umb" nebo ".zip". ]]> + Tím se balíček odstraní + Přetáhněte sem pro nahrání + Zahrnout všechny podřízené uzly + nebo kliknutím sem vyberte soubor balíčku + Nahrát balíček + Nainstalujte místní balíček výběrem ze svého počítače. Instalujte pouze balíčky ze zdrojů, které znáte a kterým důvěřujete + Nahrát další balíček + Zrušit a nahrát další balíček + Přijímám + podmínky použití + Cesta k souboru + Absolutní cesta k souboru (ie: /bin/umbraco.bin) + Nainstalováno + Nainstalované balíčky + Instalovat místní + Dokončit + Tento balíček nemá žádné zobrazení konfigurace + Zatím nebyly vytvořeny žádné balíčky + Nemáte nainstalované žádné balíčky + Balíčky v pravém horním rohu obrazovky.]]> + Akce balíčku + Web autora + Obsah balíčku + Soubory balíčku + URL ikony + Nainstalovat balíček + Licence + URL licence + Vlastnosti balíčku + Hledat balíčky + Výsledky pro + Nemohli jsme nic najít + Zkuste prosím vyhledat jiný balíček nebo procházet jednotlivé kategorie + Oblíbené + Nové + + karma body + Informace + Vlastník + Přispěvatelé + Vytvořeno + Aktuální verze + .NET verze + Počet stažení + Počet lajků + kompatibilita + Tento balíček je kompatibilní s následujícími verzemi Umbraco, jak ohlásili členové komunity. Plnou kompatibilitu nelze zaručit u verzí hlášených pod 100% + Externí zdroje Autor Dokumentace Meta data balíčku @@ -621,6 +1166,17 @@ Upozornění: všechny dokumenty, media atd. závislé na položkách, které odstraníte, přestanou pracovat a mohou vést k nestabilitě systému, takže odinstalovávejte opatrně. Jste-li na pochybách, kontaktujte autora balíčku.]]>
        Verze balíčku + Upgradování z verze + Balíček je již nainstalován + Tento balíček nelze nainstalovat, vyžaduje minimální verzi Umbraco + Odinstalovávám... + Stahuji... + Importuji... + Instaluji... + Restartuji, prosím čekejte... + Vše je hotovo, váš prohlížeč se nyní obnoví, prosím čekejte... + Klepnutím na tlačítko „Dokončit“ dokončete instalaci a znovu načtěte stránku. + Nahrávám balíček... Vložit s úplným formatováním (nedoporučeno) @@ -629,9 +1185,9 @@ Vložit, ale odstranit formátování (doporučeno) - Ochrana prostřednictvím rolí - použijte členské skupiny umbraca.]]> - Musíte vytvořit členskou skupinu před tím, než můžete použít autentizaci prostřednictvím rolí + Ochrana prostřednictvím rolí + použijte členské skupiny umbraca.]]> + Musíte vytvořit členskou skupinu před tím, než můžete použít autentizaci prostřednictvím rolí Chybová stránka Použita, když jsou lidé přihlášení, ale nemají přístup Vyberte, jak omezit přístup k této stránce @@ -640,16 +1196,28 @@ Přihlašovací stránka Vyberte stránku, která obsahuje přihlašovací formulář Odstranit ochranu + %0%?]]> Vyberte stránky, které obsahují přihlašovací formulář a chybová hlášení Vyberte role, které mají přístup k této stránce + %0%]]> + %0%]]> + Ochrana konkrétních členů + Pokud si přejete udělit přístup konkrétním členům Nastavte přihlašovací jmého a heslo pro tuto stránku Jednouživatelská ochrana Jestliže chcete nastavit jenom jednoduchou ochranu prostřednictvím uživatelského jména a hesla + Nedostatečná uživatelská oprávnění k publikování všech potomků + + @@ -659,7 +1227,9 @@ - Zahrnout nepublikované podřízené stránky + + + Ověření se nezdařilo pro požadovaný jazyk '% 0%'. Tento jazyk byl uložen, ale nezveřejněn. Probíhá publikování - počkejte, prosím... %0% ze %1% stránek bylo publikováno... %0% byla publikována @@ -668,23 +1238,49 @@ ok pro publikování %0% a tedy zveřejnění jejího obsahu.

        Můžete publikovat tuto stránku a všechny její podstránky zatrhnutím publikovat všchny podstránky níže. ]]>
        + Zahrnout nepublikované podřízené stránky Nenakonfigurovali jste žádné schválené barvy + + Můžete vybrat pouze položky typu (typů): %0% + Vybrali jste aktuálně odstraněnou položku obsahu nebo položku v koši + Vybrali jste aktuálně odstraněné položky obsahu nebo položky v koši + + + Smazaná položka + Vybrali jste aktuálně odstraněnou položku média nebo položku v koši + Vybrali jste aktuálně odstraněné položky médií nebo položky médií v koši + V koši + + zadejte externí odkaz + zvolte interní stránku + Nadpis + Odkaz + Otevřít v novém okně + zadejte titulek + Zadejte odkaz + Přidat vnější odkaz Přidat vnitřní odkaz Přidat - Nadpis Vnitřní stránka URL Posunout dolů Posunout nahoru - Otevřít v novém okně Odebrat odkaz + + Zrušit oříznutí + Uložit oříznutí + Přidat nové oříznutí + Hotovo + Vrátit změny + + Vyberte verzi, kterou chcete porovnat s aktuální verzí Současná verze Červený text nebude ve vybrané verzi zobrazen, zelený znamená přidaný].]]> Dokument byl vrácen na starší verzi @@ -697,20 +1293,29 @@ Editovat skriptovací soubor - Domovník Obsah + Formuláře + Média + Členové + Balíčky + Nastavení + Překlad + Uživatelé + + Domovník Kurýr Vývojář Průvodce nastavením Umbraca - Media - Členové Zpravodaje - Nastavení Statistiky - Překlad - Uživatelé Nápověda + + Příručky + Nejlepší videopříručky Umbraco + Navštívit our.umbraco.com + Navštívit umbraco.tv + Výchozí šablona Pro importování typu dokumentu vyhledejte soubor ".udt" ve svém počítači tak, že kliknete na tlačítko "Prohledat" a pak kliknete na "Import" (na následující obrazovce budete vyzváni k potvrzení) @@ -726,16 +1331,25 @@ Tento typ obsahu používá jako nadřazený typ obsahu. Záložky z nadřazených typů obsahu nejsou zobrazeny a mohou byt editovány pouze na nadřazených typech obsahu samotných Na této záložce nejsou definovány žádné vlastnosti. Pro vytvoření nové vlastnosti klikněte na odkaz "přidat novou vlastnost" nahoře. + Vytvořit odpovídající šablonu + Přidat ikonu - Sort order - Creation date + Řazení + Datum vytvoření Třídění bylo ukončeno. Abyste nastavili, jak mají být položky seřazeny, přetáhněte jednotlivé z nich nahoru či dolů. Anebo klikněte na hlavičku sloupce pro setřídění celé kolekce + Tato položka nemá vnořené položky k seřazení - Publikování bylo zrušeno doplňkem třetí strany + Validace + Před uložením položky je nutné opravit chyby + Chyba + Uloženo + Nedostatečná uživatelská oprávnění, operace nemohla být dokončena + Zrušeno + Operace byla zrušena doplňkem třetí strany Typ vlastnosti už existuje Typ vlastnosti vytvořen Datový typ: %1%]]> @@ -749,108 +1363,332 @@ Stylopis byl uložen bez chyb Datový typ byl uložen Položka slovníku byla uložena - Publikování se nezdařilo, protože nadřazená stránka není publikována Obsah byl publikován a je viditelný na webu + %0% dokumentů zveřejněných a viditelných na webu + %0% zveřejněných a viditelných na webu + %0% dokumentů zveřejněných pro jazyky %1% a viditelných na webu Obsah byl uložen Nezapomeňte na publikování, aby se změny projevily + Načasování publikování bylo aktualizováno + %0% uloženo Odeslat ke schválení Změny byly odeslány ke schválení - Medium bylo uloženo - Medium bylo uloženo bez chyb + %0% změn bylo odesláno ke schválení + Médium bylo uloženo + Médium bylo uloženo bez chyb Člen byl uložen + Skupina členů byla uložena Vlastnost stylopisu byla uložena Stylopis byl uložen Šablona byla uložena Chyba při ukládání uživatele (zkontrolujte log) Uživatel byl uložen Typ uživatele byl uložen + Skupina uživatelů byla uložena + Jazyky a názvy hostitelů byly uloženy + Při ukládání jazyků a názvů hostitelů došlo k chybě Soubor nebyl uložen soubor nemohl být uložen. Zkontrolujte, prosím, oprávnění k souboru Soubor byl uložen Soubor byl uložen bez chyb Jazyk byl uložen + Typ média byl uložen + Typ člena byl uložen + Skupina členů byla uložena Šablona nebyla uložena Ujistěte se, prosím, že nemáte 2 šablony se stejným aliasem Šablona byla uložena Šablona byla uložena bez chyb! Publikování obsahu bylo zrušeno + Varianta obsahu %0% nebyla publikována + Povinný jazyk '%0%' nebyl publikován. Všechny jazyky pro tuto položku obsahu nejsou nyní publikovány. Částečný pohled byl uložen Částečný pohled byl uložen bez chyb! Částečný pohled nebyl uložen Při ukládání souboru došlo k chybě. + Oprávnění byla uložena pro + Smazáno %0% skupin uživatelů + %0% bylo smazáno + Povoleno %0% uživatelů + Zakázáno %0% uživatelů + %0% je nyní povoleno + %0% je nyní zakázáno + Skupiny uživatelů byly nastaveny + Odemčeno %0% uživatelů + %0% je nyný odemčeno + Člen byl exportován do souboru + Při exportu člena došlo k chybě + Uživatel %0% byl smazán + Pozvat uživatele + Pozvánka byla znovu odeslána na %0% + Dokument nelze publikovat, protože %0% není publikována + Ověření pro jazyk '%0%' se nezdařilo + Typ dokumentu byl exportován do souboru + Při exportu typu dokumentu došlo k chybě + Datum vydání nemůže být v minulosti + Nelze naplánovat publikování dokumentu, protože %0% není publikována + Dokument nelze naplánovat na publikování, protože „%0%“ má datum zveřejnění později než nepovinný jazyk + Datum vypršení platnosti nemůže být v minulosti + Datum vypršení nemůže být před datem vydání + + Publikování bylo zrušeno doplňkem třetí strany + Publikování se nezdařilo, protože nadřazená stránka není publikována - Používá CSS syntaxi např.: h1, .redHeader, .blueTex + Přidat styl + Upravit styl + Styly Rich Text editoru + Definujte styly, které by měly být k dispozici v editoru formátovaného textu pro tuto šablonu stylů Editovat stylopis Editovat vlastnost stylopisu Název, který identifikuje vlastnost stylu v editoru formátovaného textu Náhled + Jak bude text vypadat v Rich Text editoru. + CSS identifikátor nebo třída + Používá syntaxi CSS, např. "h1" nebo ".redHeader" Styly + CSS, který by měl být použit v editoru RTF, např. "color:red;" + Kód + Rich Text editor + + Používá CSS syntaxi např.: h1, .redHeader, .blueTex + Nepodařilo se odstranit šablonu s ID %0% Editovat šablonu + Sekce Vložit obsahovou oblast Vložit zástupce obsahové oblasti + Vložit + Vyberte, co chcete vložit do své šablony Vložit položku slovníku + Položka slovníku je zástupný symbol pro překladatelný text, což usnadňuje vytváření návrhů pro vícejazyčné webové stránky. Vložit makro + + Makro je konfigurovatelná součást, která je skvělá pro opakovaně použitelné části návrhu, kde potřebujete předat parametry, jako jsou galerie, formuláře a seznamy. + Vložit pole stránky umbraco + Zobrazuje hodnotu pojmenovaného pole z aktuální stránky s možnostmi upravit hodnotu nebo alternativní hodnoty. + Částečná šablona + + Částečná šablona je samostatný soubor šablony, který lze vykreslit uvnitř jiné šablony. Je to skvělé pro opakované použití nebo pro oddělení složitých šablon. + Nadřazená šablona - Rychlá příručka k šablonovým značkám umbraca + Žádný master + Vykreslit podřízenou šablonu + @RenderBody(). + ]]> + Definujte pojmenovanou sekci + @section {...}. Ta může být vykreslena v konkrétní oblasti nadřazené šablony pomocí @RenderSection. + ]]> + Vykreslit pojmenovanou sekci + @RenderSection(name). Tím se vykreslí oblast podřízené šablony, která je zabalena do odpovídající definice @section[name] {...}. + ]]> + Název sekce + Sekce je povinná + @section, jinak se zobrazí chyba. + ]]> + Tvůrce dotazů + položky vráceny, do + zkopírovat do schránky + Chci + veškerý obsah + obsah typu "%0%" + z(e) + můj web + kde + a + je + není + před + před (včetně zvoleného datumu) + po + po (včetně zvoleného datumu) + rovná se + nerovná se + obsahuje + neobsahuje + větší než + větší nebo rovno + menší než + menší nebo rovno + Id + Název + Datum vytvoření + Datum poslední aktualizace + řadit podle + vzestupně + sestupně Šablona + + Rychlá příručka k šablonovým značkám umbraca - Image - Macro - Choose type of content - Choose a layout - Add a row - Add content - Drop content - Settings applied - This content is not allowed here - This content is allowed here - Click to embed - Click to insert image - Image caption... - Write here... - Grid Layouts - Layouts are the overall work area for the grid editor, usually you only need one or two different layouts - Add Grid Layout - Adjust the layout by setting column widths and adding additional sections - Row configurations - Rows are predefined cells arranged horizontally - Add row configuration - Adjust the row by setting cell widths and adding additional cells - Columns - Total combined number of columns in the grid layout - Settings - Configure what settings editors can change - Styles - Configure what styling editors can change - Allow all editors - Allow all row configurations + Obrázek + Makro + Vybrat typ obsahu + Vybrat rozvržení + Přidat řádek + Přidat obsah + Zahodit obsah + Nastavení aplikováno + Tento obsah zde není povolen + Tento obsah je zde povolen + Klepněte pro vložení + Klepnutím vložíte obrázek + Titulek obrázku... + Zde pište... + Rozvržení mřížky + Rozvržení je celková pracovní oblast pro editor mřížky, obvykle potřebujete pouze jedno nebo dvě různá rozvržení + Přidat rozvržení mřížky + Upravte rozvržení nastavením šířky sloupců a přidáním dalších sekcí + Konfigurace řádků + Řádky jsou předdefinované buňky uspořádané vodorovně + Přidat konfiguraci řádku + Upravte řádek nastavením šířky buněk a přidáním dalších buněk + Sloupce + Celkový počet sloupců v rozvržení mřížky + Nastavení + Nakonfigurujte, jaká nastavení mohou editoři změnit + Styly + Nakonfigurujte, co mohou editoři stylů změnit + Povolit všechny editory + Povolit všechny konfigurace řádků + Maximální počet položek + Nechte prázdné nebo nastavte na 0 pro neomezené + Nastavit jako výchozí + Vyberat navíc + Zvolit výchozí + jsou přidány + Varování + Odstraňujete konfiguraci řádku + + Odstranění názvu konfigurace řádku povede ke ztrátě dat pro veškerý existující obsah založený na této konfiguraci. + + + + Složení + Skupina + Nepřidali jste žádné skupiny + Přidat skupinu + Zděděno od + Přidat vlastnost + Požadovaný popisek + Povolit zobrazení seznamu + Nakonfiguruje položku obsahu tak, aby zobrazovala seznam svých potomků a seznam potomků, které je možné prohledávat, potomci se nebudou zobrazovat ve stromu + Povolené šablony + Vyberte, kteří editoři šablon mohou používat obsah tohoto typu + Povolit jako root + Povolit editorům vytvářet obsah tohoto typu v kořenovém adresáři stromu obsahu. + Povolené typy podřízených uzlů + Povolit vytváření obsahu zadaných typů pod obsahem tohoto typu. + Vybrat podřízený uzel + Zdědí záložky a vlastnosti z existujícího typu dokumentu. Nové záložky budou přidány do aktuálního typu dokumentu nebo sloučeny, pokud existuje záložka se stejným názvem. + Tento typ obsahu se používá ve složení, a proto jej nelze poskládat. + Nejsou k dispozici žádné typy obsahu, které lze použít jako složení. + Odebráním složení odstraníte všechna související data vlastností. Jakmile uložíte typ dokumentu, již není cesta zpět. + Vytvořit nové + Použít existující + Nastavení editoru + Konfigurace + Ano, smazat + bylo přesunuto pod + bylo zkopírováno pod + Vybrat složku, kterou chcete přesunout + Vybrat složku, kterou chcete kopírovat + ve stromové struktuře níže + Všechny typy dokumentů + Všechny dokumenty + Všechny média + použití tohoto typu dokumentu bude trvale smazáno, prosím potvrďte, že je chcete také odstranit. + použití tohoto typu média bude trvale smazáno, potvrďte, že je chcete také odstranit. + použití tohoto typu člena bude trvale smazáno, potvrďte, že je chcete také odstranit + a všechny dokumenty používající tento typ + a všechny mediální položky používající tento typ + a všichni členové používající tento typ + Člen může upravovat + Povolit editaci této vlastnosti členem na jeho stránce profilu + Obsahuje citlivá data + Skrýt tuto hodnotu vlastnosti před editory obsahu, kteří nemají přístup k prohlížení citlivých informací + Zobrazit v profilu člena + Povolit zobrazení této vlastnosti na stránce profilu člena + záložka nemá žádné řazení + Kde se toto složení používá? + Toto složení se v současnosti používá ve složení následujících typů obsahu: + Povolit různé jazyky + Povolit editorům vytvářet obsah tohoto typu v různých jazycích. + Povolit různé jazyky + Typ prvku + Je typ prvku + Typ prvku je určen k použití například ve vnořeném obsahu, nikoli ve stromu. + Jakmile byl typ dokumentu použit k vytvoření jedné nebo více položek obsahu, nelze jej změnit na typ prvku. + To neplatí pro typ prvku + V této vlastnosti jste provedli změny. Opravdu je chcete zahodit? + + + Přidat jazyk + Povinný jazyk + Před publikováním uzlu je nutné vyplnit vlastnosti v tomto jazyce. + Výchozí jazyk + Web Umbraco může mít nastaven pouze jeden výchozí jazyk. + Přepnutí výchozího jazyka může mít za následek chybějící výchozí obsah. + Nahradit nepřeložený obsah za + Žádné nahrazení nepřeloženého jazyka + Chcete-li povolit automatické zobrazení vícejazyčného obsahu v jiném jazyce, pokud není v požadovaném jazyce přeložen, vyberte jej zde. + Nahrazujicí jazyk + žádný + + + Přidat parametr + Upravit parametr + Zadejte název makra + Parametry + Definujte parametry, které by měly být k dispozici při použití tohoto makra. + Vyberte soubor makra pro částečnou šablonu + + + Stavební modely + to může chvíli trvat, nebojte se + Generované modely + Modely nelze vygenerovat + Generování modelů selhalo, viz výjimka v logu Umbraca + Přidat záložní pole + Náhradní pole + Přidat výchozí hodnotu + Výchozí hodnota Alternativní pole Alternativní text Velká a malá písmena Kódování Vybrat pole - Konvertovat + Konvertovat + Ano, převést konce řádků Nahrazuje nové řádky html tagem &lt;br&gt; Vlastní pole Ano, pouze datum + Formát a kódování Formátovat jako datum + Naformátuje hodnotu jako datum nebo datum s časem podle aktivního jazyka HTML kódování Nahradí speciální znaky jejich HTML ekvivalentem. Bude vloženo za hodnotou pole Bude vloženo před hodnotou pole Malá písmena + Upravit výstup Nic + Ukázka výstupu Vložit za polem Vložit před polem Rekurzivní + Ano, udělej to rekurzivní + Oddělovač Standardní pole Velká písmena Kódování URL @@ -861,7 +1699,7 @@ Podrobnosti překladu - Stáhnout xml DTD + Stáhnout XML DTD Pole Zahrnout podstránky Žádní uživatelé překladatelé nebyli nalezeni. Vytvořte, prosím, překladatele před tím, než začnete posílat obsah k překladu Stránka '%0%' byla poslána k překladu @@ -892,6 +1730,9 @@ Nahrát xml překladu + Obsah + Šablony obsahu + Média Prohlížeč mezipaměti Koš Vytvořené balíčky @@ -909,8 +1750,11 @@ Role Typy členů Typy dokumentů + Typy vztahů/vazeb Balíčky Balíčky + Částečné šablony + Makra částečných šablon Instalovat z úložiště Instalovat Runway Moduly Runway @@ -918,9 +1762,14 @@ Skripty Stylopisy Šablony - Oprávnění Uživatele - Typy Uživatelů + Prohlížeč logu Uživatelé + Nastavení + Šablony + Třetí strana + + Oprávnění uživatele + Typy uživatelů Nová aktualizace je připrvena @@ -929,23 +1778,46 @@ Chyba při kontrole aktualizace. Zkontrolujte, prosím, trasovací zásobník pro další informace + Přístupy + Na základě přiřazených skupin a počátečních uzlů má uživatel přístup k následujícím uzlům + Přiřadit přístup Administrátor Pole kategorie + Uživatel byl vytvořen Změnit heslo + Změnit fotku Změnit heslo + nebyl uzamčen + Heslo nebylo změněno Potvrdit heslo Můžete změnit své heslo pro přístup do administrace Umbraca vyplněním formuláře níže a kliknutím na tlačítko 'Změnit Heslo' Kanál obsahu + Vytvořit dalšího uživatele + Vytvořte nové uživatele a udělte mu přístup do Umbraco. Po vytvoření nového uživatele bude vygenerováno heslo, které s ním můžete sdílet. Popis Deaktivovat uživatele Typ dokumentu Editor Výtah + Neúspěšné pokusy o přihlášení + Přejít na uživatelský profil + Přidáním skupin přidělte přístup a oprávnění + Pozvat dalšího uživatele + Pozvěte nové uživatele, a poskytněte jim přístup do Umbraco. Uživatelům bude zaslán e-mail s pozvánkou a s informacemi o tom, jak se přihlásit do Umbraco. Pozvánky mají platnost 72 hodin. Jazyk + Nastavte jazyk, který uvidíte v nabídkách a dialogových oknech + Poslední datum uzamčení + Poslední přihlášení + Heslo bylo naposledy změněno Přihlašovací jméno Úvodní uzel v knihovně medií + Omezte knihovnu médií na konkrétní počáteční uzel + Úvodní uzly v knihovně medií + Omezte knihovnu médií na konkrétní počáteční uzly Sekce Deaktivovat přistup k Umbracu + se dosud nepřihlásil + Staré heslo Heslo Resetovat heslo Vyše heslo bylo změněno! @@ -959,13 +1831,526 @@ Nahradit oprávnění podřízených uzlů Nyní měníte oprávnění pro stránky: Vyberte stránky, pro které chcete měnit oprávnění + Odebrat fotografii + Výchozí oprávnění + Upřesnění oprávnění + Nastavte oprávnění pro konkrétní uzly + Profil Prohledat všechny podřízené uzly + Přidejte sekce, do kterých mají uživatelé přístup + Vybrat skupiny uživatelů + Nebyl vybrán žádný počáteční uzel + Nebyly vybrány žádné počáteční uzly Úvodní uzel v obsahu + Omezte strom obsahu na konkrétní počáteční uzel + Úvodní uzly obsahu + Omezte strom obsahu na konkrétní počáteční uzly + Uživatel byl naposledy aktualizován + byl vytvořen + Nový uživatel byl úspěšně vytvořen. Pro přihlášení do Umbraco použijte heslo níže. + Správa uživatelů Uživatelské jméno Oprávnění uživatele + Uživatelská skupina + byl pozván + Novému uživateli byla zaslána pozvánka s informacemi, jak se přihlásit do Umbraco. + Dobrý den, vítejte v Umbraco! Za pouhou 1 minutu budete moci používat Umbraco. Jenom od vás potřebujeme, abyste si nastavili heslo a přidali obrázek pro svůj avatar. + Vítejte v Umbraco! Vaše pozvánka bohužel vypršela. Obraťte se na svého správce a požádejte jej, aby jí znovu odeslal. + Nahrání vaší fotografie usnadní ostatním uživatelům, aby vás poznali. Kliknutím na kruh výše nahrajte svou fotku. Spisovatel + Změnit Váš profil Vaše nedávná historie Relace vyprší za + Pozvat uživatele + Vytvořit uživatele + Odeslat pozvánku + Zpět na seznam uživatelů + Umbraco: Pozvánka + + + + + + + + + + + +
        + + + + + +
        + +
        + +
        +
        + + + + + + +
        +
        +
        + + + + +
        + + + + +
        +

        + Zdravím Vás, %0%, +

        +

        + Byli jste pozváni %1% do CMS Umbraco. +

        +

        + Zpráva od %1%: +
        + %2% +

        + + + + + + +
        + + + + + + +
        + + Kliknutím na tento odkaz přijměte pozvání + +
        +
        +

        Pokud nemůžete kliknout na odkaz, zkopírujte a vložte tuto adresu URL do okna prohlížeče:

        + + + + +
        + + %3% + +
        +

        +
        +
        +


        +
        +
        + + ]]>
        + Pozvat + Zasílám pozvání... + Smazat uživatele + Opravdu chcete smazat tento uživatelský účet? + Vše + Aktivní + Zakázané + Uzamčeno + Pozváno + Neaktivní + Jméno (A-Z) + Jméno (Z-A) + Nejnovější + Nejstarší + Poslední přihlášení + Nebyly přidány žádné skupiny uživatelů + + + Validace + Ověřit jako e-mailovou adresu + Ověřit jako číslo + Ověřit jako URL + ...nebo zadat vlastní ověření + Pole je povinné + Zadat chybovou zprávu pro vlastní validaci (volitelné) + Zadat regulární výraz + Zadat chybovou zprávu pro vlastní validaci (volitelné) + Musíte přidat alespoň + Můžete jen mít + položky + vybrané položky + Neplatné datum + Není číslo + Neplatný e-mail + Hodnota nemůže být nulová + Hodnota nemůže být prázdná + Hodnota je neplatná, neodpovídá správnému vzoru + Vlastní ověření + %1% více.]]> + %1% příliš mnoho.]]> + + + + Hodnota je nastavena na doporučenou hodnotu: '%0%'. + Hodnota byla nastavena na '%1%' pro XPath '%2%' v konfiguračním souboru '%3%'. + Očekávaná hodnota '%1%' pro '%2%' v konfiguračním souboru '%3%', ale nalezeno '%0%'. + Nalezena neočekávaná hodnota '%0%' pro '%2%' v konfiguračním souboru '%3%'. + + Vlastní chyby jsou nastaveny na '%0%'. + Vlastní chyby jsou aktuálně nastaveny na '%0%'. Před nasazením se doporučuje nastavit na '%1%'. + Vlastní chyby byly úspěšně nastaveny na '%0%'. + MacroErrors jsou nastaveny na '%0%'. + MakroErrors jsou nastaveny na '%0%', což zabrání úplnému načtení některých nebo všech stránek na vašem webu, pokud dojde k chybám v makrech. Náprava nastaví hodnotu na '%1%'. + MakroErrors jsou nyní nastaveny na '%0%'. + + Try Skip IIS Custom Errors je nastaveno na '%0%' a používáte verzi IIS '%1%'. + Try Skip IIS Custom Errors je aktuálně nastaveno na '%0%'. Doporučuje se nastavit %1% pro vaši verzi služby IIS (%2%). + Try Skip IIS Custom Errors úspěšně nastaveno na '%0%'. + + Soubor neexistuje: '%0%'. + '% 0%' v konfiguračním souboru '% 1%'.]]> + Došlo k chybě, zkontrolujte ji v logu: %0%. + Databáze - Databázové schéma je pro tuto verzi Umbraco správné + Bylo zjištěno %0% problémů se schématem vaší databáze (podrobnosti najdete v logu) + Při ověřování databázového schématu vůči aktuální verzi Umbraco byly zjištěny některé chyby. + Certifikát vašeho webu je platný. + Chyba ověření certifikátu: '%0%' + Platnost SSL certifikátu vašeho webu vypršela. + Platnost certifikátu SSL vašeho webu vyprší za %0% dní. + Chyba při pingování adresy URL %0% - '%1%' + Aktuálně prohlížíte web pomocí schématu HTTPS. + AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na 'false'. Jakmile vstoupíte na tento web pomocí schématu HTTPS, mělo by být nastaveno na 'true'. + AppSetting 'Umbraco.Core.UseHttps' je v souboru web.config nastaven na '%0%', vaše cookies %1% jsou označeny jako zabezpečené. + V souboru web.config se nepodařilo aktualizovat nastavení 'Umbraco.Core.UseHttps'. Chyba: %0% + + Povolit HTTPS + Nastaví nastavení umbracoSSL na true v appSettings v souboru web.config. + AppSetting 'Umbraco.Core.UseHttps' je nyní nastaveno na 'true' v souboru web.config, vaše cookies budou označeny jako zabezpečené. + Fix + Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldNotEqual'. + Nelze opravit kontrolu pro porovnání hodnot pomocí 'ShouldEqual' s poskytnutou hodnotou. + Hodnota k opravě nebyla poskytnuta. + Režim kompilace ladění je zakázán. + Režim ladění je aktuálně povolen. Před spuštěním webu se doporučuje toto nastavení deaktivovat. + Režim ladění byl úspěšně deaktivován. + Režim sledování je deaktivován. + Režim sledování je aktuálně povolen. Před spuštěním se doporučuje toto nastavení deaktivovat. + Režim sledování byl úspěšně deaktivován. + Všechny složky mají nastavena správná oprávnění. + + %0%.]]> + %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> + Všechny soubory mají nastavena správná oprávnění. + + %0%.]]> + %0%. Pokud nejsou psány, není třeba podniknout žádné kroky.]]> + X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> + X-Frame-Options, které určuje, zda může být obsah webu zobrazen na jiném webu pomocí IFRAME.]]> + Nastavit záhlaví v Konfiguraci + Přidá hodnotu do sekce httpProtocol/customHeaders do web.config, aby se zabránilo tomu, že web může být zobrazen na jiném webu pomocí IFRAME. + Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které zabrání jinému webu, zobrazit tento web pomocí IFRAME. + Nelze aktualizovat soubor web.config. Chyba: %0% + X-Content-Type-Options použitá k ochraně před zranitelnostmi čichání MIME.]]> + X-Content-Type-Options použité k ochraně před zranitelnostmi čichání MIME nebyly nalezeny.]]> + Přidá hodnotu do sekce httpProtocol/customHeaders v souboru web.config, která chrání před zranitelnostmi MIME. + Do souboru web.config bylo přidáno nastavení pro vytvoření záhlaví, které chrání před zranitelnostmi MIME. + Strict-Transport-Security, také známo jako HSTS-header, bylo nalezeno.]]> + Strict-Transport-Security nebylo nalezeno.]]> + Do sekce httpProtocol/customHeaders v souboru web.config přidá záhlaví 'Strict-Transport-Security' s hodnotou 'max-age = 10886400'. Tuto opravu použijte pouze v případě, že vaše domény budou spuštěny s https po dobu příštích 18 týdnů (minimálně). + Do vašeho souboru web.config bylo přidáno záhlaví HSTS. + X-XSS-Protection bylo nalezeno.]]> + X-XSS-Protection bylo nalezeno.]]> + Přidá záhlaví 'X-XSS-Protection' s hodnotou '1; mode=block' do sekce httpProtocol/customHeaders v souboru web.config. + Záhlaví X-XSS-Protection bylo přidáno do vašeho souboru web.config. + + %0%.]]> + Nebyly nalezeny žádné hlavičky odhalující informace o technologii webových stránek. + V souboru Web.config nelze najít system.net/mailsettings. + V části system.net/mailsettings v souboru web.config není hostitel nakonfigurován. + Nastavení SMTP jsou správně nakonfigurována a služba funguje jak má. + Server SMTP konfigurovaný s hostitelem '%0%' a portem '%1%' nelze nalézt. Zkontrolujte prosím, zda jsou nastavení SMTP v souboru Web.config a v sekci system.net/mailsettings správná. + %0%.]]> + %0%.]]> +

        Výsledky plánovaných kontrol Umbraco Health Checks provedených na %0% v %1% jsou následující:

        %2%]]>
        + Stav Umbraco Health Check: %0% + Zkontrolovat všechny skupiny + Zkontrolovat skupinu + + Kontrola vyhodnocuje různé oblasti vašeho webu z hlediska nastavení osvědčených postupů, konfigurace, potenciálních problémů atd. Problémy lze snadno vyřešit stisknutím tlačítka. Můžete přidat své vlastní kontroly, podívejte se na dokumentaci pro více informací o vlastních kontrolách.

        + ]]> +
        + + + Zakázat sledování URL + Povolit sledování URL + Jazyk + Originální URL + Přesměrováno na + Správa URL přesměrování + Na tuto položku obsahu přesměrovávají následující adresy URL: + Nebyla provedena žádná přesměrování + Jakmile bude publikovaná stránka přejmenována nebo přesunuta, bude automaticky provedeno přesměrování na novou stránku. + Opravdu chcete odstranit přesměrování z '%0%' na '%1%'? + Přesměrování bylo odstraněno. + Chyba při odebírání URL přesměrování. + Toto odstraní přesměrování + Opravdu chcete zakázat sledování URL adres? + Sledování URL adres je nyní zakázáno. + Při deaktivaci sledování URL adres došlo k chybě, další informace naleznete v logu. + Sledování URL adres je nyní povoleno. + Chyba při povolení sledování URL adres, další informace lze nalézt v logu. + + + Žádné položky ze slovníku na výběr + + + %0% znaků.]]> + %1% je moc.]]> + + + Obsah s ID: {0} v koši souvisí s původním nadřazeným obsahem s ID: {1} + Média s ID: {0} v koši souvisí s původním nadřazeným médiem s ID: {1} + Tuto položku nelze automaticky obnovit + Neexistuje žádné místo, kde lze tuto položku automaticky obnovit. Položku můžete přesunout ručně pomocí stromu níže. + byla obnovena pod + + + Směr + Nadřazený s potomkem + Obousměrný + Nadřazená + Potomek + Počet + Vazby + Vytvořeno + Komentář + Název + Žádné vazby pro tento typ vazby. + Typ vazby + Vazby + + + Začínáme + Správa přesměrování + Obsah + Vítejte + Správa Examine + Stav publikování + Tvůrce modelů + Health Check + Profilování + Začínáme + Instalovat Umbraco formuláře + + + Jít zpět + Aktivní rozvržení: + Skočit do + skupina + prošlo + varování + selhalo + návrh + Kontrola prošla + Kontrola selhala + Otevřít hledání v backoffice + Otevřít/zavřít nápovědu backoffice + Otevřít/zavřít možnosti vašeho profilu + Otevřít kontextové menu pro + Aktuální jazyk + Přepnout jazyk na + Vytvořit novou složku + Částečná šablona + Makro částečné šablony + Člen + Datový typ + Prohledat přesměrování + Prohledat skupiny uživatelů + Prohledat uživatele + Vytvořit položku + Vytvořit + Upravit + Název + + + Závislosti + Tento datový typ nemá žádné závislosti. + Použito v dokumentových typech + Žádné vazby na typy dokumentů. + Použito v typech médií + Žádné vazby na typy médií. + Použito v typech členů + Žádné vazby na typy členů. + Použito v + Použito v dokumentech + Použito ve členech + Použito v médiích + + + Úrovně logování + Uložená vyhledávání + Celkem položek + Časové razítko + Úroveň + Stroj + Zpráva + Výjimka + Vlastnosti + Vyhledat na Googlu + Vyhledat zprávu na Googlu + Vyhledat na Bing + Vyhledat zprávu na Bing + Prohledat naše Umbraco + Vyhledat tuto zprávu na našich fórech a dokumentech Umbraco + Vyhledat Our Umbraco na Googlu + Prohledat Our Umbraco fóra pomocí Googlu + Prohledat Umbraco Source + Vyhledat ve zdrojovém kódu Umbraco na Github + Prohledat Umbraco Issues + Prohledat Umbraco Issues na Github + Smazat toto vyhledávání + Najít logy s ID požadavku + Najít logy se jmenným prostorem + Najít logy s názvem stroje + Otevřít + + + Kopírovat %0% + %0% z %1% + Odebrat všechny položky + + + Otevřít akce vlastností + + + Čekejte + Stav obnovení + Cache paměť + + + + Znovu načíst + Cache databáze + + Znovuvytvoření může být náročné. Použijte jej, když nestačí obnovení stránky, a domníváte se, že mezipaměť databáze nebyla správně vygenerována - což by naznačovalo možný kritický problém Umbraco. + ]]> + + Obnovit + Internals + + nebudete muset používat. + ]]> + + Sběr + Stav publikované mezipaměti + Mezipaměti + + + Profilování výkonu + + Umbraco aktuálně běží v režimu ladění. To znamená, že můžete použít vestavěný profiler výkonu k vyhodnocení výkonu při vykreslování stránek.

        Pokud chcete aktivovat profiler pro konkrétní vykreslení stránky, jednoduše při požadavku na stránku jednoduše přidejte umbDebug=true do URL.

        Pokud chcete, aby byl profiler ve výchozím nastavení aktivován pro všechna vykreslení stránky, můžete použít přepínač níže. Ve vašem prohlížeči nastaví soubor cookie, který automaticky aktivuje profiler. Jinými slovy, profiler bude ve výchozím nastavení aktivní pouze ve vašem prohlížeči, ne v ostatních.

        + ]]> +
        + Ve výchozím stavu aktivovat profiler + Přátelské připomenutí + + + Nikdy byste neměli nechat produkční web běžet v režimu ladění. Režim ladění je vypnut nastavením debug="false" na elementu compilation v souboru web.config. +

        + ]]> +
        + + + Umbraco v současné době neběží v režimu ladění, takže nemůžete použít vestavěný profiler. Takto by to mělo být pro produkční web. +

        +

        + Režim ladění je zapnut nastavením debug="true" na elementu compilation v souboru web.config. +

        + ]]> +
        + + + Hodiny tréninkových videí Umbraco jsou blíž než si myslíte + + Chcete ovládnout Umbraco? Stačí strávit pár minut sledování jednoho z těchto videí o používání Umbraco. Nebo navštivte umbraco.tv , kde najdete ještě více videí o Umbraco

        + ]]> +
        + Chcete-li začít + + + Začněte zde + Tato část obsahuje stavební bloky pro váš web Umbraco. Podle níže uvedených odkazů se dozvíte více o práci s položkami v části Nastavení + Zjistit více + + v sekci Dokumentace v Our Umbraco + ]]> + + + fóru komunity + ]]> + + + výuková videa (některá jsou zdarma, jiná vyžadují předplatné) + ]]> + + + nástrojích zvyšujících produktivitu a komerční podpoře + ]]> + + + školení a certifikace + ]]> + + + + Vítejte v přátelském CMS + Děkujeme, že jste si vybrali Umbraco - myslíme si, že by to mohl být začátek něčeho krásného. I když se to může zpočátku zdát ohromující, udělali jsme hodně pro to, aby byla křivka učení co nejhladší a nejrychlejší. + + + Umbraco formuláře + Vytvářejte formuláře pomocí intuitivního rozhraní drag and drop. Od jednoduchých kontaktních formulářů, které odesílají e-maily, až po pokročilé dotazníky, které se integrují do systémů CRM. Vaši klienti to budou milovat!
        diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml index fef9c1cf82..6242d72146 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/da.xml @@ -472,6 +472,7 @@ Vælg medlemstype Vælg node Vælg sektioner + Vælg bruger Vælg brugere Ingen ikoner blev fundet Der er ingen parametre for denne makro @@ -1784,8 +1785,10 @@ Mange hilsner fra Umbraco robotten Brugt af + Slet gemte søgning Log type - Gemte søgninger + Gem søgning + Indtast et navn for din søgebetingelse Samlet resultat Dato Type diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml index 529074f24d..86b1d6c130 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/de.xml @@ -4,10 +4,6 @@ The Umbraco community https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files - - - - Kulturen und Hostnamen Protokoll diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml index d72179fc75..481d20f777 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en.xml @@ -499,6 +499,7 @@ Select member type Select node Select sections + Select user Select users No icons were found There are no parameters for this macro @@ -2047,7 +2048,10 @@ To manage your website, simply open the Umbraco back office and start adding con Enter a custom validation error message (optional) You need to add at least You can only have + Add up to items + url(s) + url(s) selected items selected Invalid date Not a number @@ -2265,6 +2269,9 @@ To manage your website, simply open the Umbraco back office and start adding con Name Add new row View more options + Has translation + Missing translation + Dictionary items References @@ -2281,32 +2288,36 @@ To manage your website, simply open the Umbraco back office and start adding con Used in Media - Log Levels - Saved Searches - Total Items - Timestamp - Level - Machine - Message - Exception - Properties - Search With Google - Search this message with Google - Search With Bing - Search this message with Bing - Search Our Umbraco - Search this message on Our Umbraco forums and docs - Search Our Umbraco with Google - Search Our Umbraco forums using Google - Search Umbraco Source - Search within Umbraco source code on Github - Search Umbraco Issues - Search Umbraco Issues on Github - Delete this search - Find Logs with Request ID - Find Logs with Namespace - Find Logs with Machine Name - Open + Delete Saved Search + Log Levels + Saved Searches + Save Search + Enter a friendly name for your search query + Filter Search + Total Items + Timestamp + Level + Machine + Message + Exception + Properties + Search With Google + Search this message with Google + Search With Bing + Search this message with Bing + Search Our Umbraco + Search this message on Our Umbraco forums and docs + Search Our Umbraco with Google + Search Our Umbraco forums using Google + Search Umbraco Source + Search within Umbraco source code on Github + Search Umbraco Issues + Search Umbraco Issues on Github + Delete this search + Find Logs with Request ID + Find Logs with Namespace + Find Logs with Machine Name + Open Copy %0% @@ -2316,6 +2327,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open Property Actions + Close Property Actions Wait diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml index 41efb12f51..9113e94e62 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/en_us.xml @@ -503,6 +503,7 @@ Select member type Select node Select sections + Select user Select users No icons were found There are no parameters for this macro @@ -673,6 +674,7 @@ Continue Copy Create + Crop section Database Date Default @@ -2063,7 +2065,10 @@ To manage your website, simply open the Umbraco back office and start adding con Enter a custom validation error message (optional) You need to add at least You can only have + Add up to items + url(s) + url(s) selected items selected Invalid date Not a number @@ -2285,6 +2290,9 @@ To manage your website, simply open the Umbraco back office and start adding con Name Add new row View more options + Has translation + Missing translation + Dictionary items References @@ -2301,8 +2309,12 @@ To manage your website, simply open the Umbraco back office and start adding con Used in Media + Delete Saved Search Log Levels Saved Searches + Save Search + Enter a friendly name for your search query + Filter Search Total Items Timestamp Level @@ -2336,6 +2348,7 @@ To manage your website, simply open the Umbraco back office and start adding con Open Property Actions + Close Property Actions Wait diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml index b5d1c8feb2..b83ee4f9fe 100644 --- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml +++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/fr.xml @@ -12,8 +12,8 @@ Copier Créer Exporter - Créer un groupe Créer un package + Créer un groupe Supprimer Désactiver Vider la corbeille @@ -30,17 +30,21 @@ Dépublier Rafraîchir Republier le site tout entier + Renommer Récupérer Spécifiez les permissions pour la page %0% + Choisissez où copier Choisissez où déplacer dans l'arborescence ci-dessous + a été déplacé vers + a été copié vers + a été supprimé Permissions Version antérieure Envoyer pour publication Envoyer pour traduction Spécifier le groupe Trier - Envoyer pour publication Traduire Mettre à jour Spécifier les permissions @@ -65,6 +69,7 @@ Permettre de déplacer un noeud Permettre de définir et modifier l'accès public à un noeud Permettre de publier un noeud + Permettre d'annuler la publication d'un noeud Permettre de modifier les permissions pour un noeud Permettre de revenir à une situation antérieure Permettre d'envoyer un noeud pour approbation avant publication @@ -74,6 +79,10 @@ Permettre de sauvegarder un noeud Permettre la création d'un Modèle de Contenu + + Contenu + Info + Permission refusée. Ajouter un nouveau domaine @@ -88,15 +97,15 @@ Domaine '%0%' déjà assigné Domaine '%0%' mis à jour Editer les domaines actuels + + Hériter Culture ou hériter de la culture des noeuds parents. S'appliquera aussi
        au noeud courant, à moins qu'un domaine ci-dessous soit aussi d'application.]]>
        Domaines - - Aperçu pour - Vider la sélection Choisir @@ -117,25 +126,66 @@ Liste numérique Insérer une macro Insérer une image + Publier et fermer + Publier avec les descendants Editer les relations Retourner à la liste Sauver + Sauver et fermer Sauver et publier Sauver et planifier Sauver et envoyer pour approbation Sauver la mise en page de la liste + Planifier Prévisualiser + Prévisualiser La prévisualisation est désactivée car aucun modèle n'a été assigné. Choisir un style Afficher les styles Insérer un tableau + Générer les modèles et fermer Sauver et générer les modèles Défaire Refaire + Restaurer + Supprimer un tag + Annuler + Confirmer + Options de publication supplémentaires + + + Aperçu pour + Contenu supprimé + Contenu dé-publié + Contenu dé-publié pour les langues : %0% + Contenu publié + Contenu publié pour les langues : %0% + Contenu sauvegardé + Contenu sauvegardé pour les langues : %0% + Contenu déplacé + Contenu copié + Contenu restauré + Contenu envoyé pour publication + Contenu envoyé pour publication pour les langues : %0% + Ordonnancement des sous-éléments réalisé par l'utilisateur + Copier + Publier + Publier + Déplacer + Sauvegarder + Sauvegarder + Supprimer + Annuler publication + Annuler publication + Restaurer + Envoyer pour publication + Envoyer pour publication + Ordonner + Historique (toutes variantes) Pour changer le type de document du contenu séléctionné, faites d'abord un choix dans la liste des types valides à cet endroit. - Puis modifiez si nécessaire la correspondance des propriétés du type actuel vers le nouveau, et cliquez sur Sauver. + Puis confirmez et/ou modifiez la correspondance des propriétés du type actuel vers le nouveau, et cliquez sur Sauver. Le contenu a été republié. Propriété actuelle Type actuel @@ -153,6 +203,12 @@ Impossible de terminer la correspondance des propriétés car une ou plusieurs propriétés ont plus d'une correspondance définie. Seuls les types de documents valides à cet endroit sont affichés. + + Echec de la création d'un dossier sous le parent avec l'ID %0% + Echec de la création d'un dossier sous le parent avec le nom %0% + Le nom du dossier ne peut pas contenir de caractères illégaux. + Echec de la suppression de l'élément : %0% + A été publié A propos de cette page @@ -184,15 +240,20 @@ Aucune date choisie Titre de la page Ce média n'a pas de lien + Aucun contenu ne peut être ajouté pour cet élément Propriétés Ce document est publié mais n'est pas visible car son parent '%0%' n'est pas publié - Oups : ce document est publié mais n'est pas présent dans le cache (erreur interne Umbraco) + Cette culture est publiée mais n'est pas visible car elle n'est pas publiée pour le parent '%0%' + Ce document est publié mais n'est pas présent dans le cache Oups: impossible d'obtenir cet url (erreur interne - voir fichier log) - Oups: ce document est publié mais son url entrerait en collision avec le contenu %0% + Ce document est publié mais son url entrerait en collision avec le contenu %0% + Ce document est publié mais son url ne peut pas être routé Publier Publié Publié (changements en cours) Statut de publication + Publier avec ses descendants pour publier %0% et tous les éléments de contenu en-dessous, rendant de ce fait leur contenu accessible publiquement.]]> + Publier avec ses descendants pour publier les langues sélectionnées et les mêmes langues des éléments de contenu en-dessous, rendant de ce fait leur contenu accessible publiquement.]]> Publié le Dépublié le Supprimer la date @@ -205,6 +266,7 @@ Type Dépublier Dépublié + Non créé Dernière édition Date/heure à laquelle ce document a été édité Supprimer le(s) fichier(s) @@ -215,13 +277,35 @@ Cible Ceci se traduit par l'heure suivante sur le serveur : Qu'est-ce que cela signifie?]]> - Etes-vous certain(e) de vouloir supprimer cet éléménent? + Etes-vous certain(e) de vouloir supprimer cet élément? + Etes-vous certain(e) de vouloir supprimer tous les éléments? La propriété %0% utilise l'éditeur %1% qui n'est pas supporté par Nested Content. + Aucun type de contenu n'est configuré pour cette propriété. + Ajouter un type d'élément + Sélectionner un type d'élément Ajouter un autre champ texte Enlever ce champ texte Racine du contenu + Inclure les brouillons : publier également les éléments de contenu non publiés. Cette valeur est masquée. Si vous avez besoin de pouvoir accéder à cette valeur, veuillez prendre contact avec l'administrateur du site web. Cette valeur est masquée. + Quelles langues souhaitez-vous publier? Toutes les langues ayant du contenu ont été sauvegardées! + Quelles langues souhaitez-vous publier? + Quelles langues souhaitez-vous sauvegarder? + Toutes les langues avec du contenu sont sauvegardées lors de la création! + Quells langues souhaitez-vous envoyer pour approbation? + Quelles langues souhaitez-vous planifier? + Sélectionnez les langues à dépublier. La dépublication d'une langue obligatoire provoquera la dépublication de toutes les langues. + Langues publiées + Langues non publiées + Langues non modifiées + Ces langues n'ont pas été créées + Prêt.e à publier? + Prêt.e à sauvegarder? + Envoyer pour approbation + Sélectionnez la date et l'heure de publication/dépublication de l'élément de contenu. + Créer nouveau + Copier du clipboard Créer un nouveau Modèle de Contenu à partir de '%0%' @@ -235,22 +319,38 @@ Cliquez pour télécharger ou cliquez ici pour choisir un fichier + Vous pouvez faire glisser des fichiers ici pour télécharger. Ce fichier ne peut pas ête chargé, il n'est pas d'un type de fichier autorisé. La taille maximum de fichier est Racine du média + Echec du déplacement du média + Les dossiers parent et destination ne peuvent pas être identiques + Echec de la copie du media + Echec de la création d'un dossier sous le parent avec l'id %0% + Echec du changement de nom du dossier avec l'id %0% + Glissez et déposez vos fichiers dans la zone Créer un nouveau membre Tous les membres + Les groupes de membres n'ont pas de propriétés supplémentaires modifiables. Où voulez-vous créer le nouveau %0% Créer un élément sous Sélectionnez le type de document pour lequel vous souhaitez créer un modèle de contenu + Introduisez un nom de dossier Choisissez un type et un titre - "Types de documents".]]> - "Types de médias".]]> - Type de document sans modèle + Types de documents sous la section Paramètres, en modifiant les Types de noeuds enfants autorisés sous les Permissions.]]> + Types de documents sous la section Paramètres.]]> + La page sélectionnée dans l'arborescence de contenu n'autorise pas la création de pages sous elle. + Modifier les permissions pour ce type de document + Créer un nouveau type de document + Types de documents sous la section Paramètres, en modifiant l'option Autoriser comme racine sous les Permissions.]]> + Types de médias dans la section Paramètres, en modifiant les Types de noeuds enfants autorisés sous les Permissions.]]> + Le media sélectionné dans l'arborescence n'autorise pas la création d'un autre media sous lui. + Modifier les permissions pour ce type de media + Type de document sans modèle Nouveau répertoire Nouveau type de données Nouveau fichier javascript @@ -259,6 +359,8 @@ Nouvelle vue partielle à partir d'un snippet Nouvelle macro pour vue partielle à partir d'un snippet Nouvelle macro pour vue partielle (sans macro) + Nouveau fichier de feuille de style + Nouveau fichier de feuille de style pour l'éditeur de texte Parcourir votre site @@ -274,7 +376,10 @@ Invalider les changements Vous avez des changements en cours Etes-vous certain(e) de vouloir quitter cette page? - vous avez des changements en cours - La dépublication va supprimer du site cette page ainsi que tous ses descendants. + La publication rendra les éléments sélectionnés visibles sur le site. + La suppression de la publication supprimera du site les éléments sélectionnés et tous leurs descendants. + La suppression de la publication supprimera du site cette page ainsi que tous ses descendants. + Vous avez des modifications en cours. Modifier le Type de Document fera disparaître ces modifications. Terminé @@ -302,8 +407,8 @@ Titre du lien Lien + Ancrage / requête Nom - Gérer les noms d'hôtes Fermer cette fenêtre Êtes-vous certain(e) de vouloir supprimer Êtes-vous certain(e) de vouloir désactiver @@ -312,6 +417,7 @@ Couper Editer une entrée du Dictionnaire Modifier la langue + Modifier le media sélectionné Insérer un lien local (ancre) Insérer un caractère Insérer un entête graphique @@ -319,18 +425,21 @@ Insérer un lien Insérer une macro Insérer un tableau + Ceci supprimera la langue + Modifier la culture d'une langue peut être une opération lourde qui aura pour conséquence la réinitialisation de la cache de contenu et des index Dernière modification Lien Lien interne : Si vous utilisez des ancres, insérez # au début du lien Ouvrir dans une nouvelle fenêtre? + Paramètres de la macro Cette macro ne contient aucune propriété éditable Coller Editer les permissions pour Définir les permissions pour Définir les permissions pour %0% pour le groupe d'utilisateurs %1% Sélectionnez les groupes d'utilisateurs pour lesquels vous souhaitez définir les permissions - Les éléments dans la corbeille sont en cours de suppression. Ne fermez pas cette fenêtre avant que cette opération soit terminée. + Les éléments dans la corbeille sont en cours de suppression. Veuillez ne pas fermer cette fenêtre avant que cette opération ne soit terminée. La corbeille est maintenant vide Les éléments supprimés de la corbeille seront supprimés définitivement regexlib.com rencontre actuellement des problèmes sur lesquels nous n'avons aucun contrôle. Nous sommes sincèrement désolés pour le désagrément.]]> @@ -353,14 +462,17 @@ Lier à un media Sélectionner le noeud de base du contenu Sélectionner le media + Sélectionner le type de media Sélectionner l'icône Sélectionner l'élément Sélectionner le lien Sélectionner la macro Sélectionner le contenu + Sélectionner le type de contenu Sélectionner le noeud de base des media Sélectionner le membre Sélectionner le groupe de membres + Sélectionner le type de membre Sélectionner le noeud Sélectionner les sections Sélectionner les utilisateurs @@ -376,10 +488,14 @@ compte Sélectionner un éditeur Selectionner un snippet + Ceci supprimera le noeud et toutes ses langues. Si vous souhaitez supprimer une langue spécifique, vous devriez plutôt supprimer la publication du noeud dans cette langue-là. + + + Il n'y a pas d'éléments dans le dictionnaire. %0%' ci-dessous. + Editez les différentes versions de langues pour l'élément de dictionnaire '%0%' ci-dessous. ]]> Nom de Culture Aperçu du dictionaire + + Recherches configurées + Affiche les propriétés et les outils de chaque Recherche configurée (e.g. une recherche multi-index) + Valeurs du champ + Etat de santé + L'état de santé de l'index et s'il peut être lu + Indexeurs + Info Index + Liste les propriétés de l'index + Gérer les index d'Examine + Vous permet de voir les détails de chaque index et fournit des outils pour gérer les index + Reconstruire l'index + + Cela pourrait prendre un certain temps en fonction de la quantité de contenu présente dans votre site.
        + Il est déconseillé de reconstruire un index pendant les périodes de trafic intense sur le site web ou quand les éditeurs sont en train d'éditer du contenu. + ]]> +
        + Recherches + Rechercher dans l'index et afficher les résultats + Outils + Outils pour gérer l'index + champs + L'index ne peut pas être lu et devra être reconstruit + Le processus dure plus de temps que prévu, vérifiez les logs Umbraco afin de voir s'il y a eu des erreurs pendant cette opératon + Cet index ne peut pas être reconstruit parce qu'on ne lui a pas assigné de + IIndexPopulator + Votre nom d'utilisateur Votre mot de passe @@ -403,10 +547,18 @@ Entrez votre email Entrez un message... Votre nom d'utilisateur est généralement votre adresse email + #value ou ?key=value + Introduisez l'alias... + Génération de l'alias... + Créer un élément + Créer + Modifier + Nom Créer une liste personnalisée Supprimer la liste personnalisée + Il existe déjà un type de contenu, un tye de media ou un type de membre avec cet alias Renommé @@ -432,9 +584,11 @@ Sélectionnez le répertoire où déplacer dans l'arborescence ci-dessous a été déplacé sous + %0% supprimera les propriétés et leurs données des éléments suivants]]> + Je comprends que cette action va supprimer les propriétés et les données basées sur ce Type de Données - Vos données ont été sauvegardées, mais avant de pouvoir publier votre page, il y a des erreurs que vous devez corriger : + Vos données ont été sauvegardées, mais avant de pouvoir publier votre page, il y a des erreurs que vous devez d'abord corriger : Le Membership Provider n'autorise pas le changement des mots de passe (EnablePasswordRetrieval doit être défini à true) %0% existe déjà Des erreurs sont survenues : @@ -459,8 +613,9 @@ Noeud de départ supprimé, contactez votre administrateur Veuillez sélectionner du contenu avant de changer le style Aucun style actif disponible - Veuillez placer le curseur à gauche des deux cellules que vous voulez fusionner + Veuillez placer le curseur à la gauche des deux cellules que vous voulez fusionner Vous ne pouvez pas scinder une cellule qui n'a pas été fusionnée. + Cette propriété n'est pas valide Options @@ -472,6 +627,7 @@ Tout Êtes-vous certain(e)? Retour + Retour à l'aperçu Bord par Annuler @@ -483,6 +639,7 @@ Confirmer Conserver Conserver les proportions + Contenu Continuer Copier Créer @@ -502,16 +659,21 @@ Eléments Email Erreur + Champ Trouver Premier + Point focal Général Groupes + Groupe Hauteur Aide Cacher Historique Icône + Id Importer + Inclure les sous-dossiers dans la recherche Info Marge intérieure Insérer @@ -548,9 +710,11 @@ Un moment s'il vous plaît... Précédent Propriétés + Reconstruire Email de réception des données de formulaire Corbeille Votre corbeille est vide + Rafraîchir Restant Enlever Renommer @@ -564,6 +728,7 @@ Désolé, nous ne pouvons pas trouver ce que vous recherchez Aucun élément n'a été ajouté Serveur + Paramètres Montrer Afficher la page à l'envoi Taille @@ -572,6 +737,7 @@ Envoyer Type Rechercher... + sous Haut Mettre à jour Upgrader @@ -611,8 +777,8 @@ Parcourir les sections Raccourcis afficher les raccourcis - Passer à la vue en liste - Basculer vers l'autorisation comme racine + Activer / Désactiver la vue en liste + Activer / Désactiver l'autorisation comme racine Commenter/Décommenter les lignes Supprimer la ligne Copier les lignes vers le haut @@ -621,6 +787,7 @@ Déplacer les lignes vers le bas Général Editeur + Activer / Désactiver les variantes de culture Couleur de fond @@ -875,6 +1042,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Editez vos notifications pour %0% + Paramètres de notification enregistrés pour + Les langues suivantes ont été modifiées : %0% @@ -966,29 +1135,50 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à ]]> + Les langues suivantes ont été modifiées :

        + %0% + ]]>
        La notification [%0%] à propos de %1% a été executée sur %2% Notifications + Actions + Créé + Créer un package et localisez le package. Les packages Umbraco ont généralement une extension ".umb" ou ".zip". ]]> + Ceci va supprimer le package Déposez pour uploader + Inclure tous les noeuds enfant ou cliquez ici pour choisir les fichiers Uploader un package Installez un package local en le sélectionnant sur votre ordinateur. Installez uniquement des packages de sources fiables que vous connaissez Uploader un autre package Annuler et uploader un autre package - Licence J'accepte les conditions d'utilisation - Installer le package - Terminer + Chemin du fichier + Le chemin absolu du fichier (eg: /bin/umbraco.bin) + Installé Packages installés + Installer localement + Terminer + Ce package n'a pas de vue de configuration + Aucun package n'a encore été créé Vous n'avez aucun package installé 'Packages' en haut à droite de votre écran]]> - Chercher des packages + Actions du package + URL de l'auteur + Contenu du package + Fichiers du package + URL de l'icone + Installer le package + Licence + URL de la licence + Propriétés du package + Chercher des packages Résultats pour Nous n'avons rien pu trouver pour Veuillez essayer de chercher un autre package ou naviguez à travers les catégories @@ -1025,6 +1215,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Remarque : tous les documents, media etc. dépendant des éléments que vous supprimez vont cesser de fonctionner, ce qui peut provoquer une instabilité du système, désinstallez donc avec prudence. En cas de doute, contactez l'auteur du package.]]> Version du package + Mise à jour à partir de la version Package déjà installé Ce package ne peut pas être installé, il nécessite au minimum la version Umbraco %0% Désinstallation... @@ -1043,24 +1234,29 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Coller, mais supprimer le formatage (recommandé) - Protection basée sur les rôles - via les groupes de membres Umbraco.]]> - Vous devez créer un groupe avant de pouvoir utiliser l'authentification basée sur les rôles + Protection basée sur les groupes + Si vous souhaitez donner accès à tous les utilisateurs de groupes de membres spécifiques + Vous devez créer un groupe de membres avant de pouvoir utiliser la protection basée sur les groupes Page d'erreur Utilisé pour les personnes connectées, mais qui n'ont pas accès - Choisissez comment restreindre l'accès à cette page - %0% est maintenant protégée - Protection supprimée de %0% + %0%]]> + %0% est maintenant protégée]]> + %0% supprimée]]> Page de connexion Choisissez la page qui contient le formulaire de connexion - Supprimer la protection + Supprimer la protection... + %0%?]]> Choisissez les pages qui contiennent le formulaire de connexion et les messages d'erreur - Choisissez les rôles qui ont accès à cette page - Définissez l'identifiant et le mot de passe pour cette page - Protection utilisateur unique - Si vous souhaitez mettre en place une protection simple utilisant un identifiant et un mot de passe uniques + %0%]]> + %0%]]> + Protection pour des membres spécifiques + Si vous souhaitez donner accès à des membres spécifiques + Permissions utilisateur insuffisantes pour publier tous les documents enfants. + @@ -1076,7 +1272,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à - Inclure les pages enfant non publiées + + La validation a échoué pour la langue obligatoire '%0%'. Cette langue a été sauvegardée mais pas publiée. Publication en cours - veuillez patienter... %0% pages sur %1% ont été publiées... %0% a été publié @@ -1090,12 +1287,15 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Vous n'avez configuré aucune couleur approuvée + Vous pouvez uniquement sélectionner des éléments du(des) type(s) : %0% Vous avez choisi un élément de contenu actuellement supprimé ou dans la corbeille Vous avez choisi des éléments de contenu actuellement supprimés ou dans la corbeille + Elément supprimé Vous avez choisi un élément media actuellement supprimé ou dans la corbeille Vous avez choisi des éléments media actuellement supprimés ou dans la corbeille + Mis dans la corbeille introduire un lien externe @@ -1108,11 +1308,13 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Réinitialiser - Définir le recadrage Sauvegarder le recadrage Ajouter un nouveau recadrage + Terminé + Annuler les modifications + Sélectionnez une version à comparer avec la version actuelle Version actuelle Le texte en Rouge signifie qu'il a été supprimé de la version choisie, vert signifie ajouté]]> Le document a été restauré à une version antérieure @@ -1125,20 +1327,14 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Editer le fichier de script - Concierge Contenu - Courier - Développeur - Assistant de configuration Umbraco + Formulaires Medias Membres - Newsletters + Packages Configuration - Statistiques Traduction Utilisateurs - Aide - Formulaires Les meilleurs tutoriels vidéo Umbraco @@ -1158,14 +1354,16 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Ce type de contenu utilise en tant que type de contenu de base. Les onglets du type de contenu de base ne sont pas affichés et peuvent seulement être modifiés à partir du type de contenu de base lui-même. Aucune propriété définie dans cet onglet. Cliquez sur le lien "Ajouter une nouvelle propriété" en-haut pour créer une nouvelle propriété. + Créer le template correspondant Ajouter une icône Ordre de tri Date de création Tri achevé. - Faites glisser les différents éléments vers le haut ou vers le bas pour définir la manière dont ils doivent être organisés. Ou cliquez sur les entêtes de colonnes pour trier la collection complète d'éléments + Faites glisser les différents éléments vers le haut ou vers le bas pour définir la manière dont ils doivent être organisés. Ou cliquez sur les en-têtes de colonnes pour trier la collection complète d'éléments + Ce noeud n'a aucun noeud enfant à trier Validation @@ -1175,7 +1373,6 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Permissions utilisateur insuffisantes, l'opération n'a pas pu être complétée Annulation L'opération a été annulée par une extension tierce - La publication a été annulée par une extension tierce. Le type de propriété existe déjà Type de propriété créé Type de données : %1%]]> @@ -1189,16 +1386,22 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Feuille de style sauvegardée sans erreurs Type de données sauvegardé Elément de dictionnaire sauvegardé - La publication a échoué car la page parent n'est pas publiée Contenu publié et visible sur le site + %0% documents publiés et visibles sur le site web + %0% publié et visible sur le site web + %0% documents publiés pour la langue %1% et visibles sur le site web Contenu sauvegardé N'oubliez pas de publier pour rendre les modifications visibles + Un planning de publication a été mis à jour + %0% sauvegardé Envoyer pour approbation Les modifications ont été envoyées pour approbation + %0% modifications ont été envoyées pour approbation Media sauvegardé Media sauvegardé sans erreurs Membre sauvegardé + Groupe de membres sauvegardé Propriété de feuille de style sauvegardée Feuille de style sauvegardée Modèle sauvegardé @@ -1213,11 +1416,14 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Langue sauvegardée Type de média sauvegardé Type de membre sauvegardé + Groupe de membres sauvegardé Modèle non sauvegardé Assurez-vous de ne pas avoir 2 modèles avec le même alias. Modèle sauvegardé Modèle sauvegardé sans aucune erreurs ! Contenu publié + Variation de contenu %0% dépubliée + La langue obligatoire '%0%' a été dépubliée. Toutes les langues pour cet éléménent de contenu sont maintenant dépubliées. Vue partielle sauvegardée Vue partielle sauvegardée sans erreurs ! Vue partielle non sauvegardée @@ -1237,16 +1443,35 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à L'utilisateur %0% a été supprimé Inviter l'utilisateur L'invitation a été envoyée à nouveau à %0% + Impossible de publier le document car la langue obligatoire '%0%' n'est pas publiée + La validation a échoué pour la langue '%0%' + Le Type de Document a été exporté dans le fichier + Une erreur est survenue durant l'export du type de document + La date de publication ne peut pas être dans le passé + Impossible de planifier la publication du document car la langue obligatoire '%0%' n'est pas publiée + Impossible de planifier la publication du document car la langue obligatoire '%0%' a une date de publication postérieure à celle d'une langue non obligatoire + La date d'expiration ne peut pas être dans le passé + La date d'expiration ne peut pas être antérieure à la date de publication - Utilise la syntaxe CSS. Ex : h1, .redHeader, .blueTex + Ajouter un style + Modifier un style + Styles pour l'éditeur de texte + Definir les styles qui doivent êtres disponibles dans l'éditeur de texte pour cette feuille de style Editer la feuille de style Editer la propriété de feuille de style Donner un nom pour identifier la propriété dans le Rich Text Editor Prévisualiser + L'apparence qu'aura le text dans l'éditeur de texte. + Sélecteur + Utilise la syntaxe CSS. Ex : "h1" ou ".redHeader" Styles + Le CSS qui devrait être appliqué dans l'éditeur de texte, e.g. "color:red;" + Code + Editeur de Texte + Echec de la suppression du modèle avec l'ID %0% Editer le modèle Sections Insérer une zone de contenu @@ -1293,6 +1518,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Générateur de requêtes éléments trouvés, en + copier dans le clipboard Je veux tout le contenu le contenu du type "%0%" @@ -1363,7 +1589,9 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Compositions - Vous n'avez pas ajouté d'onglet + Groupe + Vous n'avez pas ajouté de groupe + Ajouter un groupe Hérité de Ajouter une propriété Label requis @@ -1371,7 +1599,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Configure l'élément de contenu de manière à afficher ses éléments enfants sous forme d'une liste que l'on peut trier et filtrer, les enfants ne seront pas affichés dans l'arborescence Modèles autorisés Sélectionnez les modèles que les éditeurs sont autorisés à utiliser pour du contenu de ce type. - Autorisé comme racine + Autoriser comme racine Autorisez les éditeurs à créer du contenu de ce type à la racine de l'arborescence de contenu. Types de noeuds enfants autorisés Autorisez la création de contenu des types spécifiés sous le contenu de ce type-ci @@ -1379,6 +1607,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Hériter des onglets et propriétés d'un type de document existant. De nouveaux onglets seront ajoutés au type de document actuel, ou fusionnés s'il existe un onglet avec un nom sililaire. Ce type de contenu est utilisé dans une composition, et ne peut donc pas être lui-même un composé. Il n'y a pas de type de contenu disponible à utiliser dans une composition. + La suppression d'une composition supprimera les données de toutes les propriétés associées. Une fois que vous sauvegardez le type de document, il n'y a plus moyen de faire marche arrière. Editeurs disponibles Réutiliser Configuration de l'éditeur @@ -1407,6 +1636,35 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à l'onglet n'a pas d'ordre de tri Où cette composition est-elle utilisée? Cette composition est actuellement utilisée dans la composition des types de contenu suivants : + Permettre une variation par culture + Permettre aux éditeurs de créer du contenu de ce type dans différentes langues. + Permettre une variation par culture + Type de l'Elément + Est un Type d'Elément + Un Type d'Elément est destiné à être utilisé par exemple dans Nested Content, et pas dans l'arborescence. + Ceci n'est pas d'application pour un Type d'Elément + Vous avez apporté des modifications à cette propriété. Etes-vous certain.e de vouloir les annuler? + + + Ajouter une langue + Langue obligatoire + Les propriétés doivent être remplies dans cette langue avant que le noeud ne puisse être publié. + Langue par défaut + Un site Umbraco ne peut avoir qu'une seule langue par défaut définie. + Changer la langue par défaut peut amener à ce que du contenu par défaut soit manquant. + Retombe sur + Pas de langue alternative + Pour permettre à un site multi-langue de retomber sur une autre langue dans le cas où il n'existe pas dans la langue demandée, sélectionnez-là ici. + Langue alternative + aucune + + + Ajouter un paramètre + Modifier le paramètre + Introduire le nom de la macro + Paramètres + Définir les paramètres qui devraient être disponibles lorsque l'on utilise cette macro. + Sélectionner le fichier de vue partielle de la macro Fabrication des modèles @@ -1427,7 +1685,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Choisir un champ Convertir les sauts de ligne Oui, convertir les sauts de ligne - Remplace les sauts de ligne avec des balises &lt;br&gt; + Remplace les sauts de ligne avec des balises 'br' Champs particuliers Oui, la date seulement Format et encodage @@ -1449,7 +1707,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Champs standards Majuscules Encode pour URL - Formatera les caractères spéciaux de manière à ce qu'ils soient reconnus dans une URL + Formatera les caractères spéciaux dans les URL Sera seulement utilisé si toutes les valeurs des champs ci-dessus sont vides Ce champ sera utilisé seulement si le champ initial est vide Oui, avec l'heure. Séparateur: @@ -1519,14 +1777,17 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Scripts Feuilles de style Modèles + Visualisation des Log Utilisateurs - Analytique + Configuration + Modélisation + Parties Tierces Nouvelle mise à jour disponible %0% est disponible, cliquez ici pour télécharger Aucune connexion au serveur - Erreur lors de la recherche de mises à jour. Veuillez vérifier le stack trace pour obtenir plus d'informations sur l'erreur. + Erreur lors de la recherche de mises à jour. Veuillez vérifier le stack trace pour obtenir plus d'informations. Accès @@ -1554,7 +1815,7 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Voir le profil de l'utilisateur Ajouter des groupes pour donner les accès et permissions Inviter un autre utilisateur - Inviter de nouveaux utilisateurs pour leur donner accès à Umbraco. Un email d'invitation sera envoyé à chaque utilisateur avec des informations concernant la connexion à Umbraco. + Inviter de nouveaux utilisateurs pour leur donner accès à Umbraco. Un email d'invitation sera envoyé à chaque utilisateur avec des informations concernant la connexion à Umbraco. Les invitations sont valables pendant 72 heures. Langue Spécifiez la langue dans laquelle vous souhaitez voir les menus et dialogues Date du dernier bloquage @@ -1606,7 +1867,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à a été invité Une invitation a été envoyée au nouvel utilisateur avec les détails concernant la connexion à Umbraco. Bien le bonjour et bienvenue dans Umbraco! Vous serez prêt.e dans moins d'1 minute, vous devez encore simplement configurer votre mot de passe et ajouter une photo pour votre avatar. - Chargez une photo afin que les autres utilisateurs puissent vous reconnaître facilement. + Bienvenue dans Umbraco! Malheureusement, votre invitation a expiré. Veuillez contacter votre administrateur et demandez-lui de vous l'envoyer à nouveau. + Chargez une photo afin que les autres utilisateurs puissent vous reconnaître facilement. Cliquez sur le cercle ci-dessus pour charger votre photo. Rédacteur Modifier Votre profil @@ -1712,6 +1974,17 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Nouvel envoi de l'invitation en cours... Supprimer l'Utilisateur Etes-vous certain(e) de vouloir supprimer le compte de cet utilisateur? + Tous + Actif + Désactivé + Bloqué + Invité + Inactif + Nom (A-Z) + Nom (Z-A) + Plus récent + Plus ancien + Dernière connexion Validation @@ -1720,7 +1993,9 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Valider comme Url ...ou introduisez une validation spécifique Champ obligatoire + Introduisez un message d'erreur de validation personnalisé (optionnel) Introduisez une expression régulière + Introduisez un message d'erreur de validation personnalisé (optionnel) Vous devez ajouter au moins Vous ne pouvez avoir que éléments @@ -1728,6 +2003,12 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Date non valide Pas un nombre Email non valide + La valeur ne peut pas être null + La valeur ne peut pas être vide + Valeur non valide, elle ne correspond pas au modèle correct + Validation personnalisée + %1% supplémentaires.]]> + %1% en trop.]]>