From 941dc933fb02414396a97dc7bd7a19028445b46d Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:04:23 +0200 Subject: [PATCH 01/27] package-lock sync --- src/Umbraco.Web.UI.Client/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 00b71a2d2b..24ff76f74e 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -82,8 +82,8 @@ "run-sequence": "2.2.1" }, "engines": { - "node": ">=16.17", - "npm": ">=8.15" + "node": ">=18.16", + "npm": ">=9.5" } }, "node_modules/@ampproject/remapping": { From fe1080dd64b09cd569a885962ab934a1428339ec Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Tue, 27 Jun 2023 10:33:46 +0200 Subject: [PATCH 02/27] Check the cases where there might be a custom image type, instead of an the default Umbraco image type (#14463) --- .../Controllers/MediaController.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs index 50c54f420f..5648f3046b 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs @@ -760,11 +760,25 @@ public class MediaController : ContentControllerBase break; } - // If media type is still File then let's check if it's an image. + // If media type is still File then let's check if it's an image or a custom image type. if (mediaTypeAlias == Constants.Conventions.MediaTypes.File && _imageUrlGenerator.IsSupportedImageFormat(ext)) { - mediaTypeAlias = Constants.Conventions.MediaTypes.Image; + if (allowedContentTypes.Any(mt => mt.Alias == Constants.Conventions.MediaTypes.Image)) + { + mediaTypeAlias = Constants.Conventions.MediaTypes.Image; + } + else + { + IMediaType? customType = allowedContentTypes.FirstOrDefault(mt => + mt.CompositionPropertyTypes.Any(pt => + pt.PropertyEditorAlias == Constants.PropertyEditors.Aliases.ImageCropper)); + + if (customType is not null) + { + mediaTypeAlias = customType.Alias; + } + } } } else From 2cbf44dd4cc3f7ba470cd2e9e831f995fe084640 Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Tue, 27 Jun 2023 11:53:10 +0200 Subject: [PATCH 03/27] Updated login svg --- .../src/assets/img/login.svg | 997 +++++++++++++++++- 1 file changed, 996 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/assets/img/login.svg b/src/Umbraco.Web.UI.Client/src/assets/img/login.svg index 3bd280b4af..37499a996c 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/img/login.svg +++ b/src/Umbraco.Web.UI.Client/src/assets/img/login.svg @@ -1 +1,996 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e86fb0eeb6e8c4c969683d5303373a83905ac91a Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:35:01 +0200 Subject: [PATCH 04/27] Adding null check and descriptive error (#14469) --- src/Umbraco.Web.BackOffice/Controllers/MediaController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs index 5648f3046b..a26934b3c1 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs @@ -579,9 +579,9 @@ public class MediaController : ContentControllerBase Directory.CreateDirectory(root); //must have a file - if (file.Count == 0) + if (file is null || file.Count == 0) { - return NotFound(); + return NotFound("No file was uploaded"); } //get the string json from the request From ba724ed97d77b9951a22fe693f9dd3bdd000047c Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Tue, 27 Jun 2023 14:15:13 +0200 Subject: [PATCH 05/27] Bump version to final --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 902bee835c..531f830eba 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "12.0.0-rc5", + "version": "12.0.0", "assemblyVersion": { "precision": "build" }, From fad710364c540f4a833bd60d00e6686d40d74d95 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Fri, 30 Jun 2023 07:26:31 +0200 Subject: [PATCH 06/27] Add additional preview URLs option (#14479) --- .../ContentEditing/ContentVariationDisplay.cs | 4 ++++ src/Umbraco.Core/Models/ContentEditing/NamedUrl.cs | 13 +++++++++++++ .../Mapping/ContentMapDefinition.cs | 4 +++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Core/Models/ContentEditing/NamedUrl.cs diff --git a/src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs b/src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs index 6418a7bca7..0d359b640f 100644 --- a/src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs +++ b/src/Umbraco.Core/Models/ContentEditing/ContentVariationDisplay.cs @@ -14,6 +14,7 @@ public class ContentVariantDisplay : ITabbedContent, ICo Tabs = new List>(); Notifications = new List(); AllowedActions = Enumerable.Empty(); + AdditionalPreviewUrls = Enumerable.Empty(); } [DataMember(Name = "allowedActions", IsRequired = true)] @@ -72,6 +73,9 @@ public class ContentVariantDisplay : ITabbedContent, ICo /// [DataMember(Name = "tabs")] public IEnumerable> Tabs { get; set; } + + [DataMember(Name = "additionalPreviewUrls")] + public IEnumerable AdditionalPreviewUrls { get; set; } } public class ContentVariantScheduleDisplay : ContentVariantDisplay diff --git a/src/Umbraco.Core/Models/ContentEditing/NamedUrl.cs b/src/Umbraco.Core/Models/ContentEditing/NamedUrl.cs new file mode 100644 index 0000000000..8c71f86cbf --- /dev/null +++ b/src/Umbraco.Core/Models/ContentEditing/NamedUrl.cs @@ -0,0 +1,13 @@ +using System.Runtime.Serialization; + +namespace Umbraco.Cms.Core.Models.ContentEditing; + +[DataContract(Name = "namedUrl", Namespace = "")] +public class NamedUrl +{ + [DataMember(Name = "name")] + public required string Name { get; set; } + + [DataMember(Name = "url")] + public required string Url { get; set; } +} diff --git a/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs b/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs index e91384f86a..21961acb45 100644 --- a/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs +++ b/src/Umbraco.Web.BackOffice/Mapping/ContentMapDefinition.cs @@ -127,6 +127,7 @@ internal class ContentMapDefinition : IMapDefinition target.Tabs = source.Tabs; target.UpdateDate = source.UpdateDate; target.AllowedActions = source.AllowedActions; + target.AdditionalPreviewUrls = source.AdditionalPreviewUrls; } // Umbraco.Code.MapAll @@ -189,6 +190,7 @@ internal class ContentMapDefinition : IMapDefinition target.Tabs = source.Tabs; target.UpdateDate = source.UpdateDate; target.AllowedActions = source.AllowedActions; + target.AdditionalPreviewUrls = source.AdditionalPreviewUrls; // We'll only try and map the ReleaseDate/ExpireDate if the "old" ContentVariantScheduleDisplay is in the context, otherwise we'll just skip it quietly. _ = context.Items.TryGetValue(nameof(ContentItemDisplayWithSchedule.Variants), out var variants); @@ -352,7 +354,7 @@ internal class ContentMapDefinition : IMapDefinition return result; } - // Umbraco.Code.MapAll -Segment -Language -DisplayName + // Umbraco.Code.MapAll -Segment -Language -DisplayName -AdditionalPreviewUrls private void Map(IContent source, ContentVariantDisplay target, MapperContext context) { target.CreateDate = source.CreateDate; From 5382820e584c79dbe2a5d0e4793ea14a744709e7 Mon Sep 17 00:00:00 2001 From: Nathan Woulfe Date: Mon, 3 Jul 2023 22:17:24 +1000 Subject: [PATCH 07/27] Ensure package view path is generated with consideration the current section (#14268) * check section when determining package template path * return sectionAlias as packageFolder and the route segment won't always match * fix test * adds PluginController attribute to StylesheetsTreeController fixes actionUrl generation to ensure valid URL find controller by fullname to avoid incorrect controller selection when multiple exist with same name * Fix frontend breaking changes * Adding missing PluginController attribute for ScriptsTreeController --------- Co-authored-by: Elitsa --- .../Controllers/BackOfficeServerVariables.cs | 5 ++- .../Trees/ApplicationTreeController.cs | 2 +- .../Trees/ScriptsTreeController.cs | 2 + .../Trees/StylesheetsTreeController.cs | 2 + .../Trees/UrlHelperExtensions.cs | 39 ++++++++++++++----- .../common/mocks/umbraco.servervariables.js | 2 +- .../src/common/services/navigation.service.js | 7 ++-- .../src/common/services/tree.service.js | 30 +++++++------- src/Umbraco.Web.UI.Client/src/routes.js | 18 +++++---- .../unit/common/services/tree-service.spec.js | 4 +- 10 files changed, 72 insertions(+), 39 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs index 6dbd5f1e79..9325f9e8ae 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs @@ -704,6 +704,9 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers [DataMember(Name = "packageFolder")] public string? PackageFolder { get; set; } + + [DataMember(Name = "sectionAlias")] + public string? SectionAlias { get; set; } } private IEnumerable GetPluginTrees() @@ -735,7 +738,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers continue; } - yield return new PluginTree { Alias = tree.TreeAlias, PackageFolder = pluginController.AreaName }; + yield return new PluginTree { Alias = tree.TreeAlias, PackageFolder = pluginController.AreaName, SectionAlias = tree.SectionAlias }; } } diff --git a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs index 461d1fc82f..28f685bf0d 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs @@ -360,7 +360,7 @@ public class ApplicationTreeController : UmbracoAuthorizedApiController ControllerActionDescriptor? actionDescriptor = _actionDescriptorCollectionProvider.ActionDescriptors.Items .Cast() .First(x => - x.ControllerName.Equals(controllerName) && + (x.ControllerTypeInfo.FullName ?? string.Empty).Equals(controllerType.FullName) && x.ActionName == action); var actionContext = new ActionContext(HttpContext, routeData, actionDescriptor); diff --git a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs index 630584a839..0c46e809d2 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs @@ -3,10 +3,12 @@ using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; +using Umbraco.Cms.Web.Common.Attributes; namespace Umbraco.Cms.Web.BackOffice.Trees; [CoreTree] +[PluginController(Constants.Web.Mvc.BackOfficeTreeArea)] [Tree(Constants.Applications.Settings, Constants.Trees.Scripts, TreeTitle = "Scripts", SortOrder = 10, TreeGroup = Constants.Trees.Groups.Templating)] public class ScriptsTreeController : FileSystemTreeController { diff --git a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs index 3ff7a7ecfc..32f2a3e465 100644 --- a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs @@ -3,10 +3,12 @@ using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; +using Umbraco.Cms.Web.Common.Attributes; namespace Umbraco.Cms.Web.BackOffice.Trees; [CoreTree] +[PluginController(Constants.Web.Mvc.BackOfficeTreeArea)] [Tree(Constants.Applications.Settings, Constants.Trees.Stylesheets, TreeTitle = "Stylesheets", SortOrder = 9, TreeGroup = Constants.Trees.Groups.Templating)] public class StylesheetsTreeController : FileSystemTreeController { diff --git a/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs b/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs index 1688a99ec2..d8506f5692 100644 --- a/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs +++ b/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs @@ -47,14 +47,15 @@ public static class UrlHelperExtensions string nodeId, FormCollection? queryStrings) { - var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, "GetNodes", treeType)? - .EnsureEndsWith('?'); + var actionName = "GetNodes"; + var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, actionName, treeType); + actionUrl = StartOrContinueQueryString(actionUrl, actionName); + + // Now we need to append the query strings + // Always ignore the custom start node id when generating URLs for tree nodes since this is a custom once-only parameter + // that should only ever be used when requesting a tree to render (root), not a tree node + actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id", TreeQueryStringParameters.StartNodeId); - //now we need to append the query strings - actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id", - //Always ignore the custom start node id when generating URLs for tree nodes since this is a custom once-only parameter - // that should only ever be used when requesting a tree to render (root), not a tree node - TreeQueryStringParameters.StartNodeId); return actionUrl; } @@ -65,11 +66,29 @@ public static class UrlHelperExtensions string nodeId, FormCollection? queryStrings) { - var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, "GetMenu", treeType)? - .EnsureEndsWith('?'); + var actionName = "GetMenu"; + var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, actionName, treeType); + actionUrl = StartOrContinueQueryString(actionUrl, actionName); - //now we need to append the query strings + // now we need to append the query strings actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id"); return actionUrl; } + + /// + /// Check the provided string already includes a querystring fragment + /// If so, result has "&" appended, else has "?" appended. + /// + /// + /// + /// + private static string? StartOrContinueQueryString(string? actionUrl, string? delimiter) + { + if (actionUrl is null) + { + return actionUrl; + } + + return actionUrl.EnsureEndsWith(actionUrl.Contains($"{delimiter}?") ? "&" : "?"); + } } 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 51029234f5..4b8e8fa146 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 @@ -32,7 +32,7 @@ Umbraco.Sys.ServerVariables = { }, umbracoPlugins: { trees: [ - { alias: "myTree", packageFolder: "MyPackage" } + { alias: "myTree", packageFolder: "MyPackage", sectionAlias: "myPackageSectionAlias" } ] }, isDebuggingEnabled: true, 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 77b97545b6..248e78880a 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 @@ -616,7 +616,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService if (!treeAlias) { throw "Could not get tree alias for node " + args.node.id; } - templateUrl = this.getTreeTemplateUrl(treeAlias, args.action.alias); + templateUrl = this.getTreeTemplateUrl(treeAlias, args.action.alias, args.node.section); } setMode("dialog"); @@ -633,6 +633,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService * * @param {string} treeAlias the alias of the tree to look up * @param {string} action the view file name + * @param {string} sectionAlias the alias of the current section * @description * creates the templateUrl based on treeAlias and action * by convention we will look into the /views/{treetype}/{action}.html @@ -640,8 +641,8 @@ function navigationService($routeParams, $location, $q, $injector, eventsService * we will also check for a 'packageName' for the current tree, if it exists then the convention will be: * for example: /App_Plugins/{mypackage}/backoffice/{treetype}/create.html */ - getTreeTemplateUrl: function (treeAlias, action) { - var packageTreeFolder = treeService.getTreePackageFolder(treeAlias); + getTreeTemplateUrl: function (treeAlias, action, sectionAlias) { + var packageTreeFolder = treeService.getTreePackageFolder(treeAlias, sectionAlias); if (packageTreeFolder) { return (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + "/" + packageTreeFolder + 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 ba9ebc1b00..fa5d297a88 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 @@ -166,23 +166,27 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS * * @description * Determines if the current tree is a plugin tree and if so returns the package folder it has declared - * so we know where to find it's views, otherwise it will just return undefined. + * so we know where to find its views, otherwise it will just return undefined. * * @param {String} treeAlias The tree alias to check + * @param {String} sectionAlias The current section */ - getTreePackageFolder: function (treeAlias) { + getTreePackageFolder: function (treeAlias, sectionAlias) { //we determine this based on the server variables - if (Umbraco.Sys.ServerVariables.umbracoPlugins && - Umbraco.Sys.ServerVariables.umbracoPlugins.trees && - Utilities.isArray(Umbraco.Sys.ServerVariables.umbracoPlugins.trees)) { - - var found = _.find(Umbraco.Sys.ServerVariables.umbracoPlugins.trees, function (item) { - return invariantEquals(item.alias, treeAlias); - }); - - return found ? found.packageFolder : undefined; + if (!Umbraco.Sys.ServerVariables.umbracoPlugins || !Utilities.isArray(Umbraco.Sys.ServerVariables.umbracoPlugins.trees)) { + return undefined; } - return undefined; + + let found; + if (sectionAlias !== undefined) { + found = Umbraco.Sys.ServerVariables.umbracoPlugins.trees.find(item => + invariantEquals(item.alias, treeAlias) && invariantEquals(item.sectionAlias, sectionAlias)); + } else { + found = Umbraco.Sys.ServerVariables.umbracoPlugins.trees.find(item => + invariantEquals(item.alias, treeAlias)); + } + + return found ? found.packageFolder : undefined; }, /** @@ -868,7 +872,7 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS //start var wrappedPromise = doSync(); - //then wrap it + //then wrap it wrappedPromise.then(function (args) { deferred.resolve(args); }, function (args) { diff --git a/src/Umbraco.Web.UI.Client/src/routes.js b/src/Umbraco.Web.UI.Client/src/routes.js index 7e65346d1b..e6d97ea18f 100644 --- a/src/Umbraco.Web.UI.Client/src/routes.js +++ b/src/Umbraco.Web.UI.Client/src/routes.js @@ -1,5 +1,5 @@ window.app.config(function ($routeProvider) { - + /** * This determines if the route can continue depending on authentication and initialization requirements * @param {boolean} authRequired If true, it checks if the user is authenticated and will resolve successfully @@ -117,9 +117,9 @@ window.app.config(function ($routeProvider) { template: "
", //This controller will execute for this route, then we can execute some code in order to set the template Url controller: function ($scope, $route, $routeParams, $location, sectionService) { - + //We are going to check the currently loaded sections for the user and if the section we are navigating - //to has a custom route path we'll use that + //to has a custom route path we'll use that sectionService.getSectionsForUser().then(function(sections) { //find the one we're requesting var found = _.find(sections, function(s) { @@ -175,8 +175,9 @@ window.app.config(function ($routeProvider) { if ($routeParams.section.toLowerCase() === "users" && $routeParams.tree.toLowerCase() === "users" && usersPages.indexOf($routeParams.method.toLowerCase()) === -1) { $scope.templateUrl = "views/users/overview.html"; return; - } - $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method); + } + + $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method, $routeParams.section); }, reloadOnSearch: false, resolve: canRoute(true) @@ -190,8 +191,9 @@ window.app.config(function ($routeProvider) { if (!$routeParams.tree || !$routeParams.method) { $scope.templateUrl = "views/common/dashboard.html"; return; - } - $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method); + } + + $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method, $routeParams.section); }, reloadOnSearch: false, reloadOnUrl: false, @@ -199,7 +201,7 @@ window.app.config(function ($routeProvider) { }) .otherwise({ redirectTo: '/login' }); }).config(function ($locationProvider) { - + $locationProvider.html5Mode(false); //turn html5 mode off $locationProvider.hashPrefix(''); }); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js index 4d19cf557a..63800a9e12 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js @@ -298,13 +298,13 @@ describe('tree service tests', function () { it('can find a plugin based tree', function () { //we know this exists in the mock umbraco server vars - var found = treeService.getTreePackageFolder("myTree"); + var found = treeService.getTreePackageFolder("myTree", "MyPackageSectionAlias"); expect(found).toBe("MyPackage"); }); it('returns undefined for a not found tree', function () { //we know this does not exist in the mock umbraco server vars - var found = treeService.getTreePackageFolder("asdfasdf"); + var found = treeService.getTreePackageFolder("asdfasdf", "fdsafdsa"); expect(found).not.toBeDefined(); }); From b716e98780074d20f693f6dc7507b332f985356b Mon Sep 17 00:00:00 2001 From: Russell Date: Wed, 31 May 2023 22:45:02 +1200 Subject: [PATCH 08/27] Change "Media Picker" in RTE to "Image Picker" (#14321) (cherry picked from commit 02206213373b77644d348bbaa52893b834d3dfc5) # Conflicts: # src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js --- .../src/common/services/tinymce.service.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 afb3fa1e84..584870e6e5 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 @@ -664,7 +664,7 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s createMediaPicker: function (editor, callback) { editor.addButton('umbmediapicker', { icon: 'custom icon-picture', - tooltip: 'Media Picker', + tooltip: 'Image Picker', stateSelector: 'img[data-udi]', onclick: function () { From aa4a1b3498ac2b3a571e2b4f19007914956f0e9d Mon Sep 17 00:00:00 2001 From: Russell Date: Wed, 31 May 2023 22:46:02 +1200 Subject: [PATCH 09/27] Fix for User null from IP address "::1" has logged out (#14322) (cherry picked from commit dd59ef17f521aceed57219d5bb6537ce66b08789) --- .../Controllers/AuthenticationController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/AuthenticationController.cs b/src/Umbraco.Web.BackOffice/Controllers/AuthenticationController.cs index 7d49adaf39..1a55e164a6 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/AuthenticationController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/AuthenticationController.cs @@ -624,7 +624,7 @@ public class AuthenticationController : UmbracoApiControllerBase await _signInManager.SignOutAsync(); _logger.LogInformation("User {UserName} from IP address {RemoteIpAddress} has logged out", - User.Identity == null ? "UNKNOWN" : User.Identity.Name, HttpContext.Connection.RemoteIpAddress); + result.Principal.Identity == null ? "UNKNOWN" : result.Principal.Identity.Name, HttpContext.Connection.RemoteIpAddress); var userId = result.Principal.Identity?.GetUserId(); SignOutSuccessResult args = _userManager.NotifyLogoutSuccess(User, userId); From 8f6370a4808e6a9fbd81a9187c65c2d92b8ac500 Mon Sep 17 00:00:00 2001 From: Miguel Pinto Date: Wed, 31 May 2023 16:39:37 +0200 Subject: [PATCH 10/27] Swapped the sortCreateDateAscending and sortCreateDateDescending translation values to match the intended behavior (#14315) (cherry picked from commit 76cb85224e058f0f50fbbf61e522d48325d5089f) --- src/Umbraco.Core/EmbeddedResources/Lang/bs.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/cs.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/da.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/de.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/en.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/fr.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/it.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/nl.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/pt.xml | 2 ++ src/Umbraco.Core/EmbeddedResources/Lang/sv.xml | 4 ++-- src/Umbraco.Core/EmbeddedResources/Lang/tr.xml | 4 ++-- 12 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/bs.xml b/src/Umbraco.Core/EmbeddedResources/Lang/bs.xml index f7b763bdfa..c22086a81a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/bs.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/bs.xml @@ -2238,8 +2238,8 @@ Da upravljate svojom web lokacijom, jednostavno otvorite Umbraco backoffice i po Neaktivan Ime (A-Z) Ime (Z-A) - Najnovije - Najstarije + Najstarije + Najnovije Zadnja prijava Nijedna korisnička grupa nije dodana Ako želite da onemogućite ovog dvofaktorskog provajdera, onda morate uneti kod prikazan na vašem uređaju za autentifikaciju: diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/cs.xml b/src/Umbraco.Core/EmbeddedResources/Lang/cs.xml index 09c679475d..26c7087c80 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/cs.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/cs.xml @@ -1869,8 +1869,8 @@ Neaktivní Jméno (A-Z) Jméno (Z-A) - Nejnovější - Nejstarší + Nejstarší + Nejnovější Poslední přihlášení Nebyly přidány žádné skupiny uživatelů diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index 6a496a9b8f..dd68711783 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -1927,8 +1927,8 @@ Mange hilsner fra Umbraco robotten Inaktiv Navn (A-Å) Navn (Å-A) - Nyeste - Ældste + Ældste + Nyeste Sidst logget ind Ingen brugere er blevet tilføjet Hvis du ønsker at slå denne totrinsbekræftelse fra, så skal du nu indtaste koden fra din enhed: diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/de.xml b/src/Umbraco.Core/EmbeddedResources/Lang/de.xml index 310516a6bb..4bcf80994e 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/de.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/de.xml @@ -2179,8 +2179,8 @@ Nicht aktiv Name (A-Z) Name (Z-A) - Newest - Oldest + Oldest + Newest Last login diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index bda3ffbfec..1d3f563c9c 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -2245,8 +2245,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Inactive Name (A-Z) Name (Z-A) - Newest - Oldest + Oldest + Newest Last login No user groups have been added If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device: diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 46c7dad6cd..d38a8f0c06 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -2340,8 +2340,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Inactive Name (A-Z) Name (Z-A) - Newest - Oldest + Oldest + Newest Last login No user groups have been added If you wish to disable this two-factor provider, then you must enter the code shown on your authentication device: diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/fr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/fr.xml index 1576cedbe4..55dad6e986 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/fr.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/fr.xml @@ -1910,8 +1910,8 @@ Pour gérer votre site, ouvrez simplement le backoffice Umbraco et commencez à Inactif Nom (A-Z) Nom (Z-A) - Plus récent - Plus ancien + Plus ancien + Plus récent Dernière connexion diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/it.xml b/src/Umbraco.Core/EmbeddedResources/Lang/it.xml index 5e45248d48..b1ac0385e1 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/it.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/it.xml @@ -2319,8 +2319,8 @@ Per gestire il tuo sito web, è sufficiente aprire il backoffice di Umbraco e in Inattivi Nome (A-Z) Nome (Z-A) - - + + Ultimo login Non sono stati aggiunti gruppi di utenti diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/nl.xml b/src/Umbraco.Core/EmbeddedResources/Lang/nl.xml index 9c17715e50..0a39cf05a7 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/nl.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/nl.xml @@ -2056,8 +2056,8 @@ Echter, Runway biedt een gemakkelijke basis om je snel op weg te helpen. Als je Inactief Naam (A-Z) Naam (Z-A) - Nieuwste - Oudste + Oudste + Nieuwste Laatste login Er zijn geen gebruikersgroepen toegevoegd diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/pt.xml b/src/Umbraco.Core/EmbeddedResources/Lang/pt.xml index f6cdb21208..29ae77a2d8 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/pt.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/pt.xml @@ -822,6 +822,8 @@ Você pode publicar esta página e todas suas sub-páginas ao selecionar pub Tipo de usuário Tipos de usuários Escrevente + Mais antigo + Mais recente Selecionar tudo diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml index ec52c0343c..d219464321 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/sv.xml @@ -1001,8 +1001,8 @@ Skribent Din nuvarande historik Din profil - Nyast - Äldst + Äldst + Nyast Senaste login diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/tr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/tr.xml index 1195378516..ebd284465f 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/tr.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/tr.xml @@ -1996,8 +1996,8 @@ Web sitenizi yönetmek için, Umbraco'nun arka ofisini açın ve içerik eklemey Etkin Değil Ad (AZ) Ad (ZA) - En yeni - En eski + En eski + En yeni Son giriş Hiçbir kullanıcı grubu eklenmedi From b8415ed7f07e76939bf020d71f561fa398fd2847 Mon Sep 17 00:00:00 2001 From: Paul Seal Date: Fri, 16 Jun 2023 09:31:09 +0100 Subject: [PATCH 11/27] Update the tour text to the correct text and to save confusion (cherry picked from commit 5073a26e7f58ef986a599940f82df5c1e1fefdb3) --- .../EmbeddedResources/Tours/getting-started.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/EmbeddedResources/Tours/getting-started.json b/src/Umbraco.Web.BackOffice/EmbeddedResources/Tours/getting-started.json index eba7e94d1e..502b1fe47e 100644 --- a/src/Umbraco.Web.BackOffice/EmbeddedResources/Tours/getting-started.json +++ b/src/Umbraco.Web.BackOffice/EmbeddedResources/Tours/getting-started.json @@ -146,7 +146,7 @@ { "element": "#dialog [data-element='action-documentType']", "title": "Create Document Type", - "content": "

Click Document Type to create a new document type with a template. The template will be automatically created and set as the default template for this Document Type.

You will use the template in a later tour to render content.

", + "content": "

Click Document Type with Template to create a new document type with a template. The template will be automatically created and set as the default template for this Document Type.

You will use the template in a later tour to render content.

", "event": "click" }, { @@ -197,8 +197,8 @@ }, { "element": "[data-element~='editor-property-settings'] [data-element='editor-add']", - "title": "Add editor", - "content": "When you add an editor you choose what the input method for this property will be. Click Add editor to open the editor picker dialog.", + "title": "Select editor", + "content": "When you select an editor you choose what the input method for this property will be. Click Select editor to open the editor picker dialog.", "event": "click" }, { From b99e14e2880968b829b2597c7122cc4805f32092 Mon Sep 17 00:00:00 2001 From: alevak09 <73195407+alevak09@users.noreply.github.com> Date: Fri, 16 Jun 2023 10:49:22 +0200 Subject: [PATCH 12/27] Add Croatian Language (#14379) Croatian language translation of Umbraco backoffice and culture settings (cherry picked from commit 9f4d3e55257fa865c5b474d691243b8d5cbd0f5c) --- .../EmbeddedResources/Lang/hr.xml | 2829 +++++++++++++++++ 1 file changed, 2829 insertions(+) create mode 100644 src/Umbraco.Core/EmbeddedResources/Lang/hr.xml diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml new file mode 100644 index 0000000000..492eb3155a --- /dev/null +++ b/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml @@ -0,0 +1,2829 @@ + + + + alevak09 + https://github.com/alevak09 + + + Kultura i imena hostova + Audit zapis + Pregledaj čvor + Promijeni Tip Dokumenta + Kopiraj + Kreiraj + Izvezi + Kreiraj Paket + Kreiraj grupu + Obriši + Onemogući + Uredi postavke + Isprazni koš za smeće + Omogući + Izvezi Tip Dokumenta + Uvezi Tip Dokumenta + Uvezi Paket + Uređivanje na stranici + Izlaz + Premjesti + Obavijesti + Javni pristup + Objavi + Poništi objavu + Osvježi + Ponovna objava cijele stranice + Ukloni + Preimenuj + Vrati + Odaberite gdje ćete kopirati + Odaberite gdje ćete premjestiti + Odaberite gdje ćete uvesti + do u strukturi stabla ispod + Odaberite gdje želite kopirati odabrane stavke + Odaberite gdje želite premjestiti odabrane stavke + je premješteno u + je kopirana u + je obrisana + Dozvole + Vraćanje unazad + Pošalji na objavljivanje + Pošalji na prijevod + Postavi grupu + Sortiraj + Prevedi + Ažuriraj + Postavi dozvole + Otključaj + Kreirajte Predložak Sadržaja + Ponovo pošaljite pozivnicu + + + Sadržaj + Administracija + Struktura + Ostalo + + + Dopustite pristup za dodjelu kulture i imena hostova + Dopustite pristup za pregled dnevnika povijesti čvora + Dopustite pristup za pregled čvora + Dopustite pristup za promjenu Tipa Dokumenta za čvor + Dopustite pristup za kopiranje čvora + Dopustite pristup za kreiranje čvora + Dopustite pristup za brisanje čvora + Dopustite pristup za premještaj čvora + Dopustite pristup za postavljanje i promjenu javnog pristupa za čvor + Dopustite pristup za objavljivanje čvora + Dopustite pristup da poništavanje objave čvora + Dopustite pristup za promjenu dozvola za čvor + Dopustite pristup za vraćanje čvora na prethodno stanje + Dopustite pristup za slanje čvora na odobrenje prije objavljivanja + Dopustite pristup za slanje čvora na prijevod + Dopustite pristup za promjenu sortiranja čvorova + Dopustite pristup za prevođenje čvora + Dopustite pristup za spremanje čvora + Dopustite pristup za kreiranje Predloška Sadržaja + Dopustite pristup za podešavanje obavijesti za čvorove + + + Sadržaj + Info + + + Dozvola odbijena. + Dodaj novu domenu + Dodaj postojeću domenu + Ukloni + Nevažeći čvor. + Jedna ili više domena imaju nevažeći format. + Domena je već dodijeljena. + Jezik + Domena + Nova domena '%0%' je kreirana + Domena '%0%' je obrisana + Domena '%0%' je već dodijeljena + Domena '%0%' je ažurirana + Uredi trenutne domene + + + Naslijedi + Kultura + + ili naslijedite kulturu od roditeljskih čvorova. Također će se primijeniti
+ na trenutni čvor, osim ako se domena u nastavku ne primjenjuje.]]> +
+ Domene + + + Obriši odabir + Odaberi + Uradi nešto drugo + Podebljano + Odustani od uvlačenje odlomka + Umetni polje obrasca + Umetni grafički naslov + Uredi Html + Uvuci odlomak + Nakošeno + Centrirano + Poravnanje lijevo + Poravnanje desno + Umetni link + Umetni lokalni link (sidro) + Obična lista + Numerička lista + Umetni makro + Umetni sliku + Objavi i zatvori + Objavi sa potomcima + Uredite odnose + Povratak na listu + Spremi + Spremi i zatvori + Spremi i objavi + Spremi i pošalji na odobrenje + Spremi prikaz liste + Zakazivanje objave + Spremi i pregledaj + Pregled je onemogućen jer nije dodijeljen predložak + Odaberi stil + Prikaži stilove + Umetni tablicu + Spremi i generiraj modele + Poništi + Vrati + Obriši tag + Odustani + Potvrdi + Više opcija za objavljivanje + Pošalji + + + Pregled za + Sadržaj je obrisan + Poništena objava Sadržaja + Poništena je objava sadržaja za jezike: %0% + Sadržaj je spremljen i objavljen + Sadržaj spremljen i objavljen za jezike: %0% + Sadržaj spremljen + Sadržaj spremljen za jezike: %0% + Sadržaj premješten + Sadržaj kopiran + Sadržaj vraćen + Sadržaj poslan na objavljivanje + Sadržaj poslan na objavljivanje za jezike: %0% + Sortiranje podređenih stavki je izvršio korisnik + %0% + Čišćenje je onemogućeno za verziju: %0% + Čišćenje je omogućeno za verziju: %0% + Kopiraj + Objavljeno + Objavi + Premjesti + Spremljeno + Spremi + Obriši + Poništi objavu + Vrati na stariju verziju + Pošalji na objavljivanje + Pošalji na objavljivanje + Sortiraj + Prilagođeno + Spremi + Spremi + Povijest (sve varijante) + + + Naziv mape ne može sadržavati nedozvoljene znakove. + Nije uspjelo brisanje stavke: %0% + + + Da li je objavljeno + Više o ovoj stranici + Alias + (kako bi opisali sliku preko telefona) + Alternativni linkovi + Kliknite za uređivanje ove stavke + Kreirao + Originalni autor + Ažurirao + Kreirano + Datum i vrijeme kreiranja ovog dokumenta + Tip dokumenta + Uređivanje + Ukloni na + Ova stavka je promijenjena nakon objavljivanja + Ova stavka nije objavljena + Posljednje objavljeno + Nema stavki za prikaz + Nema stavki za prikaz na listi. + Nije dodan sadržaj + Nijedan član nije dodan + Tip medija + Link do medijske stavke + Grupa članova + Uloga + Tip člana + Nisu napravljene nikakve promjene + Nije odabran datum + Naslov stranice + Ova medijska stavka nema vezu + Svojstva + Ovaj dokument je objavljen, ali nije vidljiv jer nadređeni '%0%' nije objavljen + Ova kultura je objavljena, ali nije vidljiva jer nije objavljena na nadređenom '%0%' + Ovaj dokument je objavljen, ali nije u predmemoriji + Nije moguće dohvatiti URL + Ovaj dokument je objavljen, ali njegov URL je u sukobu sa sadržajem %0% + Ovaj dokument je objavljen, ali njegov URL se ne može preusmjeriti + Objavi + Objavljeno + Objavljeno (promjene na čekanju) + Status objave + + %0% i sve stavke sadržaja ispod i time čineći njihov sadržaj javno dostupnim.]]> + + + Objavi na + Poništi objavu na + Obriši datum + Postavi datum + Sortiranje je ažurirano + Da biste sortirali čvorove, jednostavno pomaknite čvorove ili kliknite na jedno od zaglavlja kolona. Možete odabrati + više čvorova držeći tipku "shift" ili "control" dok birate + + Statistika + Naslov (opcionalno) + Alternativni tekst (opcionalno) + Natpis (opcionalno) + Tip + Poništi objavu + Neobjavljeno + Nije kreirano + Zadnje uređivano + Datum/vrijeme uređivanja ovog dokumenta + Ukloni datoteke + Kliknite ovdje kako bi uklonili sliku iz medijske stavke + Kliknite ovdje kako bi uklonili datoteku iz medijske stavke + Link na dokument + Član grupe + Nije član grupe + Dječje stavke + Meta + Ovo se označava kao sljedeće vrijeme na serveru: + + Što ovo znači?]]> + Jeste li sigurni da želite obrisati ovu stavku? + Svojstvo %0% koristi uređivač %1% koji nije podržan za Ugniježđeni + Sadržaj. + + Jeste li sigurni da želite obrisati sve stavke? + Za ovo svojstvo nisu konfigurirani tipovi sadržaja. + Dodajte tip elementa + Odaberi tip elementa + Odaberite grupu čija svojstva trebaju biti prikazana. Ako je ostavljeno prazno, + koristit će se prva grupa na tipu elementa. + + Unesite angular izraz za procjenu svake stavke za njeno + ime. Koristi + + za prikaz indeksa stavke + Odabrani tip elementa ne sadrži nijednu podržanu grupu (ovaj uređivač ne podržava kartice, promijenite ih u grupe ili koristite uređivač liste blokova). + Dodajte još jedan okvir za tekst + Uklonite ovaj okvir za tekst + Korijen Sadržaja + Uključite neobjavljeni sadržaj. + Ova vrijednost je skrivena. Ako vam je potreban pristup da vidite ovu vrijednost, obratite se + administratoru web stranice. + + Ova vrijednost je skrivena. + Koje jezike želite objaviti? + Koje jezike želite poslati na odobrenje? + Koje jezike želite zakazano objaviti? + Odaberite jezike za poništavanje objavljivanja. Poništavanje objavljivanja obaveznog jezika će + poništiti objavljivanje svih jezika. + + Sve nove varijante će biti spremljene. + Koje varijante želite objaviti? + Odaberite koje varijante želite spremiti. + Za objavljivanje su potrebne sljedeće varijante: + Nije spremno za objavljivanje + Spremno za objavljivanje? + Spremno za spremanje? + Poništi fokusnu točku + Pošalji na odobrenje + Odaberite datum i vrijeme za objavljivanje i/ili poništavanje objave stavke sadržaja. + Kreiraj novo + Zalijepi iz međuspremnika + Ova stavka je u košu za smeće + + + %0%
]]> + Prazno + Odaberite predložak sadržaja + Predložak sadržaja kreiran + Predložak sadržaja je kreiran od '%0%' + Drugi predložak sadržaja sa istim nazivom već postoji + Predložak sadržaja je unaprijed definiran sadržaj koji uređivač može odabrati da bi se koristio + kao osnova za kreiranje novog sadržaja + + + + Kliknite za prijenos + ili kliknite ovdje kako bi odaberali datoteke + Nije moguće učitati ovu datoteku, jer nema odobreni tip datoteke + Nije moguće učitati ovu datoteku, format medija sa nastavkom '%0%' nije dozvoljen + Nije moguće učitati ovu datoteku, jer nema važeći naziv datoteke + Maksimalna veličina datoteke je + Korijen medija + Kreiranje mape pod ID-om roditelja nije uspjelo %0% + Preimenovanje mape sa ID-om %0% nije uspjelo + Povucite i ispustite svoje datoteke u područje + + + Kreirajte novog člana + Svi članovi + Grupe članova nemaju dodatnih svojstva za uređivanje. + Dvostruka provjera autentičnosti + + + Kopiranje tipa sadržaja nije uspjelo + Premještanje tipa sadržaja nije uspjelo + + + Kopiranje tipa medija nije uspjelo + Premještanje tipa medija nije uspjelo + Automatski odabir + + + Kopiranje tipa člana nije uspjelo + + + Gdje želite kreirati novi %0% + Kreirajte stavku pod + Odaberite vrstu dokumenta za koju želite napraviti predložak sadržaja + Unesite naziv mape + Odaberite vrstu i naslov + + Dokument Tip unutar sekcije Postavke, uređivanjem Dozvoljeni tipovi podređenih čvorova unutar Dozvole.]]> + + Dokument Tip unutar sekcije Postavke.]]> + Odabrana stranica u stablu sadržaja ne dozvoljava kreiranje nijedne stranice ispod. + + Uredi dozvole za ovaj tip dokumenta + Kreiraj novi tip dokumenta + + Dokument Tip unutar sekcije Postavke, izmjenom Dozvoli kao root opcije unutar Dozvole.]]> + + Media Tip unutar sekcije Postavke, uređivanjem Dozvoljeni tipovi podređenih čvorova unutar Dozvole.]]> + Odabrani medij u stablu ne dopušta bilo koji drugi medij + kreiran ispod njega. + + Uredi dozvole za ovaj tip medija + Tip dokumenta bez predloška + Tip dokumenta sa predloškom + Definiranje podataka za stranicu sadržaja koja se može kreirati u stablu sadržaja i direktno je dostupana preko URL-a. + + Tip dokumenta + Definiranje podataka za komponentu sadržaja koju mogu kreirati urednici u + stablu sadržaja i može biti izabrana na drugim stranicama, ali nema direktan URL. + + Tip elementa + Definiranje sheme za ponavljajući skup svojstava, na primjer, u 'Bloku + Uređivaču svojstava Lista' ili 'Ugniježđeni sadržaj'. + + Kompozicija + Definiranje višenamjenski skup svojstava koja se mogu uključiti u definiciju + više drugih vrsta dokumenata. Na primjer, skup 'Common Page Settings'. + + Mapa + Koristi se za organiziranje tipova dokumenata, sastava i tipova elemenata kreiranih u ovome + Stablo vrste dokumenta. + + Nova mapa + Novi tip podatka + Nova JavaScript datoteka + Novi prazan djelomični prikaz + Novi djelomični prikaz za makro + Novi djelomični prikaz iz isječka + Novi djelomični prikaz za makro iz isječka + Novi djelomični prikaz za makro (bez makroa) + Nova CSS datoteka + Nova Rich Text Editor CSS datoteka + + + Pregledajte svoju web stranicu + - Sakrij + Ako se Umbraco ne otvara, možda ćete morati dozvoliti skočne prozore sa ove stranice + je otvoren u novom prozoru + Ponovno pokreni + Posjetite + Dobrodošli + + + Ostani + Poništite promjene + Imate ne spremljene promjene + Jeste li sigurni da želite izaći s ove stranice? - imate ne spremljene promjene + Objavljivanjem će odabrane stavke biti vidljive na stranici. + Poništavanje objavljivanja će ukloniti odabrane stavke i sve njihove potomke sa + stranice. + + Poništavanje objavljivanja će ukloniti ovu stranicu i sve njene potomke sa stranice. + Imate ne spremljene promjene. Promjenom vrste dokumenta odbacit će se promjene. + + + Završeno + Obrisana %0% stavka + Obrisano %0% stavki + Obrisana %0% od %1% stavka + Obrisano %0% od %1% stavki + Objavljeno %0% stavka + Objavljeno %0% stavki + Objavljeno %0% od %1% stavka + Objavljeno %0% od %1% stavki + Neobjavljeno za %0% stavku + Neobjavljeno za %0% stavki + Neobjavljeno za %0% od %1% stavku + Neobjavljeno za %0% od %1% stavki + Premještena %0% stavka + Premješteno %0% stavki + Premješteno %0% od %1% stavku + Premješteno %0% od %1% stavki + Kopirana %0% stavka + Kopirano %0% stavki + Kopirano %0% od %1% stavku + Kopirano %0% od %1% stavki + + + Naslov linka + Link + Sidro / querystring + Naziv + Upravljanje nazivima domena + Zatvorite ovaj prozor + Jeste li sigurni da želite obrisati + %0% od %1% stavki]]> + Jeste li sigurni da želite onemogućiti + Jeste li sigurni da želite ukloniti + %0%]]> + Jeste li sigurni? + Jeste li sigurni? + Izreži + Uredi stavku iz rječnika + Uredi jezik + Uredite odabrane medije + Umetni lokalnu vezu + Umetni znak + Umetni grafički naslov + Umetni sliku + Umetni link + Klikni za dodavanje makro + Umetni tablicu + Ovo će obrisati jezik + Promjena kulture jezika može biti skupa operacija i rezultirat će promjenama u predmemoriji sadržaja i indeksima koji se rekonstruiraju + + Zadnje uređivano + Link + Interni link: + Kada koristite lokalni linkovi, umetnite "#" ispred linka + Otvoriti u novom prozoru? + Ovaj makro ne sadrži svojstva koja možete uređivati + Zalijepi + Uredi dozvole za + Postavi dozvole za + Postavi dozvole za %0% za grupu korisnika %1% + Odaberi grupe korisnika za koje želite postaviti dozvole + Stavke u košu za smeće se upravo brišu. Molimo vas da ne zatvarate ovaj prozor + dok se ova operacija odvija + + Koš za smeće je sada prazna + Kada se stavke obrišu iz koša za smeće, nestat će zauvijek + + regexlib.com web servis trenutno ima probleme u komunikaciji na koje ne možemo utjecati. Žao nam je zbog nastalih smetnji.]]> + Traži regular expression kako bi njime validirali polje unosa. Primjer: 'e-pošta, + 'poštanski broj', 'URL'. + + Ukloni makro + Obavezno polje + Stranica je ponovo indeksirana + Predmemorija web stranice je osvježena. Sav objavljeni sadržaj je sada ažuriran. Dok će sav + neobjavljen sadržaj ostati neobjavljen + + Predmemorija web stranice će biti osvježena. Svi objavljeni sadržaji bit će ažurirani, dok će sav + neobjavljeni sadržaj ostati neobjavljen. + + Broj kolona + Broj redova + Klikni na sliku za prikaz pune veličine + Odaberi stavku + Prikaži stavku predmemorije + Odnosi se na original + Uključiti potomke + Prijateljska zajednica + Link na stranicu + Otvara povezani dokument u novom prozoru ili kartici + Link do medija + Odaberi početni čvor sadržaja + Odaberi medije + Odaberi tip medija + Odaberi ikonu + Odaberi stavku + Odaberi vezu + Odaberi makro + Odaberi sadržaj + Odaberi tip sadržaja + Odaberi početni čvor medija + Odaberi člana + Odaberi grupu članova + Odaberi tip članova + Odaberi čvor + Odaberi jezike + Odaberi sekcije + Odaberi korisnika + Odaberi korisnike + Nema pronađenih ikona + Nema parametara za ovaj makro + Nema dostupnih makroa za umetanje + Vanjski provajderi prijave + Detalji iznimaka + Zapisnik + Unutarnja iznimka + Poveži svoj + Poništi povezivanje svoje veze + račun + Odaberi urednika + Odaberite predložak + Ovo će obrisati čvor i sve njegove jezike. Ako želite obrisati jedan jezik, poništite radije objavu na tom jeziku. + %0%.]]> + %0% iz grupe %1%]]> + Da, ukloni + Brišete izgled + Promjena izgleda će rezultirati gubitkom podataka za bilo koji postojeći sadržaj koji je zasnovan na ovoj konfiguraciji. + + + + Da bi uvezli stavku iz rječnika, pronađite ".udt" datoteku na svom računalu klikom na + gumb "Uvezi" (na sljedećem ekranu će se tražiti da potvrdite) + + Stavka iz rječnika ne postoji. + Nadređena stavka ne postoji. + Ne postoje stavke iz rječnika. + U ovoj datoteci nema stavki iz rječnika. + Nisu pronađene stavke iz rječnika. + Kreirajte stavku iz rječnika + + + %0%' ispod + ]]> + Kultura + + Pregled riječnika + + + Konfigurirani pretraživači + Prikazuje svojstva i alate za bilo koji konfigurirani pretraživač (npr. kao multi-indeksni pretraživač) + Vrijednosti polja + Status zdravlja + Status zdravlja indeksa i da li se može pročitati + Indeksi + Indeks info + Sadržaj u indeksu + Navodi svojstva indeksa + Upravljanje Examine-ovim indeksima + Omogućava vam pregled detalja svakog indeksa i pruža neke alate za upravljanje indeksima + Obnovi indeks + + Ovisno o količini sadržaja vaše web stranice, ovo bi moglo potrajati.
+ Nije preporučljivo obnavljati index-e tijekom velike posjećenosti vaše web stranice ili u vrijeme kada urednik uređuje sadržaj stranice. + ]]> +
+ Pretraživači + Pretražite indeks i pogledajte rezultate + Alati + Alati za upravljanje indeksima + polja + Indeks se ne može pročitati i morat će se ponovo obnoviti + Proces traje duže od očekivanog, provjerite Umbraco log zapis da vidite + da li je bilo grešaka tijekom ove operacije + + Ovaj indeks se ne može ponovo obnoviti jer mu nije dodijeljen + IIndexPopulator + + + Upišite svoje korisničko ime + Upišite svoju lozinku + Potvrdite lozinku + Imenujte %0%... + Upišite ime... + Upišite email... + Upišite korisničko ime... + Oznaka... + Upišite opis... + Upišite za pretragu... + Upišite za filtriranje... + Upišite da dodate oznake (pritisnite enter nakon svake oznake)... + Upišite vaš email + Upišite poruku... + Vaše korisničko ime je obično vaš email + #value ili ?key=value + Upišite alias... + Generiranje aliasa... + Kreiraj stavku + Uredi + Naziv + + + Kreirajte prilagođeni prikaz liste + Ukloni prilagođeni prikaz liste + Tip sadržaja, tip medija ili tip člana s ovim aliasom već postoji + + + Preimenovano + Upišite novi naziv mape + %0% je preimenovan u %1% + + + Dodajte vrijednost + Tip baze podataka + Uređivač svojstva GUID + Uređivač svojstva + Gumbi + Omogući napredne postavke za + Omogući kontekstni meni + Maksimalna zadana veličina umetnutih slika + Povezani stilovi + Prikaži oznaku + Širina i visina + Odaberite mapu za premještanje + do u strukturi stabla ispod + je premeštena ispod + + + Vaši podaci su spremljeni, ali prije nego što možete objaviti ovu stranicu postoje neke + greške koje prvo morate ispraviti: + + Trenutni provajder članstva ne podržava promjenu lozinke + (Omogući preuzimanje lozinke mora biti uključeno) + + %0% već postoji + Bilo je grešaka: + Bilo je grešaka: + Lozinka treba imati najmanje %0% znakova i sadržavati najmanje %1% + znakova koji nisu alfanumerički + + %0% mora biti cijeli broj + Polje %0% na kartici %1% je obavezno + %0% je obavezno polje + %0% na %1% nije u ispravnom formatu + %0% nije u ispravnom formatu + + + Primljena greška sa servera + Administrator je zabranio navedeni tip datoteke + NAPOMENA! Iako je CodeMirror omogućen konfiguracijom, on je onemogućen u + Internet Explorer-u jer nije dovoljno stabilan. + + Unesite i alias i ime na novu vrstu svojstva! + Postoji problem sa pristupom za čitanje/pisanje određenoj datoteci ili mapi + Greška pri učitavanju skripte parcijalnog prikaza (datoteka: %0%) + Unesite naslov + Molimo odaberite tip + Napravit ćete sliku veću od originalne veličine. Jeste li sigurni + da želite nastaviti? + + Početni čvor je obrisan, kontaktirajte svog administratora + Molimo označite sadržaj prije promjene stila + Nema dostupnih aktivnih stilova + Postavite kursor lijevo od dvije ćelije koje želite spojiti + Ne možete podijeliti ćeliju koja nije spojena. + Ovo svojstvo je nevažeće + + + O + Akcija + Akcije + Dodaj + Alias + Sve + Jeste li sigurni? + Nazad + Nazad na pregled + Rub + od + Odustani + Margina ćelije + Odaberi + Očisti + Zatvori + Zatvori prozor + Zatvori panel + Komentar + Potvrdi + Ograniči + Ograniči proporcije + Sadržaj + Nastavi + Kopiraj + Kreiraj + Baza podataka + Datum + Zadano + Obriši + Obrisano + Brisanje... + Dizajn + Riječnik + Dimenzije + Otkaži + Dolje + Preuzmi + Uredi + Uređeno + Elementi + Email + Greška + Polje + Pronađi + Prvi + Fokusna točka + Općenito + Grupe + Grupa + Visina + Pomoć + Sakrij + Povijest + Ikona + Id + Uvezi + Pretraži samo ovu mapu + Info + Unutrašnja margina + Umetni + Instaliraj + Nevažeće + Poravnaj + Oznaka + Jezik + Zadnji + Izgled + Linkovi + Učitavanje + Zaključano + Prijava + Odjava + Odjava + Makro + Obavezno + Poruka + Pomakni + Ime + Novo + Sljedeći + Ne + Ime čvora + od + Isključeno + OK + Otvori + Opcije + Uključeno + ili + Poredaj po + Lozinka + Putanja + Trenutak molim... + Prethodno + Svojstva + Pročitaj više + Ponovo izgradi + Email za primanje obrasca + Koš za smeće + Vaš koš za smeće je prazn + Osvježi + Preostalo + Izbriši + Preimenuj + Obnovi + Obavezno + Povratiti + Pokušaj ponovo + Dozvole + Planirano objavljivanje + Umbraco info + Traži + Žao nam je, ne možemo pronaći ono što tražite. + Nije dodana nijedna stavka + Server + Postavke + Prikaži + Prikaži stranicu nprilikom Slanja + Veličina + Sortiranje + Status + Potvrdi + Uspjeh + Tip + Ime tipa + Upišite za pretragu... + ispod + Gore + Ažuriraj + Nadogradi + Prenesi + URL + Korisnik + Korisničko ime + Vrijednost + Pogled + Dobrodošli... + Širina + Da + Mapa + Rezultati pretrage + Promijeni redosljed + Završeno sortiranje + Pregled + Promijeni lozinku + do + Prikaz liste + Spremanje... + trenutni + Ugradi + odabran + Ostalo + Članci + Videi + Avatar za + Zaglavlje + sistemsko polje + Posljednje ažurirano + + + Plava + + + Dodaj grupu + Dodaj svojstvo + Dodaj urednika + Dodaj predložak + Dodajte podređeni čvor + Dodaj dijete + Uredite tip podataka + Krećite se po odjeljcima + Prečice + Prikaži prečice + Uključi prikaz liste + Uključi dozvoli kao root + Redovi za komentiranje/dekomentiranje + Uklonite liniju + Kopiraj linije gore + Kopiraj linije dole + Pomakni linije gore + Pomakni linije dole + Općenito + Uređivač + Uključi dozvoli varijante kulture + + + Boja pozadine + Podebljano + Boja teksta + Font + Tekst + + + Stranica + + + Instalacija se ne može povezati s bazom podataka. + Nije moguće spremiti web.config datoteku. Molimo izmijenite konekcijski string + ručno. + + Vaša baza podataka je pronađena i identificirana je kao + Konfiguracija baze podataka + + Instaliraj za instalaciju Umbraco %0% baze podataka + ]]> + + + Dalje da nastavite.]]> + Baza podataka nije pronađena! Provjerite jesu li informacije u "konekcijskom string" u "web.config" datoteci ispravne.

+

Da nastavite, uredite "web.config" datoteku. (koristeći Visual Studio ili vaš omiljeni uređivač teksta), skorlajte do dna, dodajte konekcijski string za vašu bazu podataka u svojstvo nazvan "UmbracoDbDSN" i spremite datoteku.

+

+ Kliknite na gumb pokušaj ponovo kada završite.
+ + Više informacija o uređivanju web.config datoteke možete pronaći ovdje.

]]>
+ + Molimo kontaktirajte svog ISP-a ako je potrebno. + Ako instalirate na lokalnoj mašini ili serveru, možda će vam trebati informacije od administratora sistema.]]> + + Pritisnite nadogradnja za nadogradnju vaše baze podataka na Umbraco %0%

+

+ Ne brinite - nijedan sadržaj neće biti obrisan i sve će nastaviti raditi nakon toga! +

+ ]]>
+ Pritisnite Dalje da nastavite.]]> + + Dalje da nastavite sa čarobnjakom za konfiguraciju]]> + + Zadanu korisničku lozinku treba promijeniti!]]> + + Zadani korisnik je onemogućen ili nema pristup Umbraco-u!

Ne treba preduzimati nikakve daljnje radnje. Pritisnite Dalje da nastavite.]]> + + Zadana korisnička lozinka je uspješno promijenjena od instalacije!

Ne treba preduzimati nikakve daljnje radnje. Pritisnite Dalje da nastavite.]]> + Lozinka je promijenjena! + Započnite odlično, pogledajte naše uvodne video zapise + Klikom na sljedeći gumb (ili modifikacijom umbracoConfigurationStatus u web.config), + prihvaćate licencu za ovaj softver kao što je navedeno u polju ispod. Primijetite da se ova Umbraco distribucija + sastoji se od dvije različite licence, open source MIT licence za okvir i licence za besplatni softver Umbraco + koji pokriva korisničko sučelje. + + Još nije instalirano. + Zahvaćene datoteke i mape + Više informacija o postavljanju dozvola za Umbraco ovdje + Morate dodijeliti dozvole za izmjenu ASP.NET-a za sljedeće + datoteke/mape + + Vaše postavke dozvola su gotovo savršene!

+ Možete pokrenuti Umbraco bez problema, ali nećete moći instalirati pakete koji se preporučuju da biste u potpunosti iskoristili Umbraco.]]>
+ Kako riješiti + Kliknite ovdje da pročitate tekstualnu verziju + + video tutorijale o postavljanju dozvola foldera za Umbraco ili pročitajte tekstualnu verziju.]]> + Vaše postavke dozvola mogu biti problem! +

+ Možete pokrenuti Umbraco bez problema, ali nećete moći kreirati mape ili instalirati pakete koji se preporučuju da biste u potpunosti iskoristili Umbraco.]]>
+ Vaše postavke dozvola nisu spremne za Umbraco! +

+ Da biste pokrenuli Umbraco, morat ćete ažurirati postavke dozvola.]]>
+ Vaše postavke dozvola su savršene!

+ Spremni ste da pokrenete Umbraco i instalirate pakete!]]>
+ Rješavanje problema sa mapom + Pratite ovu vezu za više informacija o problemima sa ASP.NET i + kreiranje mapa + + Postavljanje dozvola za mape + + Želim početi od nule + naučite kako) + I dalje možete odabrati da kasnije instalirate Runway. Molimo idite na odjeljak Developer i odaberite Paketi. + ]]> + Upravo ste postavili čistu Umbraco platformu. Šta želite sljedeće učiniti? + Runway je instaliran + + Ovo je naša lista preporučenih modula, označite one koje želite da instalirate ili pogledajte punu listu modula + ]]> + Preporučuje se samo iskusnim korisnicima + Želim početi s jednostavnom web-stranicom + + "Runway" je jednostavna web stranica koja nudi neke osnovne tipove dokumenata i predloške. Instalacijski čarobnjak može postaviti Runway za vas automatski, + ali ga možete lako urediti, proširiti ili ukloniti. Nije potrebno i možete savršeno koristiti Umbraco i bez njega. Kako god, + Runway nudi laku osnovu zasnovanu na najboljim praksama za početak brže nego ikad. + Ako se odlučite za instalaciju Runway, opcionalo možete odabrati osnovne građevne blokove tzv. Runway Modules da poboljšate svoje Runway stranice. +

+ + Uključeno u Runway: Početna stranica, Stranica za početak, Stranica za instaliranje modula.
+ Dodatni moduli: Navigacija, Sitemap, Kontakt, Galerija. +
+ ]]>
+ Što je Runway + Korak 1/5: Prihvatite licencu + Korak 2/5: Konfiguracija baze podataka + Korak 3/5: Potvrđivanje dozvola za datoteke + Korak 4/5: Provjerite Umbraco sigurnost + Korak 5/5: Umbraco je spreman za početak + Hvala vam što ste odabrali Umbraco + Pregledajte svoju novu stranicu +Instalirali ste Runway, pa zašto ne biste vidjeli kako izgleda vaša nova web stranica.]]> + Dodatna pomoć i informacije +Potražite pomoć od naše nagrađivane zajednice, pregledajte dokumentaciju ili pogledajte nekoliko besplatnih videozapisa o tome kako napraviti jednostavnu stranicu, kako koristiti pakete i brzi vodič za terminologiju Umbraco]]> + Umbraco %0% je instaliran i spreman za upotrebu + /web.config datoteku i ažurirati svojstvo unutar AppSetting UmbracoConfigurationStatus na dnu do vrijednosti od '%0%'.]]> + započeti odmah klikom na "Pokreni Umbraco" gumb ispod.
Ako ste novi u Umbraco-u, +možete pronaći mnogo resursa na našim stranicama za početak.]]>
+ Pokreni Umbraco +Da bi upravljali svojom web lokacijom, jednostavno otvorite Umbraco backoffice i počnite dodavati sadržaj, ažurirati predloške i stilove ili dodati novu funkcionalnost]]> + Povezivanje s bazom podataka nije uspjelo. + Umbraco Verzija 3 + Umbraco Verzija 4 + Gledaj + Umbraco %0% za novu instalaciju ili nadogradnju sa verzije 3.0. +

+ Pritisnite "Dalje" da pokrenete čarobnjaka.]]>
+ + + Kod kulture + Naziv kulture + + + Bili ste u stanju mirovanja i automatski će doći do odjave + Obnovite sada da sačuvate svoj rad + + + Sretna super nedelja + Sretan divan ponedeljak + Sretan specifičan utorak + Sretna divna srijeda + Sretan gromoglasan četvrtak + Sretan zanimljiv petak + Sretna opuštena subota + Prijavite se u nastavku + Prijav sa + Isteklo je vrijeme sesije + + © 2001 - %0%
Umbraco.com

]]>
+ Zaboravljena lozinka? + E-mail poruka bit će poslana na navedenu adresu sa linkom za resetiranje lozinke + E-mail poruka s uputama za poništavanje lozinke će biti poslana na navedenu adresu ukoliko odgovara našoj evidenciji + Prikaži lozinku + Sakrij lozinku + Povratak na obrazac za prijavu + Molimo unesite novu lozinku + Vaša lozinka je ažurirana + Link na koji ste kliknuli je nevažeći ili je istekao + Umbraco: Reset lozinke + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+ + + + + + +
+
+
+ + + + +
+ + + + +
+

+ Zatraženo je ponovno postavljanje lozinke +

+

+ Vaše korisničko ime za prijavu na Umbraco backoffice je: %0% +

+

+ + + + + + +
+ + Kliknite na ovaj link da poništite lozinku + +
+

+

Ukoliko ne možete kliknuti na link, kopirajte i zalijepite ovaj URL u prozor vašeg pretraživača:

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

+
+
+


+
+
+ + + ]]>
+ Umbraco: Sigurnosni kod + Vaš sigurnosni kod je: %0% + Posljednji korak + Omogućili ste 2-faktorsku autentifikaciju i morate potvrditi svoj identitet. + Molimo odaberite 2-faktor provajdera + Verifikacijski kod + Unesite verifikacijski kod + Unesen je nevažeći kod + + + Kontrolna ploča + Sekcije + Sadržaj + + + Odaberite stranicu iznad... + %0% je kopiran u %1% + Odaberite gdje dokument %0% treba kopirati ispod + %0% je premješten u %1% + Odaberite gdje dokument %0% treba premjestiti ispod + je odabrano kao korijen vašeg novog sadržaja, kliknite na 'Uredu' ispod. + Još nije odabran čvor, molimo odaberite čvor na gornjoj listi prije nego kliknete na 'Uredu' + Trenutni čvor nije dozvoljen pod odabranim čvorom zbog njegovog tipa + Trenutni čvor se ne može premjestiti na jednu od njegovih podstranica niti roditelj i odredište mogu biti isti + Trenutni čvor ne može postojati u korijenu + Radnja nije dozvoljena jer nemate dovoljna dopuštenja za 1 ili više djece + dokumenata. + + Povežite kopirane stavke s originalom + + + %0%]]> + Postavke obavijesti su spremljene za + + Sljedeći jezici su izmijenjeni %0% + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+ + + + + + +
+
+
+ + + + +
+ + + + +
+

+ Pozdrav %0%, +

+

+ Ovo je automatiziran email koja vas obavještava da je zadatak '%1%' izvršen na stranici '%2%' od korisnika '%3%' +

+ + + + + + +
+ +
+EDIT
+
+

+

Sažetak izmjena:

+ %6% +

+

+ Ugodan dan!

+ Pozdrav od Umbraco robota +

+
+
+


+
+
+ + + ]]>
+ Sljedeći jezici su izmijenjeni:

+ %0% + ]]>
+ [%0%] Obavijesti o %1% izvedena na %2% + Obavijesti + + + Akcije + Kreirano + Kreiraj paket + + i odaberite paket. Umbraco paketi uglavnom imaju ".umb" ili ".zip" ekstenziju. + ]]> + Ovo će obrisati paket + Uključi sve podređene čvorove + Instalirano + Instalirani paketi + Uputstva za instalaciju + Ovaj paket nema prikaz konfiguracije + Još nije kreiran nijedan paket + Nijedan paket nije instaliran + + 'Paketi' u gornjem desnom uglu ekrana]]> + Sadržaj paketa + Licenca + Pretražite pakete + Rezultati za + Nismo mogli pronaći ništa za + Pokušajte potražiti drugi paket ili pregledajte kategorije + + Popularno + Promocije + Nova izdanja + ima + karma bodovi + Informacije + Vlasnik + Suradnici + Kreirano + Trenutna verzija + .NET verzija + Preuzimanja + Lajkovi + Kompatibilnost + Ovaj paket je kompatibilan sa sljedećim verzijama Umbraco-a, kako su + prijavili članovi zajednice. Potpuna kompatibilnost se ne može garantirati za dolje navedene verzije 100% + + Vanjske poveznice + Autor + Dokumentacija + Meta podaci paketa + Naziv paketa + Paket ne sadrži nikakve stavke +
+ Ovo možete bezbjedno ukloniti iz sistema klikom na "deinstaliraj paket".]]>
+ Opcije paketa + Pokrenite migracije paketa na čekanju + Readme paketa + Repozitorij paketa + Potvrdi deinstalaciju paketa + Paket je deinstaliran + Paket je uspješno deinstaliran + Deinstaliraj paket + + Bilješka: svi dokumenti, mediji itd. u zavisnosti od stavki koje uklonite, prestat će raditi i mogu dovesti do nestabilnosti sistema, + pa deinstalirajte sa oprezom. Ako ste u nedoumici, kontaktirajte autora paketa.]]> + Verzija paketa + Provjereno za rad na Umbraco Cloud + + + Zalijepi s punim formatiranjem (nije preporučljivo) + Tekst koji pokušavate zalijepiti sadrži posebne znakove ili formatiranje. Ovo bi moglo biti + uzrokovano kopiranjem teksta iz programa Microsoft Word. Umbraco može automatski ukloniti posebne znakove ili formatiranje, tako da + zalijepljeni sadržaj će biti prikladniji za web. + + Zalijepite kao običan tekst bez ikakvog oblikovanja + Zalijepi, ali ukloni oblikovanje (preporučeno) + + + Grupna zaštita + Ako želite dodijeliti pristup svim članovima određenih grupa članova + Morate kreirati grupu članova prije nego što možete koristiti grupnu autentifikaciju + Stranica sa greškom + Koristi se kada su ljudi prijavljeni, ali nemaju pristup + %0%]]> + %0% je sada zaštićen]]> + %0%]]> + Stranica za prijavu + Odaberite stranicu koja sadrži obrazac za prijavu + Uklonite zaštitu... + + %0%?]]> + Odaberite stranice koje sadrže obrazac za prijavu i poruke o greškama + %0%]]> + %0%]]> + Posebna zaštita članova + Ako želite dati pristup određenim članovima + + + + + + + + + + Uključite neobjavljene podstranice + Objavljivanje u toku - molimo pričekajte... + %0% od %1% stranica je objavljeno... + %0% je objavljeno + %0% i objavljene su podstranice + Objavi %0% i sve njegove podstranice + Objavi za objavu %0% i na taj način svoj sadržaj učiniti javno dostupnim.

+ Ovu stranicu i sve njene podstranice možete objaviti odabirom Uključi neobjavljene podstranice. + ]]>
+ + + Niste konfigurirali nijednu odobrenu boju + + + Možete odabrati samo stavke tipa: %0% + Odabrali ste stavku sadržaja koja je trenutno obrisana ili je u košu za smeće + Odabrali ste stavke sadržaja koje su trenutno obrisane ili su u košu za smeće + + + Izbrisana stavka + Odabrali ste medijsku stavku koja je trenutno obrisana ili je u košu za smeće + Odabrali ste medijske stavke koje su trenutno obrisane ili su u košu za smeće + Otpad + Otvorite u biblioteci medija + Promjena medijske stavke + Uredi %0% od %1% + Odbaci kreiranje? + + Izmijenili ste ovaj sadržaj. Jeste li sigurni da ga želite + odbaciti? + + Uklonite sve medije? + Međuspremnik + Nije dozvoljeno + Otvorite odabir medija + + + unesite vanjski link + izaberite internu stranicu + Naslov + Link + Otvori u novom prozoru + unesite natpis na ekranu + Unesite link + + + Resetirajte izrezivanje + Gotovo + Poništi izmjene + Korisnički definirano + + + Promjene + Kreirano + Trenutna verzija + + Crveni tekst bit će uklonjen u odabranoj verziji, zeleni tekst će biti dodan]]> + Nema razlike između trenutne verzije i odabrane verzije + Dokument je vraćen + Odaberite verziju koju želite usporediti sa trenutnom verzijom + Ovo prikazuje odabranu verziju kao HTML, ako želite vidjeti razliku između dvije + verzije u isto vrijeme, koristite pogled diff + + Vratite se na + Odaberite verziju + Pogled + + + Uredite datoteku skripte + + + Portirnica + Sadržaj + Kurir + Developer + Forme + Pomoć + Umbraco Konfiguracijski Čarobnjak + Mediji + Članovi + Newsletteri + Paketi + Marketplace + Postavke + Statistika + Prijevodi + Korisnici + + + Ture + Najbolji Umbraco video tutorijali + Posjetite our.umbraco.com + Posjetite umbraco.tv + Pogledajte naše besplatne video tutorijale + na Umbraco Learning Base + + + Zadani predložak + Da biste uvezli vrstu dokumenta, pronađite ".udt" datoteku na svom računalu klikom na + gumb "Uvezi" (na sljedećem ekranu će se tražiti da potvrdite) + + Naslov nove kartice + Tip čvora + Tip + Stilovi + Skripte + Kartica + Naslov kartice + Kartice + Glavni tip sadržaja je omogućen + Ovaj tip sadržaja koristi + Nema definiranih svojstava na ovoj kartici. Kliknite na vezu "dodaj novu nekretninu" na + vrh za kreiranje novog svojstva. + + Kreirajte odgovarajući predložak + Dodaj ikonu + + + Redoslijed sortiranja + Datum kreiranja + Sortiranje završeno. + Povucite različite stavke gore ili dolje ispod da postavite kako bi trebale biti raspoređene. Ili kliknite na + zaglavlja kolona za sortiranje cijele kolekcije stavki + + + + + Validacija + Greške u validaciji moraju biti ispravljene prije nego što se stavka može spremiti + Nije uspjelo + Spremljeno + Nedovoljne korisničke dozvole, operacija se ne može dovršiti + Otkazano + Operaciju je otkazao dodatak treće strane + Ova datoteka se učitava kao dio fasckile, ali kreiranje nove mape ovdje nije dozvoljeno + Kreiranje nove mape ovdje nije dozvoljeno + Objavljivanje je otkazao dodatak treće strane + Tip svojstva već postoji + Tip svojstva kreiran + Tip podatka: %1%]]> + Tip svojstva obrisan + Tip dokumenta spremljen + Kartica kreirana + Kartica je obrisana + Kartica sa id-em: %0% je obrisana + Stilovi nisu spremljeni + Stilovi spremljeni + Stilovi spremljeni bez ikakvih grešaka + Tip podatka spremljen + Stavka riječnika je spremljena + Objavljivanje nije uspjelo jer nadređena stranica nije objavljena + Sadržaj objavljen + i vidljivo na web stranici + Predložak sadržaja je spremljen + Promjene su uspješno spremljene + Sadržaj spremljen + Ne zaboravite objaviti da promjene budu vidljive + Poslano na odobrenje + Promjene su poslane na odobrenje + Medij spremljen + Medij spremljen bez ikakvih grešaka + Član spremljen + Svojstvo stilova spremljeno + Stilovi spremljeni + Predložak spremljen + Greška pri spremanju korisnika (provjerite log zapis) + Korisnik spremljen + Tip korisnika spremljen + Grupa korisnika spremljena + Kulture i imena hostova su spremljeni + Greška pri spremanju kultura i imena hostova + Datoteka nije spremljena + Datoteka nije mogla biti spremljena. Molimo provjerite dozvole za datoteke + Datoteke spremljene + Datoteka spremljena bez ikakvih grešaka + Jezik spremljen + Tip medija spremljen + Tip člana spremljen + Grupa članova spremljena + Druga grupa članova sa istim imenom već postoji + Predložak nije spremljen + Uvjerite se da nemate 2 predloška sa istim aliasom + Predložak spremljen + Predložak spremljen bez ikakvih grešaka! + Sadržaj nije objavljen + Parcijalni prikaz spremljen + Parcijalni prikaz spremljen bez ikakvih grešaka! + Parcijalni prikaz nije spremljen + Došlo je do greške prilikom spremanja datoteke. + Dozvole su spremljene za + Izbrisano je %0% grupa korisnika + %0% je obrisano + Omogućeno %0% korisnika + Onemogućeno %0% korisnika + %0% je sada omogućen + %0% je sada onemogućen + Grupe korisnika su postavljene + Otključano %0% korisnika + %0% je sada otključan + Član je izvezen u datoteku + Došlo je do greške prilikom izvoza člana + Korisnik %0% je obrisan + Pozovi korisnika + Pozivnica je ponovo poslana na %0% + Tip dokumenta je izvezen u datoteku + Došlo je do greške prilikom izvoza tipa dokumenta + Stavke iz riječnika su izvezene u datoteku + Došlo je do greške prilikom izvoza stavki rječnika + Sljedeće stavke iz rječnika su uvezene! + Domene nisu konfigurirane za višejezične stranice, molimo kontaktirajte administratora, + pogledajte log zapise za više informacija + + Nijedna domena nije konfigurirana za %0%, molimo kontaktirajte administratora + Vaše sistemske informacije su uspješno kopirane u međuspremnik + Nije moguće kopirati vaše sistemske informacije u međuspremnik + + + Dodaj stil + Uredi stil + Stilovi za uređivanje bogatog teksta + Definirajte stilove koji bi trebali biti dostupni u uređivaču obogaćenog teksta za ove + stilove + + Uredi stilove + Uredi svojstvo stilova + Ime prikazano u uređivaču odabira stilova + Pregled + Kako će tekst izgledati u uređivaču obogaćenog teksta. + Selektor + Koristite CSS sintaksu, npr. "h1" ili ".redHeader" + Stilovi + CSS koji treba primijeniti u uređivaču obogaćenog teksta, npr. "color:red;" + Kod + Uređivač + + + Produkcija.]]> + Brisanje predloška sa ID-om %0% nije uspjelo + Uredi predložak + Sekcije + Umetnite područje sadržaja + Umetnite čuvara mjesta u području sadržaja + Umetni + Odaberite što ćete umetnuti u svoj predložak + Stavka iz rječnika + Stavka rječnika je čuvar mjesta za prevodljiv dio teksta, koji + olakšava kreiranje dizajna za višejezične web stranice. + + Makro + + Makro je komponenta koja se može konfigurirati i odlična je za + višenamjenske dijelove vašeg dizajna, gdje vam je potrebna opcija za pružanje parametara, + kao što su galerije, obrasci i liste. + + Vrijednost + Prikazuje vrijednost polja sa trenutne stranice po aliasu s opcijama za izmjenu vrijednosti ili povratak na alternativne vrijednosti. + Parcijalni prikaz + + Parcijalni prikaz je zasebna datoteka predloška koja se može prikazati unutar drugog + predložka, odličan je za ponovnu upotrebu markupa ili za odvajanje složenih predložaka u zasebne datoteke. + + Glavni predložak + Nema glavnog predloška + Renderirajte podređeni predložak + @RenderBody(). + ]]> + Definirajte imenovanu sekciju + @section { ... }. Ovo se može prikazati u + određenom području nadređenog predloška, koristeći @RenderSection. + ]]> + Renderirajte imenovanu sekciju + @RenderSection(name). + Ovo prikazuje područje podređenog predloška koje je umotano u odgovarajuću @section [name]{ ... } definiciju. + ]]> + Naziv sekcije + Sekcija je obavezna + @section, u suprotnom se prikazuje greška. + ]]> + Generiranje upita + stavaka vraćeno, u + Želim + sav sadržaj + sadržaj tipa "%0%" + sa + moje web stranice + gdje + i + je + nije + prije + prije (uključujući odabrani datum) + poslije + poslije (uključujući odabrani datum) + jednako + nije jednako + sadrži + ne sadrži + veće od + veće ili jednako + manje od + manje ili jednako + Id + Naziv + Kreirano + Ažurirano + poredaj po + uzlazno + silazno + Predložak + + + Slika + Makro + Odaberite tip sadržaja + Odaberite izgled + Dodaj redak + Dodaj sadržaj + Ispusti sadržaj + Postavke su primijenjene + Ovaj sadržaj ovdje nije dozvoljen + Ovaj sadržaj je ovdje dozvoljen + Kliknite za ugradnju + Kliknite da umetnete sliku + Kliknite da umetnete makro + Pišite ovdje... + Raspored mreže + Izgledi su cjelokupno radno područje za uređivač mreže, obično vam je potreban samo jedan ili + dva različita izgleda + + Dodajte raspored mreže + Uredite raspored mreže + Prilagodite izgled postavljanjem širine kolona i dodavanjem dodatnih odjeljaka + Konfiguracije redova + Redovi su predefinirani za raspored vodoravno + Dodajte konfiguraciju reda + Uredite konfiguraciju reda + Podesite red postavljanjem širine ćelija i dodavanjem dodatnih ćelija + Nije dostupna dodatna konfiguracija + Kolone + Ukupan kombinirani broj kolona u rasporedu mreže + Postavke + Konfigurirajte koje postavke urednici mogu promijeniti + Stilovi + Konfigurirajte šta uređivači stilova mogu promijeniti + Dozvoli svim urednicima + Dozvoli sve konfiguracije redaka + Maksimalan broj stavki + Ostavite prazno ili postavite na 0 za neograničeno + Postavi kao zadano + Odaberite extra + Odaberite zadano + su dodani + Upozorenje + + Promjena imena konfiguracije reda će rezultirati gubitkom podataka za bilo koji postojeći sadržaj koji se temelji na ovoj konfiguraciji.

Izmjena samo oznake neće rezultirati gubitkom podataka.

]]>
+ Brišete konfiguraciju reda + + Brisanje imena konfiguracije reda će rezultirati gubitkom podataka za bilo koji postojeći sadržaj koji je zasnovan na ovome + konfiguraciju. + + Brišete izgled + Izmjena izgleda će rezultirati gubitkom podataka za bilo koji postojeći sadržaj koji je zasnovan + na ovoj konfiguraciji. + + + + Kompozicije + Grupa + Niste dodali nijednu grupu + Dodaj grupu + Naslijeđeno od + Dodaj svojstvo + Obavezna oznaka + Omogući prikaz liste + Konfigurira stavku sadržaja da prikaže njenu listu koja se može sortirati i pretraživati djecu, djeca neće biti prikazana u stablu + + Dozvoljeni predlošci + Odaberite koje predloške urednici mogu koristiti na sadržaju ove vrste + + Dozvoli kao korijen + Dozvolite urednicima da kreiraju sadržaj ovog tipa u korijenu stabla sadržaja. + + Dozvoljeni tipovi podređenih čvorova + Dozvolite da se sadržaj navedenih tipova kreira ispod sadržaja ovog tipa. + + Odaberite podređeni čvor + Naslijediti kartice i svojstva iz postojeće vrste dokumenta. Nove kartice bit će + dodane trenutnoj vrsti dokumenta ili spojene ako postoji kartica s identičnim imenom. + + Ovaj tip sadržaja se koristi u kompoziciji i stoga se ne može sam sastaviti. + + Nema dostupnih tipova sadržaja za upotrebu kao kompozicija. + Uklanjanje kompozicije će obrisati sve povezane podatke o svojstvu. Jednom kada spremite tip dokumenta, nema povratka. + + Napravi novi + Koristite postojeće + Postavke urednika + Konfiguracija + Da, izbriši + je premještena ispod + je kopirano ispod + Odaberite mapu za premještanje + Odaberite mapu za kopiranje + do u strukturi stabla ispod + Svi tipovi dokumenata + Svi dokumenti + Sve medijske stavke + korištenje ovog tipa dokumenta bit će trajno izbrisano, potvrdite da želite obrisati ove također. + korištenje ove vrste medija će biti trajno izbrisano, potvrdite da želite obrisati ove također. + + korištenje ove vrste člana će biti trajno izbrisano, potvrdite da želite obrisati ove također + i svi dokumenti koji koriste ovu vrstu + i sve medijske stavke koje koriste ovu vrstu + i svi članovi koji koriste ovaj tip + Član može uređivati + Dozvolite da ovu vrijednost svojstva da uređuje član na svojoj stranici profila + + Osjetljivi podaci + Sakrij ovu vrijednost svojstva od urednika sadržaja koji nemaju pristup pregledu + osjetljive informacije + + Prikaži na profilu člana + Dozvolite da se ova vrijednost svojstva prikaže na stranici profila člana + + kartica nema redoslijed sortiranja + Gdje se koristi ovaj sastav? + Ovaj sastav se trenutno koristi u sastavu sljedećih + tipa sadržaja: + + Dozvoli varijacije + Dozvolite varirati u zavisnosti od kulture + Dozvoli segmentaciju + Varijacije po kulturi + Varijacije po segmentima + Dozvolite urednicima da kreiraju sadržaj ove vrste na različitim jezicima. + Dozvolite urednicima da kreiraju sadržaj na različitim jezicima. + Dozvolite urednicima da kreiraju segmente ovog sadržaja. + Dozvolite varijaciju po kulturi + Dozvoli segmentaciju + Tip elementa + Je li tip elementa + Tip elementa je namijenjen za korištenje na primjer u ugniježđenom sadržaju, a ne u stablu. + + Tip dokumenta se ne može promijeniti u tip elementa nakon što je naviknut + kreirati jednu ili više stavki sadržaja. + + Ovo nije primjenjivo za tip elementa + Napravili ste promjene on ovom svojstvu. Jeste li sigurni da ih želite odbaciti? + Izgled + Oznaka iznad (puna širina) + Uklanjate podređeni čvor + Uklanjanje podređenog čvora ograničit će opcije urednika da kreiraju drugačiji sadržaj + tipovi ispod čvora. + + korištenjem ovog uređivača bit će ažurirane nove postavke. + Brisanje povijesti + Dozvoli zaobilaženje postavki čišćenja globalne povijesti. + Neka sve verzije budu novije od dana + Čuvajte najnoviju verziju po danu danima + Spriječi čišćenje + Omogući čišćenje + BILJEŠKA! Čišćenje povijesnih verzija sadržaja onemogućeno je globalno. Ove postavke neće stupiti na snagu prije nego što se omogući.]]> + + + Dodaj jezik + ISO kod + Obavezan jezik + Svojstva na ovom jeziku moraju biti popunjena prije nego što se čvor može objaviti. + + Zadani jezik + Umbraco stranica može imati samo jedan zadani jezik. + Promjena zadanog jezika može rezultirati nedostatkom zadanog sadržaja. + Vraća se na + Nema zamjenskog jezika + Da se omogući višejezični sadržaj da se vrati na drugi jezik ako ne + bude prisutan na traženom jeziku, odaberite ga ovdje. + + Zamjenski jezik + niti jedan + + + Dodaj parameter + Uredi parameter + Unesite naziv makroa + Parametri + Definirajte parametre koji bi trebali biti dostupni kada koristite ovaj makro. + Odaberite parcijalni prikaz makro datoteke + + + Kreiranje modela + ovo može potrajati, ne brinite + Modeli generirani + Modeli ne mogu biti generirani + Generiranje modela nije uspjelo, pogledajte iznimku u log zapisima + + + Dodajte zadanu vrijednost + Zadana vrijednost + Rezervno polje + Zadana vrijednost + Veličina slova + Kodiranje + Odaberite polje + Pretvorite prijelome redaka + Zamjenjuje prijelome reda sa 'br' html oznakom + Prilagođena polja + Samo datum + Formatiraj kao datum + Kodirati kao HTML + Zamijenit će specijalne znakove njihovim HTML ekvivalentom. + Bit će umetnuto iza vrednosti polja + Bit će umetnuto ispred vrednosti polja + Mala slova + Nema + Izlazni uzorak + Umetnuti nakon polja + Umetnuti ispred polja + Rekurzivno + Da, neka bude rekurzivno + Standardna polja + Velika slova + Kodirati kao URL + Formatirat će posebne znakove u URL-ovima + Koristit će se samo kada su vrijednosti polja iznad prazne + Ovo polje će se koristiti samo ako je primarno polje prazno + Datum i vrijeme + + + Detalji prijevoda + Preuzmi XML DTD + Polja + Uključi podstranice + + Nije pronađen niti jedan korisnik prevoditelja. Molimo kreirajte korisnika prevoditelja prije nego počnete slati + sadržaj u prijevod + + Stranica '%0%' je poslana na prijevod + Pošaljite stranicu '%0%' na prijevod + Ukupno riječi + Prevedi na + Prijevod završen. + Možete pregledati stranice koje ste upravo preveli klikom ispod. + Prijevod nije uspio, XML datoteka je možda oštećena + Opcije prevođenja + Prevoditelj + Uvezite XML prijevod + + + Sadržaj + Predlošci sadržaja + Mediji + Pretraživač predmemorije + Koš za smeće + Kreirani paketi + Tipovi podataka + Riječnik + Instalirani paketi + Instaliraj skin + Instaliraj starter kit + Jezici + Instaliraj lokalni paket + Makroi + Tipovi medija + Članovi + Grupe članova + Uloge članova + Tipovi članova + Tipovi dokumenata + Tipovi relacija + Paketi + Paketi + Parcijalni pogledi + Parcijalni pregledi makro datoteka + Instaliraj iz repozitorija + Instaliraj Runway + Runway moduli + Skripte + Skripte + Stilovi + Predlošci + Log preglednik + Korisnici + Postavke + Predložak + Treća strana + + + Postoji nova verzija + %0% je spremno, kliknite ovdje za preuzimanje + Veza sa serverom je prekinuta + Pogreška prilikom provjeravanja ažuriranja. Za dodtne informacije provjerite trace-stack + + + Pristup + Na temelju dodijeljenih grupa i početnih čvorova, korisnik ima pristup sljedećim čvorovima + + Dodijeli pristup + Administrator + Polje kategorije + Korisnik kreiran + Promijeni lozinku + Promijeni sliku + Nova lozinka + Najmanje %0% znakova! + Trebalo bi biti najmanje %0% specijalnih znakova. + nije zaključan + Lozinka nije promijenjena + Potvrdite novu lozinku + Možete promijeniti svoju lozinku za pristup Umbraco Back Officeu tako da ispunite donji obrazac i kliknete gumb "Promjeni lozinku" + Kanal sadržaja + Kreiraj drugog korisnika + Kreirajte nove korisnike kako biste im omogućili pristup Umbraco-u. Kada se kreira novi korisnik, stvorit će se lozinka koju možete podijeliti s korisnikom. + + Polje kratkog opisa + Onemogući korisnika + Tip dokumenta + Urednik + Obavezno - unesite email adresu za ovog korisnika + Polje izvoda + Neuspjeli pokušaji prijave + Idite na korisnički profil + Dodajte grupe za dodjelu pristupa i dozvola + Pozovite drugog korisnika + Pozovite nove korisnike da im omogućite pristup Umbraco-u. Korisniku bit će poslan email s pozivnicom i informacijama o tome kako se prijaviti u Umbraco. Pozivnice traju 72 sata. + + Jezik + Postavite jezik koji ćete vidjeti u izbornicima i dijaloškim okvirima + Zadnji datum zaključavanja + Zadnja prijava + Lozinka zadnje promijenjena + Korisničko ime + Medijski početni čvor + Ograničite biblioteku medija na određeni početni čvor + Medijski početni čvorovi + Ograničite biblioteku medija na određene početne čvorove + Sekcije + Obavezno - unesite ime za ovog korisnika + Onemogućite pristup Umbraco-u + se još nije prijavio + Stara lozinka + Lozinka + Resetiraj lozinku + Vaša lozinka je promijenjena! + Lozinka je promijenjena + Molimo potvrdite novu lozinku + Unesite novu lozinku + Vaša nova lozinka ne može biti prazna! + Trenutna lozinka + Nevažeća trenutna lozinka + Postoji razlika između nove lozinke i potvrđene lozinke. Molimo pokušajte ponovo! + Potvrđena lozinka ne odgovara novoj lozinki! + Zamijenite dozvole podređenog čvora + Trenutno mijenjate dozvole za stranice: + Odaberite stranice da promijenite njihove dozvole + Ukloni sliku + Zadane dozvole + Detaljne dozvole + Postavite dozvole za određene čvorove + Profil + Pretražite svu djecu + Ograničite jezike kojima korisnici imaju pristup za uređivanje + Dodajte odjeljke da korisnicima omogućite pristup + Odaberite grupe korisnika + Nije odabran početni čvor + Nije odabran nijedan početni čvor + Početni čvor sadržaja + Ograničite stablo sadržaja na određeni početni čvor + Početni čvorovi sadržaja + Ograničite stablo sadržaja na određene početne čvorove + Korisnik zadnji put ažuriran + je kreiran + Novi korisnik je uspješno kreiran. Za prijavu na Umbraco koristite + lozinka ispod. + + Upravljanje korisnicima + Korisničko ime + Korisničke dozvole + Grupa korisnika + je pozvan + Novom korisniku je poslana pozivnica s detaljima o tome kako se prijaviti u Umbraco. + Pozdrav i dobrodošli u Umbraco! Jedna minuta bit će vam potrebna da postavite svoju lozinku i dodate svoju profilnu sliku. + Dobrodošli u Umbraco! Nažalost pozivnica je istekla. Molimo kontaktirajte svog administratora i od njega tražite da ju ponovno pošalje. + AAko postavite svoju fotografiju, drugi korisnici će vas lako prepoznati. Kliknite krug iznad da biste prenijeli svoju fotografiju. + Pisac + Promjeni + Vaš profil + Vaša nedavna povijest + Sesija ističe za + Pozovi korisnika + Kreiraj korisnika + Pošalji pozivnicu + Nazad na korisnike + Umbraco: Pozivnica + + + + + + + + + + + +
+ + + + + +
+ +
+ +
+
+ + + + + + +
+
+
+ + + + +
+ + + + +
+

+ Pozdrav %0%, +

+

+ Pozvani ste od %1% u Umbraco administraciju. +

+

+ Poruka od %1%: +
+%2% +

+ + + + + + +
+ + + + + + +
+ + Kliknite na ovaj link da prihvatite pozivnicu + +
+
+

Ukoliko ne možete kliknuti na link, kopirajte i zalijepite ovaj URL u prozor vašeg pretraživača:

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

+
+
+


+
+
+ +]]>
+ Ponovno slanje pozivnice... + Obriši korisnika + Jeste li sigurni da želite obrisati ovaj korisnički račun? + Sve + Aktivan + Onemogućen + Zaključan + Odobren + Pozvan + Neaktivan + Naziv (A-Z) + Naziv (Z-A) + Najstarije + Najnovije + Zadnja prijava + Nijedna korisnička grupa nije dodana + Ako želite onemogućiti ovaj dvofaktorski provajder, onda morate unjeti kod prikazan na vašem uređaju za autentifikaciju: + Ovaj dvofaktorski provajder je omogućen + Ovaj dvofaktorski provajder je sada onemogućen + Nešto je pošlo po zlu s pokušajem da se onemogući ovaj dvofaktorski provajder + Želite li onemogućiti ovaj dvofaktorski provajder za ovog korisnika? + + + Validacija + Nema validacije + Potvrdi kao adresu e-pošte + Potvrdite kao broj + Potvrdi kao URL + ...ili unesite prilagođenu validaciju + Polje je obavezno + Upišite prilagođenu poruku o grešci validacije (opcionalno) + Upišite regularni izraz + Upišite prilagođenu poruku o grešci validacije (opcionalno) + Morate dodati najmanje + možete jedino imati + Dodajte do + stavke + URL-ovi + Odabrani URL-ovi + odabrane stavke + Nevažeći datum + Nije broj + Nije važeća brojčana veličina koraka + Nevažeći email + Vrijednost ne može biti null + Vrijednost ne može biti prazna + Vrijednost je nevažeća, ne odgovara ispravnom uzorku + Prilagođena validacija + %1% više.]]> + %1% previše.]]> + Zahtjevi za količinu sadržaja nisu ispunjeni za jedno ili više područja. + + + + Vrijednost je postavljena na preporučenu vrijednost: '%0%'. + Očekivana vrijednost '%1%' za '%2%' u konfiguracijskoj datoteci '%3%', ali je pronađeno '%0%'. + Pronađena neočekivana vrijednost '%0%' za '%2%' u konfiguracijskoj datoteci '%3%'. + + + Makro greške su postavljene na '%0%'. + Greške makroa su postavljene na '%0%' što će spriječiti potpuno učitavanje nekih ili svih stranica + na vašem sajtu ako postoje greške u makroima. Ako ovo ispravite, vrijednost će biti postavljena na '%1%'. + + + + Certifikat Vaše web stranice je važeći. + Greška u validaciji certifikata: '%0%' + SSL certifikat vaše web stranice je istekao. + SSL certifikat vaše web stranice istjeće za %0% dana. + Greška pri pinganju URL-a %0% - '%1%' + Trenutno %0% pregledavate stranicu koristeći HTTPS protokol. + AppSetting 'Umbraco:CMS:Global:UseHttps' je postavljen na 'false' u + vašoj appSettings.json datoteci. Jednom kada pristupite ovoj stranici koristeći HTTPS protokol, to bi trebalo biti postavljeno na 'true'. + + Postavka aplikacije 'Umbraco:CMS:Global:UseHttps' je postavljena na '%0%' u vašoj + appSettings.json datoteci, vaši kolačići su %1% označeni kao sigurni. + + + Način kompilacije otklanjanja grešaka je onemogućen. + Način kompilacije za otklanjanje grešaka je trenutno omogućen. Preporučuje se da se + onemogućite ovu postavku prije korištenja u produkciji. + + + + + %0%.]]> + AppSetting 'Umbraco:CMS:WebRouting:UmbracoApplicationUrl' nije postavljen. + + X-Frame-Options koji se koristi za kontrolu da li neko mjesto može biti IFRAMED od strane drugog je pronađen.]]> + + X-Frame-Options koji se koristi za kontrolu da li neko mjesto može biti IFRAMED od strane drugog nije pronađen.]]> + + X-Content-Type-Options koji se koristi za zaštitu od ranjivosti MIME sniffinga je pronađen.]]> + + X-Content-Type-Options koji se koristi za zaštitu od ranjivosti MIME sniffinga nije pronađen.]]> + + Strict-Transport-Security, također poznat kao HSTS-header, je pronađen.]]> + + Strict-Transport-Security nije pronađeno.]]> + + Strict-Transport-Security, također poznat kao HSTS-header, je pronađen. Ovo zaglavlje ne bi trebalo biti prisutno na lokalnom hostu.]]> + + + Strict-Transport-Security nije pronađeno. Ovo zaglavlje ne bi trebalo biti prisutno na lokalnom hostu.]]> + + X-XSS-Protection je pronađeno.]]> + + X-XSS-Protection nije pronađeno.]]> + + + %0%.]]> + Nisu pronađena zaglavlja koja otkrivaju informacije o tehnologiji web stranice. + + U datoteci Web.config, system.net/mailsettings nije moguće pronaći. + U datoteci Web.config, system.net/mailsettings, host + nije konfiguriran. + + SMTP postavke su ispravno konfigurirane i usluga radi + kao što je očekivano. + + SMTP server konfiguriran sa hostom '%0%' i portom '%1%' ne može biti + dohvaćen. Provjerite jesu li SMTP postavke u datoteci Web.config, system.net/mailsettings ispravne. + + + %0%.]]> + + %0%.]]> + +

Rezultati zakazanih Umbraco provjera zdravlja koji se pokreću na %0% na %1% su sljedeći:

%2%]]>
+ Status provjere zdravlja Umbraco: %0% + Provjerite grupu + + Provjera zdravlja procjenjuje različita područja vaše web lokacije u pogledu postavki najboljih praksi, konfiguracija, potencijalnih problema itd. Možete jednostavno riješiti probleme pritiskom na gumb. + Možete dodati svoje zdravstvene preglede, pogledajte dokumentaciju za više informacija o prilagođenim zdravstvenim pregledima.

+ ]]> +
+ + + Onemogući URL praćenje + Omogući URL praćenje + Originalni URL + Preusmjerno na + Preusmjeravanje URL-ova + Sljedeći URL-ovi preusmjeravaju na ovu stavku sadržaja: + Nisu napravljena nikakva preusmjeravanja + Kada se objavljena stranica preimenuje ili premjesti, preusmjeravanje će automatski biti + napravljeno na novu stranicu. + + Preusmjeravanje uklonjeno. + Greška pri uklanjanju preusmjeravanja. + Ovo će ukloniti preusmjeravanje + Jeste li sigurni da želite onemogućiti praćenje URL-ovač? + URL praćenje je sada onemogućeno. + Greška pri onemogućavanju praćenja URL-ova, više informacija možete pronaći u vašem log zapisu. + URL praćenje je sada omogućeno. + Greška pri omogućavanju praćenja URL-ova, više informacija možete pronaći u vašem log zapisu. + + + Nema stavki iz rječnika za odabir + + + %0% preostalo znakova.]]> + %1% previše.]]> + + + Sadržaj u otpadu s ID-om: {0} povezan je s originalnim nadređenim sadržajem s ID-om: {1} + Medij u otpadu s ID-om: {0} povezan je s originalnim nadređenim medijem s ID-om: {1} + Nije moguće automatski vratiti ovu stavku + Ne postoji lokacija na kojoj se ova stavka može automatski vratiti. Možete ručno premjestiti stavku koristeći stablo ispod. + + je restauriran pod + + + Smjer + Roditelj djetetu + Bidirectional + Roditelj + Dijete + Broj + Relacija + Relacije + Kreirano + Komentar + Naziv + Nema relacija za ovu vrstu odnosa + Tip relacije + Relacije + Je zavisan + Da + Ne + + + Početak rada + Preusmjeravanje URL-ova + Sadržaj + Dobrodošli + Examine menadžment + Status stranice + Generator modela + Provjera zdravlja + Profilisanje + Početak rada + Instaliraj Umbraco Forms + + + Vrati se + Aktivan raspored: + Skoči na + grupa + prošao + upozorenje + neuspješno + prijedlog + Provjera prošla + Provjera nije uspjela + Otvorite backoffice pretragu + Otvori/Zatvori pomoć za backoffice + Opcije otvaranja/zatvaranja profila + Postavite kulturu i imena hostova za %0% + Kreirajte novi čvor ispod %0% + Postavite ograničenja pristupa uključena %0% + Dozvole za postavljanje su uključene %0% + Promijenite redoslijed sortiranja za %0% + Kreirajte predložak sadržaja na osnovu %0% + Otvorite kontekstni meni za + Trenutni jezik + Prebaci jezik na + Kreirajte novi folder + Parcijalni pogled + Makro za pracijalni prikaz + Član + Tip podatka + Pretražite kontrolnu ploču za preusmjeravanje + Pretražite odjeljak korisničke grupe + Pretražite odjeljak korisnika + Kreiraj stavku + Kreiraj + Uredi + Naziv + Dodaj novi red + Pogledajte više opcija + Pogledajte više opcija + Potražite čvorove sadržaja, medijske čvorove itd. u backofficeu. + Kada su dostupni rezultati autodovršavanja, pritisnite strelice gore i dolje ili koristite + tipku tab i koristite tipku enter za odabir. + + Putanja: + Pronađeno u + Ima prijevod + Nedostaje prijevod + Stavke iz rječnika + Odaberite jednu od opcija za uređivanje čvora. + Izvršite akciju %0% na čvoru %1%. + Dodajte opis slike + Pretraži stablo sadržaja + Maksimalni iznos + + + Reference + Ovaj tip podataka nema reference. + Ova stavka nema reference. + Koristi se u tipovima dokumenata + Koristi se u tipovima medija + Koristi se u tipovima članova + Koristi + Stavke u upotrebi + Potomci u upotrebi + Ova stavka ili njeni potomci se koriste. Brisanje može dovesti do neispravnih veza na vašoj web stranici. + Ova stavka ili njeni potomci se koriste. Poništavanje objavljivanja može dovesti do neispravnih veza na vašoj web stranici. Molimo poduzmite odgovarajuće radnje. + Ova stavka ili njeni potomci se koriste. Stoga je brisanje onemogućeno. + Sljedeće stavke koje pokušavate %0% koriste drugi sadržaj. + + + Obriši spremljene pretrage + Razine loga + Označi sve + Odznači sve + Spremljene pretrage + Spremi pretragu + Unesite prijateljski naziv za vaš upit za pretragu + Filtriraj pretragu + Ukupno + Vrijeme + Razina + Uređaj + Poruka + Izuzetak + Svojstva + Pretraži pomoću Google-a + Pretraži ovu poruku pomoću Google-a + Pretraži pomoću Bing-a + Pretraži ovu poruku pomoću Bing-a + Pretraži Our Umbraco + Pretraži ovu poruku na Our Umbraco forumu i dokumentaciji + Pretraži Our Umbraco pomoću Google-a + Pretraži Our Umbraco forume pomoću Google-a + Pretraži Umbraco Source + Pretraži Umbraco source code on Github-u + Pretraži Umbraco Issues + Pretraži Umbraco Issues na Github-u + Obriši ovu pretragu + Pronađi logove sa ID-om zatjeva + Pronađi logove sa namespace-om + Pronađi logove sa nazivom uređaja + Otvori + Provjera + Svakih 2 sekunde + Svakih 5 sekundi + Svakih 10 sekundi + Svakih 20 sekundi + Svakih 30 sekundi + Provjera svakih 2s + Provjera svakih 5s + Provjera svakih 10s + Provjera svakih 20s + Provjera svakih 30s + + + Kopiraj %0% + %0% od %1% + Zbirka od %0% + Uklonite sve stavke + Očisti međuspremnik + + + Otvorite radnje svojstva + Zatvorite Property Actions + + + Osvježi status + Predmemorija + + + + Ponovo učitaj + Predmemorija baze podataka + + Obnova može biti skupa. + Koristite ga kada ponovno učitavanje nije dovoljno, a mislite da predmemorija baze podataka nije bila + pravilno generirana; što bi ukazivalo na neko kritično pitanje Umbraco. + ]]> + + Ponovo obnovi + Unutrašnjost + + ne morate koristiti. + ]]> + + Skupiti + Objavljeni status predmemorije + Predmemorije + + + Profiliranje performansi + + + Umbraco trenutno radi u načinu za otklanjanje grešaka. To znači da možete koristiti ugrađeni profiler performansi za procjenu performansi prilikom renderiranja stranica. +

+

+ Ako želite aktivirati profiler za određeno prikazivanje stranice, jednostavno dodajte umbDebug=true na string upita kada tražite stranicu. +

+

+ Ako želite da se profilator aktivira prema zadanim postavkama za sve prikaze stranica, možete koristiti prekidač ispod. + On će postaviti kolačić u vaš pretraživač, koji zatim automatski aktivira profiler. + Drugim riječima, profiler će biti aktivan samo po defaultu u vašen pretraživaču. +

+ ]]> +
+ Zadano aktivirajte profiler + Prijateljski podsjetnik + + + Nikada ne bi trebali dozvoliti da produkcijska lokacija radi u načinu za otklanjanje grešaka. Režim za otklanjanje grešaka se isključuje podešavanjem Umbraco:CMS:Hosting:Debug na false u appsettings.json, appsettings.{Environment}.json ili preko varijable okruženja. +

+ ]]> +
+ + + Umbraco trenutno ne radi u načinu za otklanjanje grešaka, tako da ne možete koristiti ugrađeni profiler. Ovako bi trebalo da bude za proizvodnu lokaciju. +

+

+ Režim za otklanjanje grešaka se uključuje podešavanjem Umbraco:CMS:Hosting:Debug na true u appsettings.json, appsettings.{Environment}.json ili preko varijable okruženja. +

+ ]]> +
+ + + Sati Umbraco trening videa udaljeni su samo jedan klik + + Želite naučiti Umbraco? Provedite nekoliko minuta učeći najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a. I posjetite umbraco.tv za još više Umbraco videa

+ ]]> +
+ + Želite savladati Umbraco? Provedite nekoliko minuta učeći najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a Umbraco Learning Base Youtube kanal. Ovdje možete pronaći gomilu video materijala koji pokriva mnoge aspekte Umbraco-a.

+ ]]> +
+ Za početak + + + Počni ovdje + Ovaj odjeljak sadrži blokove za izgradnju vaše Umbraco stranice. Slijedite dolje + veze da saznate više o radu sa stavkama u odjeljku Postavke + + Saznajte više + + u odjeljku Dokumentacija na Our Umbraco + ]]> + + + Forumu zajednice + ]]> + + + video tutorijale na Umbraco Learning Base + ]]> + + + alatima za povećanje produktivnosti i komercijalna podrška + ]]> + + + obuke i certifikacije + ]]> + + + + Dobrodošli u The Friendly CMS + Hvala vam što ste odabrali Umbraco - mislimo da bi ovo mogao biti početak nečeg divnog. Iako se u početku može činiti neodoljivim, učinili smo puno da učenje bude što lakše i brže što je moguće više. + + + + Umbraco Forms + Kreirajte obrasce pomoću intuitivnog 'drag and drop' sučelja. Od jednostavnih kontakt obrazaca + koji šalje e-mailove do naprednih obrazaca koji se mogu integrirati sa CRM sustavima. Vašim klijentima će se svidjeti! + + + + Odaberite tip elementa + Priložite postavke na tip elementa + Odaberite prikaz + Odaberite stil + Odaberite sličicu + Kreirajte novi tip elementa + Prilagođeni stil + Dodaj stil + Izgled bloka + Modeli podataka + Izgled kataloga + Boja pozadine + Boja ikone + Model sadržaja + Oznaka + Prilagođeni prikaz + Prikaži opis prilagođenog prikaza + Zamjenite način na koji se ovaj blok pojavljuje u korisničkom sučelju backofficea. Odaberite .html datoteku + koja sadrži vaš dizajn. + + Model postavki + Veličina uređivača preklapanja + Dodaj prilagođeni prikaz + Dodaj postavke + + %0%?]]> + + %0%?]]> + Sadržaj ovog bloka bit će i dalje prisutan, uređivanje ovog sadržaja + više neće biti dostupno i bit će prikazan kao nepodržani sadržaj. + + + %0% i sve konfiguracije ovog bloka?]]> + Sadržaj ovih blokova će i dalje biti prisutan, uređivanje ovog sadržaja + više neće biti dostupan i bit će prikazan kao nepodržani sadržaj. + + + Ne može se uređivati jer tip elementa ne postoji. + Sličica + Dodaj sličicu + Kreiraj prazno + Međuspremnik + Postavke + Napredno + Sakrij uređivač sadržaja + Sakrij gumb za uređivanje sadržaja i uređivač sadržaja iz preklapanja Block Editor. + Inline uređivanje + Omogućava inline uređivanje za prvo svojstvo. Dodatna svojstva se mogu uređivati u prekrivaču. + Izmijenili ste ovaj sadržaj. Jeste li sigurni da ih želite odbaciti? + Odbaciti kreiranje? + + Greška! + Tip elementa ovog bloka više ne postoji + Dodaj sadržaj + Dodaj %0% + Svojstvo '%0%' koristi uređivač '%1%' koji nije podržan u blokovima. + Postavite fokus na blok kontejnera + Identifikacija + Validacija + %0% mora biti prisutan barem %2% puta.]]> + %0% mora biti maksimalno prisutan %3% puta.]]> + Broj blokova + Dozvolite samo određene tipove blokova + Dozvoljene vrste blokova + Definirajte tipove blokova koji su dozvoljeni u ovom području i opcionalo koliko svakog tipa treba biti prisutan. + Jeste li sigurni da želite obrisati ovo područje? + Svi blokovi koji su trenutno kreirani unutar ovog područja bit će obrisani. + Opcije rasporeda + Strukturno + Opcije veličine + Definirajte jednu ili više opcija veličine, ovo omogućava promjenu veličine bloka + Definirajte jednu ili više opcija veličine, ovo omogućava promjenu veličine bloka + Definirajte različit broj kolona preko kojih ovaj blok može se protezati. Ovo ne sprječava postavljanje blokova u područja s manjim rasponom kolona. + Dostupni rasponi redova + Definirajte raspon redova rasporeda preko kojih se ovaj blok može protezati. + Dozvolite u korijenu + Učinite ovaj blok dostupnim u korijenu izgleda. + Dozvolite u područjima + Učinite ovaj blok dostupnim prema zadanim postavkama unutar područja drugih blokova (osim ako za ova područja nisu postavljene eksplicitne dozvole). + Prema zadanim postavkama, svi tipovi blokova su dozvoljeni u području. Koristite ovu opciju da dozvolite samo odabrane tipove. + Područja + Mrežne kolone za područja + Definirajte koliko će stupaca biti dostupno za područja. Ako nije definiran, koristit će se broj kolona definiranih za cijeli izgled. + Područja + Da biste omogućili ugniježđenje blokova unutar ovog bloka, definirajte jedno ili više područja. Područja slijede raspored definiran njihovom vlastitom konfiguracijom stupca mreže. 'Raspon kolone' i 'raspon reda' za svako područje može se podesiti korištenjem okvira za rukovanje skalom u donjem desnom uglu odabranog područja. + %0% nije dozvoljeno na ovom mjestu.]]> + Zadani raspored stilova + Nedozvoljeni sadržaj je odbijen + + + + + Povucite za povečanje + Kreiraj oznaku gumba + Nadjačajte tekst oznake za dodavanje novog bloka u ovo područje, primjer: 'Dodaj widget' + Prikaži opcije promjene veličine + Dodaj blok + Dodaj grupu + Odaberi grupu ili blok + Postavite minimalni zahtjev + Postavite maksimalan zahtjev + Blok + Blok + Postavke + Područja + Napredno + Dozvole + Instalirajte uzorak konfiguracije + + Instaliraj + Način sortiranja + Završi način sortiranja + Ovaj alias područja mora biti jedinstven u usporedbi sa drugim područjima ovog bloka. + Konfiguriraj područje + Obriši područje + Dodajte opciju raspona %0% kolona + + + Što su predlošci sadržaja? + Predlošci sadržaja su unaprijed definirani sadržaj koji se može odabrati prilikom kreiranja novog + sadržaj čvora. + + Kako da kreiram predložak sadržaja? + + Postoje dva načina za kreiranje predloška sadržaja:

+
    +
  • Desnom tipkom miša kliknite čvor sadržaja i odaberite "Kreiraj predložak sadržaja" da bi kreirali novi predložak sadržaja.
  • +
  • Kliknite desnom tipkom miša na stablo predložaka sadržaja u odjeljku Postavke i odaberite vrstu dokumenta za koju želite kreirati predložak sadržaja.
  • +
+

Nakon što upišete ime, urednici mogu početi koristiti predložak sadržaja kao osnovu za svoju novu stranicu.

+ ]]> +
+ Kako upravljati predlošcima sadržaja? + Možete uređivati i brisati predloške sadržaja iz stabla "Predlošci sadržaja" u + sekciji postavke. Proširite vrstu dokumenta na kojoj se temelji predložak sadržaja i kliknite na nju da biste uredili ili obrisali. + + + + Kraj + Završi način pregleda + Pregledajte web stranicu + Otvorite web stranicu u načinu pregleda + Pregledajte web stranicu? + Završili ste način pregleda, želite li ga ponovo omogućiti da vidite + najnovije spremljene verzije vaše web stranice? + + Pregledajte najnoviju verziju + Pogledajte objavljenu verziju + Pogledajte objavljenu verziju? + Nalazite se u načinu pregleda, želite li izaći da biste vidjeli + objavljenu verziju Vaše web stranice? + + Pogledajte objavljenu verziju + Ostanite u načinu pregleda + + + Kreiranje mape + Pisanje datoteka za pakete + Pisanje datoteka + Kreiranje medijskog foldera + + + stavka vraćena + stavke vraćene + + From dbd009ffcd64a701aaeaef43fc88e580fa8fc993 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Fri, 16 Jun 2023 11:21:11 +0200 Subject: [PATCH 13/27] Update label in Danish translation (cherry picked from commit 575f00d6f00895a011e97a823c983e5073265116) --- src/Umbraco.Core/EmbeddedResources/Lang/da.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index dd68711783..b7f970ea9c 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -54,8 +54,8 @@ Sæt rettigheder Lås op Opret indholdsskabelon - Gensend Invitation - Standard værdi + Gensend invitation + Standardværdi Indhold From f93f3d88dae07bd5b7b565a1e7f8ff87ff7b6b6d Mon Sep 17 00:00:00 2001 From: Paul Seal Date: Fri, 16 Jun 2023 12:11:23 +0100 Subject: [PATCH 14/27] Fix/delete language error message 14333 (#14396) * Update the tour text to the correct text and to save confusion * Added extra information to the delete language warning to inform the user that it will also delete all content related to the language * Updated language files with same message re deletion --------- Co-authored-by: Paul Seal Co-authored-by: Emma Garland (cherry picked from commit 542d0f7f741718f7c7b8f46cf76e779d6502ce40) --- src/Umbraco.Core/EmbeddedResources/Lang/en.xml | 2 +- src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml | 2 +- src/Umbraco.Core/EmbeddedResources/Lang/hr.xml | 2 +- .../src/views/languages/overlays/delete.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 1d3f563c9c..2e05c3c953 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -488,7 +488,7 @@ Insert link Click to add a Macro Insert table - This will delete the language + This will delete the language and all content related to the language Changing the culture for a language may be an expensive operation and will result in the content cache and indexes being rebuilt diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index d38a8f0c06..e2cb267d88 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -503,7 +503,7 @@ Insert link Click to add a Macro Insert table - This will delete the language + This will delete the language and all content related to the language Changing the culture for a language may be an expensive operation and will result in the content cache and indexes being rebuilt diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml b/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml index 492eb3155a..c3328dfead 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/hr.xml @@ -479,7 +479,7 @@ Umetni link Klikni za dodavanje makro Umetni tablicu - Ovo će obrisati jezik + Ovo će izbrisati jezik i sav sadržaj povezan s jezikom Promjena kulture jezika može biti skupa operacija i rezultirat će promjenama u predmemoriji sadržaja i indeksima koji se rekonstruiraju Zadnje uređivano diff --git a/src/Umbraco.Web.UI.Client/src/views/languages/overlays/delete.html b/src/Umbraco.Web.UI.Client/src/views/languages/overlays/delete.html index 90e1d755b6..38ee080d4f 100644 --- a/src/Umbraco.Web.UI.Client/src/views/languages/overlays/delete.html +++ b/src/Umbraco.Web.UI.Client/src/views/languages/overlays/delete.html @@ -1,7 +1,7 @@
- This will delete the language {{model.language.name}} [{{model.language.culture}}]. + This will delete the language and all content related to the language {{model.language.name}} [{{model.language.culture}}].
Are you sure you want to delete? From 2f35967bb28ca118a443580209e74fac42a682a3 Mon Sep 17 00:00:00 2001 From: Marco Teodoro Date: Fri, 16 Jun 2023 13:40:19 +0100 Subject: [PATCH 15/27] fix: #12253 Anchor picker does not appear (#13492) * fix: #12253 Anchor picker does not appear * Update ContentServiceExtensions.cs fix: #12253 #13492 ; implement PR suggestions, test the new changes to confirm that they fix the issue with the anchorlink implementation on RTE from blocklist, blockgrid and normal RTE properties Co-Authored-By: Laura Neto <12862535+lauraneto@users.noreply.github.com> * Removed unnecessary using and code * Small adjustments --------- Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> (cherry picked from commit 1ba834a9ca4a44a38d24843c72f8d87f481f6f34) --- .../Services/ContentServiceExtensions.cs | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentServiceExtensions.cs b/src/Umbraco.Core/Services/ContentServiceExtensions.cs index b042612b1a..aaba622412 100644 --- a/src/Umbraco.Core/Services/ContentServiceExtensions.cs +++ b/src/Umbraco.Core/Services/ContentServiceExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Umbraco. +// Copyright (c) Umbraco. // See LICENSE for more details. using System.Text.RegularExpressions; @@ -16,7 +16,8 @@ public static class ContentServiceExtensions { #region RTE Anchor values - private static readonly Regex AnchorRegex = new("", RegexOptions.Compiled); + private static readonly Regex AnchorRegex = new(@"", RegexOptions.Compiled); + private static readonly string[] _propertyTypesWithRte = new[] { Constants.PropertyEditors.Aliases.TinyMce, Constants.PropertyEditors.Aliases.BlockList, Constants.PropertyEditors.Aliases.BlockGrid }; public static IEnumerable? GetByIds(this IContentService contentService, IEnumerable ids) { @@ -67,21 +68,22 @@ public static class ContentServiceExtensions public static IEnumerable GetAnchorValuesFromRTEs(this IContentService contentService, int id, string? culture = "*") { var result = new List(); + + culture = culture is not "*" ? culture : null; + IContent? content = contentService.GetById(id); - if (content is not null) + if (content is null) { - foreach (IProperty contentProperty in content.Properties) + return result; + } + + foreach (IProperty contentProperty in content.Properties.Where(s => _propertyTypesWithRte.Contains(s.PropertyType.PropertyEditorAlias))) + { + var value = contentProperty.GetValue(culture)?.ToString(); + if (!string.IsNullOrEmpty(value)) { - if (contentProperty.PropertyType.PropertyEditorAlias.InvariantEquals(Constants.PropertyEditors.Aliases - .TinyMce)) - { - var value = contentProperty.GetValue(culture)?.ToString(); - if (!string.IsNullOrEmpty(value)) - { - result.AddRange(contentService.GetAnchorValuesFromRTEContent(value)); - } - } + result.AddRange(contentService.GetAnchorValuesFromRTEContent(value)); } } @@ -96,7 +98,7 @@ public static class ContentServiceExtensions MatchCollection matches = AnchorRegex.Matches(rteContent); foreach (Match match in matches) { - result.Add(match.Value.Split(Constants.CharArrays.DoubleQuote)[1]); + result.Add(match.Groups[1].Value); } return result; From ebe375d23b44070b9caf2ee1f855ae97c0a29ad7 Mon Sep 17 00:00:00 2001 From: Jason Elkin Date: Fri, 16 Jun 2023 14:45:49 +0100 Subject: [PATCH 16/27] Add ContentDeletingNotification to EmptyRecycleBin (#14397) * Add ContentDeletingNotification to EmptyRecycleBin * Fix formatting. (cherry picked from commit 118f91415887c0c33f757ebca282c51d561f200f) --- src/Umbraco.Core/Services/ContentService.cs | 47 +++++++++++---------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index f889ce424d..fc02ad3ce1 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -36,20 +36,20 @@ public class ContentService : RepositoryService, IContentService #region Constructors - public ContentService( - ICoreScopeProvider provider, - ILoggerFactory loggerFactory, - IEventMessagesFactory eventMessagesFactory, - IDocumentRepository documentRepository, - IEntityRepository entityRepository, - IAuditRepository auditRepository, - IContentTypeRepository contentTypeRepository, - IDocumentBlueprintRepository documentBlueprintRepository, - ILanguageRepository languageRepository, - Lazy propertyValidationService, - IShortStringHelper shortStringHelper, - ICultureImpactFactory cultureImpactFactory) - : base(provider, loggerFactory, eventMessagesFactory) + public ContentService( + ICoreScopeProvider provider, + ILoggerFactory loggerFactory, + IEventMessagesFactory eventMessagesFactory, + IDocumentRepository documentRepository, + IEntityRepository entityRepository, + IAuditRepository auditRepository, + IContentTypeRepository contentTypeRepository, + IDocumentBlueprintRepository documentBlueprintRepository, + ILanguageRepository languageRepository, + Lazy propertyValidationService, + IShortStringHelper shortStringHelper, + ICultureImpactFactory cultureImpactFactory) + : base(provider, loggerFactory, eventMessagesFactory) { _documentRepository = documentRepository; _entityRepository = entityRepository; @@ -59,7 +59,7 @@ public class ContentService : RepositoryService, IContentService _languageRepository = languageRepository; _propertyValidationService = propertyValidationService; _shortStringHelper = shortStringHelper; - _cultureImpactFactory = cultureImpactFactory; + _cultureImpactFactory = cultureImpactFactory; _logger = loggerFactory.CreateLogger(); } @@ -1158,7 +1158,7 @@ public class ContentService : RepositoryService, IContentService // if culture is '*', then publish them all (including variants) // this will create the correct culture impact even if culture is * or null - var impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); + var impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); // publish the culture(s) // we don't care about the response here, this response will be rechecked below but we need to set the culture info values now. @@ -1845,7 +1845,7 @@ public class ContentService : RepositoryService, IContentService // publish the culture values and validate the property values, if validation fails, log the invalid properties so the develeper has an idea of what has failed IProperty[]? invalidProperties = null; - var impact = _cultureImpactFactory.ImpactExplicit(culture, IsDefaultCulture(allLangs.Value, culture)); + var impact = _cultureImpactFactory.ImpactExplicit(culture, IsDefaultCulture(allLangs.Value, culture)); var tryPublish = d.PublishCulture(impact) && _propertyValidationService.Value.IsPropertyDataValid(d, out invalidProperties, impact); if (invalidProperties != null && invalidProperties.Length > 0) @@ -1929,14 +1929,14 @@ public class ContentService : RepositoryService, IContentService { return culturesToPublish.All(culture => { - var impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); + var impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); return content.PublishCulture(impact) && _propertyValidationService.Value.IsPropertyDataValid(content, out _, impact); }); } - return content.PublishCulture(_cultureImpactFactory.ImpactInvariant()) - && _propertyValidationService.Value.IsPropertyDataValid(content, out _, _cultureImpactFactory.ImpactInvariant()); + return content.PublishCulture(_cultureImpactFactory.ImpactInvariant()) + && _propertyValidationService.Value.IsPropertyDataValid(content, out _, _cultureImpactFactory.ImpactInvariant()); } // utility 'ShouldPublish' func used by SaveAndPublishBranch @@ -2434,7 +2434,7 @@ public class ContentService : RepositoryService, IContentService /// Optional Id of the User moving the Content public void Move(IContent content, int parentId, int userId = Constants.Security.SuperUserId) { - if(content.ParentId == parentId) + if (content.ParentId == parentId) { return; } @@ -2585,7 +2585,8 @@ public class ContentService : RepositoryService, IContentService IContent[] contents = _documentRepository.Get(query).ToArray(); var emptyingRecycleBinNotification = new ContentEmptyingRecycleBinNotification(contents, eventMessages); - if (scope.Notifications.PublishCancelable(emptyingRecycleBinNotification)) + var deletingContentNotification = new ContentDeletingNotification(contents, eventMessages); + if (scope.Notifications.PublishCancelable(emptyingRecycleBinNotification) || scope.Notifications.PublishCancelable(deletingContentNotification)) { scope.Complete(); return OperationResult.Cancel(eventMessages); @@ -2950,7 +2951,7 @@ public class ContentService : RepositoryService, IContentService { scope.Notifications.Publish(new ContentPublishedNotification(published, eventMessages)); } - + return OperationResult.Succeed(eventMessages); } From 76ad99beb015d390ad6fd8f91bf464d9a01c321d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mads=20M=C3=B8rch=20Schou?= Date: Fri, 16 Jun 2023 19:22:39 +0200 Subject: [PATCH 17/27] Makes sure the nucache is not truncated when its null (#14395) * Makes sure the nucache is not truncated when its null * Removed parentheses (cherry picked from commit 0a4a938b887bac7f2c4a74715fda2c7780b03c03) --- .../Persistence/NuCacheContentRepository.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.PublishedCache.NuCache/Persistence/NuCacheContentRepository.cs b/src/Umbraco.PublishedCache.NuCache/Persistence/NuCacheContentRepository.cs index b7fac1e7bc..75208b2b16 100644 --- a/src/Umbraco.PublishedCache.NuCache/Persistence/NuCacheContentRepository.cs +++ b/src/Umbraco.PublishedCache.NuCache/Persistence/NuCacheContentRepository.cs @@ -109,9 +109,9 @@ public class NuCacheContentRepository : RepositoryBase, INuCacheContentRepositor | ContentCacheDataSerializerEntityType.Member); // If contentTypeIds, mediaTypeIds and memberTypeIds are null, truncate table as all records will be deleted (as these 3 are the only types in the table). - if ((contentTypeIds == null || !contentTypeIds.Any()) - && (mediaTypeIds == null || !mediaTypeIds.Any()) - && (memberTypeIds == null || !memberTypeIds.Any())) + if (contentTypeIds != null && !contentTypeIds.Any() + && mediaTypeIds != null && !mediaTypeIds.Any() + && memberTypeIds != null && !memberTypeIds.Any()) { if (Database.DatabaseType == DatabaseType.SqlServer2012) { From 62fd860a9ea56ce12e97a2e8f1ea25cc1401d647 Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Mon, 19 Jun 2023 13:48:03 +0200 Subject: [PATCH 18/27] Show SVG icons for toolbar in configuration of richtext editor (#14404) * Load default icons to show them next to checkboxes in configuration of richtext editor * More mapping of icons * Fix vertical align items centered not reflected * Wrap mapping in function * Map a few more icons * Cleanup and formatting * Cleanup * Cleanup * Add period in description (cherry picked from commit 583965cf9d8880ae0896eb728506a9be569a2f52) --- .../Models/RichTextEditorSettings.cs | 8 +- src/Umbraco.Web.UI.Client/src/less/main.less | 11 +- .../rte/rte.prevalues.controller.js | 124 +++++++++++++++--- .../propertyeditors/rte/rte.prevalues.html | 7 +- 4 files changed, 120 insertions(+), 30 deletions(-) diff --git a/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs b/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs index 55fa7b2c5f..5631ab66d7 100644 --- a/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs @@ -116,18 +116,18 @@ public class RichTextEditorSettings new Dictionary { ["entity_encoding"] = "raw" }; /// - /// HTML RichText Editor TinyMCE Commands + /// HTML RichText Editor TinyMCE Commands. /// /// WB-TODO Custom Array of objects public RichTextEditorCommand[] Commands { get; set; } = Default_commands; /// - /// HTML RichText Editor TinyMCE Plugins + /// HTML RichText Editor TinyMCE Plugins. /// public string[] Plugins { get; set; } = Default_plugins; /// - /// HTML RichText Editor TinyMCE Custom Config + /// HTML RichText Editor TinyMCE Custom Config. /// /// WB-TODO Custom Dictionary public IDictionary CustomConfig { get; set; } = Default_custom_config; @@ -138,7 +138,7 @@ public class RichTextEditorSettings public string ValidElements { get; set; } = StaticValidElements; /// - /// Invalid HTML elements for RichText Editor + /// Invalid HTML elements for RichText Editor. /// [DefaultValue(StaticInvalidElements)] public string InvalidElements { get; set; } = StaticInvalidElements; diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index 2fce7dfe65..cf284188f9 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -354,20 +354,25 @@ label:not([for]) { margin: 0 !important; } +.controls > .vertical-align-items, .controls-row > .vertical-align-items { display: flex; align-items: center; } +.controls > .vertical-align-items > input.umb-property-editor-tiny, +.controls > .vertical-align-items > input.umb-property-editor-small, .controls-row > .vertical-align-items > input.umb-property-editor-tiny, .controls-row > .vertical-align-items > input.umb-property-editor-small { - margin-left: 5px; - margin-right: 5px; + margin-left: 5px; + margin-right: 5px; } +.controls > .vertical-align-items > input.umb-property-editor-tiny:first-child +.controls > .vertical-align-items > input.umb-property-editor-small:first-child, .controls-row > .vertical-align-items > input.umb-property-editor-tiny:first-child .controls-row > .vertical-align-items > input.umb-property-editor-small:first-child { - margin-left: 0; + margin-left: 0; } .thumbnails .selected { 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 47d1f401c7..2a17974dcc 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 @@ -1,12 +1,12 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", - function ($scope, $timeout, $log, tinyMceService, stylesheetResource, assetsService) { + function ($scope, $sce, tinyMceService, stylesheetResource, assetsService) { var cfg = tinyMceService.defaultPrevalues(); - if($scope.model.value){ - if(Utilities.isString($scope.model.value)){ + if($scope.model.value) { + if (Utilities.isString($scope.model.value)){ $scope.model.value = cfg; } - }else{ + }else { $scope.model.value = cfg; } @@ -23,14 +23,14 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", $scope.model.value.mode = "classic"; } - tinyMceService.configuration().then(function(config){ - $scope.tinyMceConfig = config; - + tinyMceService.configuration().then(config => { + $scope.tinyMceConfig = config; + // 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); - - var objCmd = Utilities.extend(obj, { + $scope.tinyMceConfig.commands = _.map($scope.tinyMceConfig.commands, obj => { + const icon = getIcon(obj.alias); + + const objCmd = Utilities.extend(obj, { fontIcon: icon.name, isCustom: icon.isCustom, selected: $scope.model.value.toolbar.indexOf(obj.alias) >= 0, @@ -39,9 +39,30 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", return objCmd; }); + + assetsService.loadJs("lib/tinymce/icons/default/icons.js", $scope).then(() => { + const icons = tinymce.IconManager.get('default').icons; + const parser = new DOMParser(); + + Utilities.forEach($scope.tinyMceConfig.commands, cmd => { + let icon = getTinyIcon(cmd.alias); + + if (!cmd.isCustom && icons.hasOwnProperty(icon)) { + const svg = icons[icon]; + const frag = parser.parseFromString(svg, 'text/html').body.childNodes[0]; + const width = frag.getAttribute("width"); + const height = frag.getAttribute("height"); + + frag.setAttribute("viewBox", `0 0 ${width} ${height}`); + cmd.svgIcon = $sce.trustAsHtml(frag.outerHTML); + cmd.icon = null; + } + }); + }); + }); - stylesheetResource.getAll().then(function(stylesheets){ + stylesheetResource.getAll().then(stylesheets => { $scope.stylesheets = stylesheets; // if the CSS directory changes, previously assigned stylesheets are retained, but will not be visible @@ -59,14 +80,14 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", $scope.selectCommand = function(command){ var index = $scope.model.value.toolbar.indexOf(command.alias); - if(command.selected && index === -1){ + if (command.selected && index === -1){ $scope.model.value.toolbar.push(command.alias); - }else if(index >= 0){ + }else if (index >= 0){ $scope.model.value.toolbar.splice(index, 1); } }; - $scope.selectStylesheet = function (css) { + $scope.selectStylesheet = css => { // find out if the stylesheet is already selected; first look for the full stylesheet path (current format) var index = $scope.model.value.stylesheets.indexOf(css.path); @@ -75,15 +96,80 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", index = $scope.model.value.stylesheets.indexOf(css.name); } - if(index === -1){ + if (index === -1){ $scope.model.value.stylesheets.push(css.path); - }else{ + } else { $scope.model.value.stylesheets.splice(index, 1); } }; - // map properties for specific commands - function getFontIcon(alias) { + // Map command alias to icon name. + function getTinyIcon(alias) { + let icon = alias; + + switch (alias) { + case "ace": + case "code": + icon = "sourcecode"; + break; + case "anchor": + icon = "bookmark"; + break; + case "alignleft": + icon = "align-left"; + break; + case "aligncenter": + icon = "align-center"; + break; + case "alignright": + icon = "align-right"; + break; + case "alignjustify": + icon = "align-justify"; + break; + case "charmap": + icon = "insert-character"; + break; + case "hr": + icon = "horizontal-rule"; + break; + case "bullist": + icon = "unordered-list"; + break; + case "numlist": + icon = "ordered-list"; + break; + case "strikethrough": + icon = "strike-through"; + break; + case "removeformat": + icon = "remove-formatting"; + break; + case "blockquote": + icon = "quote"; + break; + case "forecolor": + icon = "text-color"; + break; + case "hilitecolor": + icon = "highlight-bg-color"; + break; + case "wordcount": + icon = "character-count"; + break; + case "emoticons": + icon = "emoji"; + break; + case "codesample": + icon = "code-sample"; + break; + } + + return icon; + } + + // Map properties for specific commands + function getIcon(alias) { var icon = { name: alias, isCustom: false }; switch (alias) { 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 96de0cd040..cc717a0486 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 @@ -5,22 +5,21 @@ + + + {{cmd.name}}
- -
From 7fd7a8715d12159086537dfcd2f06d45acdb9a41 Mon Sep 17 00:00:00 2001 From: christophnz Date: Sat, 17 Jun 2023 21:48:38 +1200 Subject: [PATCH 19/27] Fixed typo "optinal" to "optional" for translation dictionary import dialog and 2 other occurrences (cherry picked from commit 77a2e4b55728ab39400d4e8498b1bf11f2846a92) --- src/Umbraco.Core/EmbeddedResources/Lang/de.xml | 2 +- src/Umbraco.Web.UI.Client/lib/markdown/markdown.editor.js | 4 ++-- src/Umbraco.Web.UI.Client/src/views/dictionary/import.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/de.xml b/src/Umbraco.Core/EmbeddedResources/Lang/de.xml index 4bcf80994e..cdc7b42fe4 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/de.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/de.xml @@ -2059,7 +2059,7 @@ Benutzergruppe wurde eingeladen Eine Einladung mit Anweisungen zur Anmeldung im Umbraco-Back-Office wurde dem neuen Benutzer zugeschickt. - Hallo und Willkommen bei Umbraco! In nur einer Minute sind Sie bereit loszulegen, Sie müssen nur ein Kennwort festlegen und optinal Ihrem Avatar ein Bild hinzufügen. + Hallo und Willkommen bei Umbraco! In nur einer Minute sind Sie bereit loszulegen, Sie müssen nur ein Kennwort festlegen und optional Ihrem Avatar ein Bild hinzufügen. Willkommen bei Umbraco! Bedauerlicherweise ist Ihre Einladung verfallen. Bitte kontaktieren Sie Ihren Administrator und bitten Sie ihn, diese erneut zu schicken. Laden Sie ein Foto von sich hoch, um es anderen Benutzern zu erleichtern, sie zu erkennen. Klicken Sie auf den Kreis oben, um Ihr Foto hochzuladen. Autor diff --git a/src/Umbraco.Web.UI.Client/lib/markdown/markdown.editor.js b/src/Umbraco.Web.UI.Client/lib/markdown/markdown.editor.js index 60118dbdb3..5822e6df89 100644 --- a/src/Umbraco.Web.UI.Client/lib/markdown/markdown.editor.js +++ b/src/Umbraco.Web.UI.Client/lib/markdown/markdown.editor.js @@ -1,4 +1,4 @@ -// needs Markdown.Converter.js at the moment +// needs Markdown.Converter.js at the moment (function () { @@ -1590,7 +1590,7 @@ }; // takes the line as entered into the add link/as image dialog and makes - // sure the URL and the optinal title are "nice". + // sure the URL and the optional title are "nice". function properlyEncoded(linkdef) { return linkdef.replace(/^\s*(.*?)(?:\s+"(.+)")?\s*$/, function (wholematch, link, title) { link = link.replace(/\?.*$/, function (querypart) { diff --git a/src/Umbraco.Web.UI.Client/src/views/dictionary/import.html b/src/Umbraco.Web.UI.Client/src/views/dictionary/import.html index 64f810f4dc..8f0a1ec15d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/dictionary/import.html +++ b/src/Umbraco.Web.UI.Client/src/views/dictionary/import.html @@ -43,7 +43,7 @@ Chose where to import dictionary items. - (optinal) + (optional)

Date: Tue, 27 Jun 2023 16:50:11 +0200 Subject: [PATCH 20/27] Added missing Danish translation for `general_change` (#14461) * Added missing Danish translation for `general_change` * Update en_us.xml (cherry picked from commit a090997aa19a78821836d8a1f5e2237befed7fd5) --- src/Umbraco.Core/EmbeddedResources/Lang/da.xml | 1 + src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index b7f970ea9c..099af43d2f 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -717,6 +717,7 @@ af Fortryd Celle margen + Skift Vælg Ryd Luk diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index e2cb267d88..b24583cd07 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -757,6 +757,7 @@ by Cancel Cell margin + Change Choose Clear Close From 30ec9d9bc7b1dfbdec09d2e016797e2573dde64a Mon Sep 17 00:00:00 2001 From: Nikolaj Brask-Nielsen Date: Tue, 27 Jun 2023 18:18:07 +0200 Subject: [PATCH 21/27] fix: Allows copying from unsaved content (#14464) #14459 (cherry picked from commit 1d14158d82ce5d9e3ed9766e8e11faddb455be19) --- .../src/common/services/clipboard.service.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 abf173b129..238d9a8ee6 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 @@ -344,10 +344,14 @@ function clipboardService($window, notificationsService, eventsService, localSto // Clean up each entry var copiedDatas = datas.map(data => prepareEntryForStorage(type, data, firstLevelClearupMethod)); - // remove previous copies of this entry: + // remove previous copies of this entry (Make sure to not remove copies from unsaved content): storage.entries = storage.entries.filter( (entry) => { - return entry.unique !== uniqueKey; + if (entry.unique === 0) { + return displayLabel !== entry.label; + } else { + return entry.unique !== uniqueKey; + } } ); From 3f196a9de44bf11b5dd132d90fa239b435a29962 Mon Sep 17 00:00:00 2001 From: Maarten Date: Tue, 4 Jul 2023 09:37:13 +0200 Subject: [PATCH 22/27] Fix broken CookieAuthenticationRedirect caused by PR #14036 for non-api requests (#14399) * Fix broken CookieAuthenticationRedirect caused by PR #14036 when not in an API controller * Added Integration Tests for the MemberAuthorizationFilter * Fix merge conflict --------- Co-authored-by: Elitsa (cherry picked from commit 1d239a30ca0bf741316fe73f2b307876eaad0264) --- .../Filters/UmbracoMemberAuthorizeFilter.cs | 6 +- .../Security/ConfigureMemberCookieOptions.cs | 13 +- .../Security/MemberAuthorizeTests.cs | 126 ++++++++++++++++++ 3 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 tests/Umbraco.Tests.Integration/Umbraco.Web.Website/Security/MemberAuthorizeTests.cs diff --git a/src/Umbraco.Web.Common/Filters/UmbracoMemberAuthorizeFilter.cs b/src/Umbraco.Web.Common/Filters/UmbracoMemberAuthorizeFilter.cs index 95c4ae5cec..2f56cdb51f 100644 --- a/src/Umbraco.Web.Common/Filters/UmbracoMemberAuthorizeFilter.cs +++ b/src/Umbraco.Web.Common/Filters/UmbracoMemberAuthorizeFilter.cs @@ -60,14 +60,14 @@ public class UmbracoMemberAuthorizeFilter : IAsyncAuthorizationFilter { context.HttpContext.SetReasonPhrase( "Resource restricted: the member is not of a permitted type or group."); + context.HttpContext.Response.StatusCode = 403; context.Result = new ForbidResult(); } } else { - context.HttpContext.SetReasonPhrase( - "Resource restricted: the member is not logged in."); - context.Result = new UnauthorizedResult(); + context.HttpContext.Response.StatusCode = 401; + context.Result = new ForbidResult(); } } diff --git a/src/Umbraco.Web.Common/Security/ConfigureMemberCookieOptions.cs b/src/Umbraco.Web.Common/Security/ConfigureMemberCookieOptions.cs index 66714be9e6..128737f76d 100644 --- a/src/Umbraco.Web.Common/Security/ConfigureMemberCookieOptions.cs +++ b/src/Umbraco.Web.Common/Security/ConfigureMemberCookieOptions.cs @@ -1,10 +1,12 @@ using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Routing; using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Web.Common.Controllers; using Umbraco.Extensions; namespace Umbraco.Cms.Web.Common.Security; @@ -58,7 +60,16 @@ public sealed class ConfigureMemberCookieOptions : IConfigureNamedOptions { - ctx.Response.StatusCode = StatusCodes.Status403Forbidden; + // When the controller is an UmbracoAPIController, we want to return a StatusCode instead of a redirect. + // All other cases should use the default Redirect of the CookieAuthenticationEvent. + var controllerDescriptor = ctx.HttpContext.GetEndpoint()?.Metadata + .OfType() + .FirstOrDefault(); + + if (!controllerDescriptor?.ControllerTypeInfo.IsSubclassOf(typeof(UmbracoApiController)) ?? false) + { + new CookieAuthenticationEvents().OnRedirectToAccessDenied(ctx); + } return Task.CompletedTask; }, diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Web.Website/Security/MemberAuthorizeTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Web.Website/Security/MemberAuthorizeTests.cs new file mode 100644 index 0000000000..0fc1dfa85d --- /dev/null +++ b/tests/Umbraco.Tests.Integration/Umbraco.Web.Website/Security/MemberAuthorizeTests.cs @@ -0,0 +1,126 @@ +using System.Net; +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Moq; +using NUnit.Framework; +using Umbraco.Cms.Core.Cache; +using Umbraco.Cms.Core.Logging; +using Umbraco.Cms.Core.Routing; +using Umbraco.Cms.Core.Security; +using Umbraco.Cms.Core.Services; +using Umbraco.Cms.Core.Web; +using Umbraco.Cms.Infrastructure.Persistence; +using Umbraco.Cms.Tests.Integration.TestServerTest; +using Umbraco.Cms.Web.Common.Controllers; +using Umbraco.Cms.Web.Common.Filters; +using Umbraco.Cms.Web.Common.Security; +using Umbraco.Cms.Web.Website.Controllers; + +namespace Umbraco.Cms.Tests.Integration.Umbraco.Web.Website.Security +{ + public class MemberAuthorizeTests : UmbracoTestServerTestBase + { + private Mock _memberManagerMock = new(); + + protected override void ConfigureTestServices(IServiceCollection services) + { + _memberManagerMock = new Mock(); + services.Remove(new ServiceDescriptor(typeof(IMemberManager), typeof(MemberManager), ServiceLifetime.Scoped)); + services.Remove(new ServiceDescriptor(typeof(MemberManager), ServiceLifetime.Scoped)); + services.AddScoped(_ => _memberManagerMock.Object); + } + + [Test] + public async Task Secure_SurfaceController_Should_Return_Redirect_WhenNotLoggedIn() + { + _memberManagerMock.Setup(x => x.IsLoggedIn()).Returns(false); + + var url = PrepareSurfaceControllerUrl(x => x.Secure()); + + var response = await Client.GetAsync(url); + + var cookieAuthenticationOptions = Services.GetService>(); + Assert.AreEqual(HttpStatusCode.Redirect, response.StatusCode); + Assert.AreEqual(cookieAuthenticationOptions.Value.AccessDeniedPath.ToString(), response.Headers.Location?.AbsolutePath); + } + + [Test] + public async Task Secure_SurfaceController_Should_Return_Redirect_WhenNotAuthorized() + { + _memberManagerMock.Setup(x => x.IsLoggedIn()).Returns(true); + _memberManagerMock.Setup(x => x.IsMemberAuthorizedAsync( + It.IsAny>(), + It.IsAny>(), + It.IsAny>())) + .ReturnsAsync(false); + + var url = PrepareSurfaceControllerUrl(x => x.Secure()); + + var response = await Client.GetAsync(url); + + var cookieAuthenticationOptions = Services.GetService>(); + Assert.AreEqual(HttpStatusCode.Redirect, response.StatusCode); + Assert.AreEqual(cookieAuthenticationOptions.Value.AccessDeniedPath.ToString(), response.Headers.Location?.AbsolutePath); + } + + + [Test] + public async Task Secure_ApiController_Should_Return_Unauthorized_WhenNotLoggedIn() + { + _memberManagerMock.Setup(x => x.IsLoggedIn()).Returns(false); + var url = PrepareApiControllerUrl(x => x.Secure()); + + var response = await Client.GetAsync(url); + + Assert.AreEqual(HttpStatusCode.Unauthorized, response.StatusCode); + } + + [Test] + public async Task Secure_ApiController_Should_Return_Forbidden_WhenNotAuthorized() + { + _memberManagerMock.Setup(x => x.IsLoggedIn()).Returns(true); + _memberManagerMock.Setup(x => x.IsMemberAuthorizedAsync( + It.IsAny>(), + It.IsAny>(), + It.IsAny>())) + .ReturnsAsync(false); + + var url = PrepareApiControllerUrl(x => x.Secure()); + + var response = await Client.GetAsync(url); + + Assert.AreEqual(HttpStatusCode.Forbidden, response.StatusCode); + } + } + + public class TestSurfaceController : SurfaceController + { + public TestSurfaceController( + IUmbracoContextAccessor umbracoContextAccessor, + IUmbracoDatabaseFactory databaseFactory, + ServiceContext services, + AppCaches appCaches, + IProfilingLogger profilingLogger, + IPublishedUrlProvider publishedUrlProvider) + : base( + umbracoContextAccessor, + databaseFactory, + services, + appCaches, + profilingLogger, + publishedUrlProvider) + { + } + + [UmbracoMemberAuthorize] + public IActionResult Secure() => NoContent(); + } + + public class TestApiController : UmbracoApiController + { + [UmbracoMemberAuthorize] + public IActionResult Secure() => NoContent(); + } +} From d86e4b2d38aba8f909288b9b4ab7dd0cdc35c7d4 Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Wed, 5 Jul 2023 10:46:14 +0200 Subject: [PATCH 23/27] Bumb version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 0c594e5b7e..964482479f 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "10.6.0-rc", + "version": "10.6.0", "assemblyVersion": { "precision": "build" }, From 0ad0f86e6e232a6b047035fa665b9f114c679c6d Mon Sep 17 00:00:00 2001 From: Bjarke Berg Date: Wed, 5 Jul 2023 13:13:52 +0200 Subject: [PATCH 24/27] Update to dotnet 8 preview 5 (#14492) * Update to .net 8 preview 1 * Update npoco to 5.7.0 * Update pipeline to use .net 8 * Revert "Update npoco to 5.7.0" This reverts commit f7795afa77a41ef2719f639405f73d9c21e4b12e. * Fix tests and updated OpenApi.json * use dotnet 8 in linux container * Updated templates and docker image to dotnet 8 * Bugfix * R Updated docker images to 8.0 preview 1 * linux docker images updated * Force use c# 11, in hope of the acceptance tests will pass * Do not use C# 8 :) * Update to preview 2 * CompatibilitySuppressions * updated templates * Disable package validation * Update to .net8 preview 4 * change EnableStrictModeForCompatibleFrameworksInPackage to false * Package validation * Added CompatibilitySuppressions.xml * Fix up IP networks * Updated to preview 5 * Update docker images * Post merge fixes * Try to update dotnet version of codeql * Delete empty suppression files * Remove dependency * Cleanup --------- Co-authored-by: Elitsa --- .github/workflows/codeql-analysis.yml | 2 +- Directory.Build.props | 10 +++++----- build/azure-pipelines.yml | 2 +- .../Umbraco.Cms.Api.Common.csproj | 1 - ...co.Cms.Persistence.EFCore.SqlServer.csproj | 2 +- ...braco.Cms.Persistence.EFCore.Sqlite.csproj | 2 +- .../Umbraco.Cms.Persistence.EFCore.csproj | 5 +++-- .../Umbraco.Cms.Persistence.Sqlite.csproj | 2 +- .../Umbraco.Cms.StaticAssets.csproj | 8 ++------ src/Umbraco.Core/Umbraco.Core.csproj | 20 +++++++++---------- .../Umbraco.Infrastructure.csproj | 15 +++++++------- .../Umbraco.Web.BackOffice.csproj | 6 +----- .../CompilationOptionsProvider.cs | 13 +----------- .../Mvc/IpAddressUtilities.cs | 16 ++++++++++++++- .../Umbraco.Web.Common.csproj | 8 ++------ src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 2 +- .../Umbraco.Web.Website.csproj | 4 ---- .../.template.config/template.json | 10 +++++----- .../UmbracoPackage/UmbracoPackage.csproj | 2 +- .../UmbracoPackageRcl/UmbracoPackage.csproj | 2 +- .../.template.config/template.json | 10 +++++----- .../UmbracoProject/UmbracoProject.csproj | 2 +- .../misc/umbraco-linux.docker | 4 ++-- .../Umbraco.Tests.Benchmarks.csproj | 2 +- .../Umbraco.Tests.Integration.csproj | 4 ++-- .../Umbraco.Core/Components/ComponentTests.cs | 14 +++++++++++++ .../Umbraco.Core/Published/ModelTypeTests.cs | 4 ++-- .../BackOfficeClaimsPrincipalFactoryTests.cs | 4 ++-- .../Umbraco.Tests.UnitTests.csproj | 2 +- 29 files changed, 89 insertions(+), 89 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 86d160aef3..760467ffae 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -15,7 +15,7 @@ permissions: contents: read env: - dotnetVersion: 7.x + dotnetVersion: 8.x dotnetIncludePreviewVersions: true solution: umbraco.sln buildConfiguration: SkipTests diff --git a/Directory.Build.props b/Directory.Build.props index 01cd3b1064..6ca48f7712 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,8 +1,8 @@ - net7.0 - latest + net8.0 + 11.0 Umbraco HQ Umbraco Copyright © Umbraco $([System.DateTime]::Today.ToString('yyyy')) @@ -29,9 +29,9 @@ - false - true - 11.0.0 + true + false + 12.0.0-rc1 true true diff --git a/build/azure-pipelines.yml b/build/azure-pipelines.yml index 46e78d8b65..4c82646946 100644 --- a/build/azure-pipelines.yml +++ b/build/azure-pipelines.yml @@ -24,7 +24,7 @@ parameters: variables: nodeVersion: 18.16.0 - dotnetVersion: 7.x + dotnetVersion: 8.x dotnetIncludePreviewVersions: true solution: umbraco.sln buildConfiguration: Release diff --git a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj index edf3fd1f98..4048af3fb4 100644 --- a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj +++ b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj @@ -8,7 +8,6 @@ Umbraco.Cms.Api.Common - diff --git a/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj b/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj index 946c08556f..cc1571540e 100644 --- a/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj b/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj index f95f1cd1e1..d3274a5005 100644 --- a/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj index f8e3851ccd..8d7a835ab1 100644 --- a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj @@ -6,8 +6,9 @@ - - + + + diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj index 45b6b01052..92d929ce12 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj @@ -5,7 +5,7 @@ - + diff --git a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj index 652ab3417e..1cfb2dbd85 100644 --- a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj +++ b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj @@ -6,10 +6,6 @@ / - - - - @@ -25,7 +21,7 @@ - + @@ -37,7 +33,7 @@ - + diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 30d7b8ce7f..6a385aeba6 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -7,18 +7,18 @@ - - - - - - - - - + + + + + + + + + - + diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 232c480904..fd36c3c346 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -13,15 +13,14 @@ - - - - - - + + + + + @@ -38,8 +37,8 @@ - - + + diff --git a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj index 00e6c46273..90104b30a4 100644 --- a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj +++ b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj @@ -7,10 +7,6 @@ Umbraco.Cms.Web.BackOffice - - - - @@ -33,4 +29,4 @@ - \ No newline at end of file + diff --git a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs index 0dac2084bd..b2c02e54b2 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/InMemoryAuto/CompilationOptionsProvider.cs @@ -193,18 +193,7 @@ internal class CompilationOptionsProvider var parseOptions = new CSharpParseOptions(preprocessorSymbols: (IEnumerable)defines); - if (string.IsNullOrEmpty(dependencyContextOptions.LanguageVersion)) - { - parseOptions = parseOptions.WithLanguageVersion(LanguageVersion.Latest); - } - else if (LanguageVersionFacts.TryParse(dependencyContextOptions.LanguageVersion, out var languageVersion)) - { - parseOptions = parseOptions.WithLanguageVersion(languageVersion); - } - else - { - Debug.Fail($"LanguageVersion {languageVersion} specified in the deps file could not be parsed."); - } + parseOptions = parseOptions.WithLanguageVersion(LanguageVersion.Latest); return parseOptions; } diff --git a/src/Umbraco.Web.Common/Mvc/IpAddressUtilities.cs b/src/Umbraco.Web.Common/Mvc/IpAddressUtilities.cs index 876c1fdd3f..319669571c 100644 --- a/src/Umbraco.Web.Common/Mvc/IpAddressUtilities.cs +++ b/src/Umbraco.Web.Common/Mvc/IpAddressUtilities.cs @@ -7,11 +7,25 @@ public class IpAddressUtilities : IIpAddressUtilities { public bool IsAllowListed(IPAddress clientIpAddress, string allowedIpString) { - if (IPNetwork.TryParse(allowedIpString, out IPNetwork allowedIp) && allowedIp.Contains(clientIpAddress)) + var subnetmaskIndex = allowedIpString.LastIndexOf('/'); + if (subnetmaskIndex >= 0) // It's a network + { + if (IPNetwork.TryParse(allowedIpString, out IPNetwork allowedIp) && allowedIp.Contains(clientIpAddress)) + { + return true; + } + + return false; + } + + // Assume ip address + if (IPAddress.TryParse(allowedIpString, out IPAddress? allowedIpAddress) && allowedIpAddress.Equals(clientIpAddress)) { return true; } return false; + + } } diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index faea7d7e48..dc5fdde359 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -6,16 +6,12 @@ Umbraco.Cms.Web.Common - - - - - - + + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index bc05a391cc..6c67fff677 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -17,7 +17,7 @@ - + all diff --git a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj index 0d4a775a95..f9f3779b47 100644 --- a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj +++ b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj @@ -7,10 +7,6 @@ Umbraco.Cms.Web.Website - - - - diff --git a/templates/UmbracoPackage/.template.config/template.json b/templates/UmbracoPackage/.template.config/template.json index 768a7a4bee..33ec0699b1 100644 --- a/templates/UmbracoPackage/.template.config/template.json +++ b/templates/UmbracoPackage/.template.config/template.json @@ -28,13 +28,13 @@ "datatype": "choice", "choices": [ { - "displayName": ".NET 7.0", - "description": "Target net7.0", - "choice": "net7.0" + "displayName": ".NET 8.0", + "description": "Target net8.0", + "choice": "net8.0" } ], - "defaultValue": "net7.0", - "replaces": "net7.0" + "defaultValue": "net8.0", + "replaces": "net8.0" }, "UmbracoVersion": { "displayName": "Umbraco version", diff --git a/templates/UmbracoPackage/UmbracoPackage.csproj b/templates/UmbracoPackage/UmbracoPackage.csproj index 6da6cf2a79..268611b9ae 100644 --- a/templates/UmbracoPackage/UmbracoPackage.csproj +++ b/templates/UmbracoPackage/UmbracoPackage.csproj @@ -1,6 +1,6 @@ - net7.0 + net8.0 . UmbracoPackage UmbracoPackage diff --git a/templates/UmbracoPackageRcl/UmbracoPackage.csproj b/templates/UmbracoPackageRcl/UmbracoPackage.csproj index 5c980684ce..1cbdd209e5 100644 --- a/templates/UmbracoPackageRcl/UmbracoPackage.csproj +++ b/templates/UmbracoPackageRcl/UmbracoPackage.csproj @@ -1,6 +1,6 @@ - net7.0 + net8.0 enable enable true diff --git a/templates/UmbracoProject/.template.config/template.json b/templates/UmbracoProject/.template.config/template.json index d88b23c07d..b17352476e 100644 --- a/templates/UmbracoProject/.template.config/template.json +++ b/templates/UmbracoProject/.template.config/template.json @@ -38,13 +38,13 @@ "datatype": "choice", "choices": [ { - "displayName": ".NET 7.0", - "description": "Target net7.0", - "choice": "net7.0" + "displayName": ".NET 8.0", + "description": "Target net8.0", + "choice": "net8.0" } ], - "defaultValue": "net7.0", - "replaces": "net7.0" + "defaultValue": "net8.0", + "replaces": "net8.0" }, "UmbracoVersion": { "displayName": "Umbraco version", diff --git a/templates/UmbracoProject/UmbracoProject.csproj b/templates/UmbracoProject/UmbracoProject.csproj index d50f95a907..fcd25050f6 100644 --- a/templates/UmbracoProject/UmbracoProject.csproj +++ b/templates/UmbracoProject/UmbracoProject.csproj @@ -1,6 +1,6 @@ - net7.0 + net8.0 enable enable Umbraco.Cms.Web.UI diff --git a/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker b/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker index e19483cfa1..d1ca7fb4a4 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker +++ b/tests/Umbraco.Tests.AcceptanceTest/misc/umbraco-linux.docker @@ -2,7 +2,7 @@ ## Build ############################################ -FROM mcr.microsoft.com/dotnet/nightly/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/nightly/sdk:8.0.100-preview.6-jammy AS build COPY nuget.config . @@ -22,7 +22,7 @@ RUN dotnet publish --configuration Release --no-build --output /dist ## Run ############################################ -FROM mcr.microsoft.com/dotnet/nightly/aspnet:7.0 AS run +FROM mcr.microsoft.com/dotnet/nightly/aspnet:8.0.0-preview.6-jammy AS run WORKDIR /app COPY --from=build dist . diff --git a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index f338b443f3..e24c03c2c3 100644 --- a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -8,7 +8,7 @@ - + diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj index 6ef2c2a70f..49eaf3e04c 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj +++ b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs index a289f03131..ad69df45c0 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs @@ -153,11 +153,20 @@ public class ComponentTests return new ProfilingLogger(Mock.Of>(), Mock.Of()); } + if (type == typeof(ILogger)) + { + return Mock.Of>(); + } + if (type == typeof(ILogger)) { return Mock.Of>(); } + if (type == typeof(IServiceProviderIsService)) + { + return Mock.Of(); + } throw new NotSupportedException(type.FullName); }); }); @@ -315,6 +324,11 @@ public class ComponentTests { return Mock.Of>(); } + + if (type == typeof(IServiceProviderIsService)) + { + return Mock.Of(); + } throw new NotSupportedException(type.FullName); }); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Published/ModelTypeTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Published/ModelTypeTests.cs index eaab03c9b8..c2cbc1e416 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Published/ModelTypeTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Published/ModelTypeTests.cs @@ -1,7 +1,7 @@ // Copyright (c) Umbraco. // See LICENSE for more details. -using System.Collections.Generic; +using System.Collections; using NUnit.Framework; using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Tests.Common.Published; @@ -45,7 +45,7 @@ public class ModelTypeTests // Note the inner assembly qualified name Assert.AreEqual( - "System.Collections.Generic.IEnumerable`1[[System.Int32[], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]", + $"System.Collections.Generic.IEnumerable`1[[System.Int32[], System.Private.CoreLib, Version={typeof(IEnumerable).Assembly.GetName().Version}, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]", typeof(IEnumerable<>).MakeGenericType(type.MakeArrayType()).FullName); } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackOffice/BackOfficeClaimsPrincipalFactoryTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackOffice/BackOfficeClaimsPrincipalFactoryTests.cs index 1a8cecee6b..afda7c5cbf 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackOffice/BackOfficeClaimsPrincipalFactoryTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackOffice/BackOfficeClaimsPrincipalFactoryTests.cs @@ -64,8 +64,8 @@ public class BackOfficeClaimsPrincipalFactoryTests new BackOfficeClaimsPrincipalFactory(GetMockedUserManager().Object, null)); [Test] - public void Ctor_When_Options_Value_Is_Null_Expect_ArgumentNullException() - => Assert.Throws(() => new BackOfficeClaimsPrincipalFactory( + public void Ctor_When_Options_Value_Is_Null_Expect_ArgumentException() + => Assert.Throws(() => new BackOfficeClaimsPrincipalFactory( GetMockedUserManager().Object, new OptionsWrapper(null))); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index 5efd49eedf..7d37843ce0 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -7,8 +7,8 @@ + - From c61e6c490172a1f83c733a67aeeabdb555f9aab9 Mon Sep 17 00:00:00 2001 From: Andreas Zerbst <73799582+andr317c@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:38:02 +0200 Subject: [PATCH 25/27] Revert "Ensure package view path is generated with consideration the current section (#14268)" (#14508) This reverts commit 5382820e584c79dbe2a5d0e4793ea14a744709e7. --- .../Controllers/BackOfficeServerVariables.cs | 5 +-- .../Trees/ApplicationTreeController.cs | 2 +- .../Trees/ScriptsTreeController.cs | 2 - .../Trees/StylesheetsTreeController.cs | 2 - .../Trees/UrlHelperExtensions.cs | 39 +++++-------------- .../common/mocks/umbraco.servervariables.js | 2 +- .../src/common/services/navigation.service.js | 7 ++-- .../src/common/services/tree.service.js | 28 ++++++------- src/Umbraco.Web.UI.Client/src/routes.js | 18 ++++----- .../unit/common/services/tree-service.spec.js | 4 +- 10 files changed, 38 insertions(+), 71 deletions(-) diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs index 9325f9e8ae..6dbd5f1e79 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs @@ -704,9 +704,6 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers [DataMember(Name = "packageFolder")] public string? PackageFolder { get; set; } - - [DataMember(Name = "sectionAlias")] - public string? SectionAlias { get; set; } } private IEnumerable GetPluginTrees() @@ -738,7 +735,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers continue; } - yield return new PluginTree { Alias = tree.TreeAlias, PackageFolder = pluginController.AreaName, SectionAlias = tree.SectionAlias }; + yield return new PluginTree { Alias = tree.TreeAlias, PackageFolder = pluginController.AreaName }; } } diff --git a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs index 28f685bf0d..461d1fc82f 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ApplicationTreeController.cs @@ -360,7 +360,7 @@ public class ApplicationTreeController : UmbracoAuthorizedApiController ControllerActionDescriptor? actionDescriptor = _actionDescriptorCollectionProvider.ActionDescriptors.Items .Cast() .First(x => - (x.ControllerTypeInfo.FullName ?? string.Empty).Equals(controllerType.FullName) && + x.ControllerName.Equals(controllerName) && x.ActionName == action); var actionContext = new ActionContext(HttpContext, routeData, actionDescriptor); diff --git a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs index 0c46e809d2..630584a839 100644 --- a/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/ScriptsTreeController.cs @@ -3,12 +3,10 @@ using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; -using Umbraco.Cms.Web.Common.Attributes; namespace Umbraco.Cms.Web.BackOffice.Trees; [CoreTree] -[PluginController(Constants.Web.Mvc.BackOfficeTreeArea)] [Tree(Constants.Applications.Settings, Constants.Trees.Scripts, TreeTitle = "Scripts", SortOrder = 10, TreeGroup = Constants.Trees.Groups.Templating)] public class ScriptsTreeController : FileSystemTreeController { diff --git a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs index 32f2a3e465..3ff7a7ecfc 100644 --- a/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs +++ b/src/Umbraco.Web.BackOffice/Trees/StylesheetsTreeController.cs @@ -3,12 +3,10 @@ using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Trees; -using Umbraco.Cms.Web.Common.Attributes; namespace Umbraco.Cms.Web.BackOffice.Trees; [CoreTree] -[PluginController(Constants.Web.Mvc.BackOfficeTreeArea)] [Tree(Constants.Applications.Settings, Constants.Trees.Stylesheets, TreeTitle = "Stylesheets", SortOrder = 9, TreeGroup = Constants.Trees.Groups.Templating)] public class StylesheetsTreeController : FileSystemTreeController { diff --git a/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs b/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs index d8506f5692..1688a99ec2 100644 --- a/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs +++ b/src/Umbraco.Web.BackOffice/Trees/UrlHelperExtensions.cs @@ -47,15 +47,14 @@ public static class UrlHelperExtensions string nodeId, FormCollection? queryStrings) { - var actionName = "GetNodes"; - var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, actionName, treeType); - actionUrl = StartOrContinueQueryString(actionUrl, actionName); - - // Now we need to append the query strings - // Always ignore the custom start node id when generating URLs for tree nodes since this is a custom once-only parameter - // that should only ever be used when requesting a tree to render (root), not a tree node - actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id", TreeQueryStringParameters.StartNodeId); + var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, "GetNodes", treeType)? + .EnsureEndsWith('?'); + //now we need to append the query strings + actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id", + //Always ignore the custom start node id when generating URLs for tree nodes since this is a custom once-only parameter + // that should only ever be used when requesting a tree to render (root), not a tree node + TreeQueryStringParameters.StartNodeId); return actionUrl; } @@ -66,29 +65,11 @@ public static class UrlHelperExtensions string nodeId, FormCollection? queryStrings) { - var actionName = "GetMenu"; - var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, actionName, treeType); - actionUrl = StartOrContinueQueryString(actionUrl, actionName); + var actionUrl = urlHelper.GetUmbracoApiService(umbracoApiControllerTypeCollection, "GetMenu", treeType)? + .EnsureEndsWith('?'); - // now we need to append the query strings + //now we need to append the query strings actionUrl += "id=" + nodeId.EnsureEndsWith('&') + queryStrings?.ToQueryString("id"); return actionUrl; } - - /// - /// Check the provided string already includes a querystring fragment - /// If so, result has "&" appended, else has "?" appended. - /// - /// - /// - /// - private static string? StartOrContinueQueryString(string? actionUrl, string? delimiter) - { - if (actionUrl is null) - { - return actionUrl; - } - - return actionUrl.EnsureEndsWith(actionUrl.Contains($"{delimiter}?") ? "&" : "?"); - } } 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 4b8e8fa146..51029234f5 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 @@ -32,7 +32,7 @@ Umbraco.Sys.ServerVariables = { }, umbracoPlugins: { trees: [ - { alias: "myTree", packageFolder: "MyPackage", sectionAlias: "myPackageSectionAlias" } + { alias: "myTree", packageFolder: "MyPackage" } ] }, isDebuggingEnabled: true, 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 248e78880a..77b97545b6 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 @@ -616,7 +616,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService if (!treeAlias) { throw "Could not get tree alias for node " + args.node.id; } - templateUrl = this.getTreeTemplateUrl(treeAlias, args.action.alias, args.node.section); + templateUrl = this.getTreeTemplateUrl(treeAlias, args.action.alias); } setMode("dialog"); @@ -633,7 +633,6 @@ function navigationService($routeParams, $location, $q, $injector, eventsService * * @param {string} treeAlias the alias of the tree to look up * @param {string} action the view file name - * @param {string} sectionAlias the alias of the current section * @description * creates the templateUrl based on treeAlias and action * by convention we will look into the /views/{treetype}/{action}.html @@ -641,8 +640,8 @@ function navigationService($routeParams, $location, $q, $injector, eventsService * we will also check for a 'packageName' for the current tree, if it exists then the convention will be: * for example: /App_Plugins/{mypackage}/backoffice/{treetype}/create.html */ - getTreeTemplateUrl: function (treeAlias, action, sectionAlias) { - var packageTreeFolder = treeService.getTreePackageFolder(treeAlias, sectionAlias); + getTreeTemplateUrl: function (treeAlias, action) { + var packageTreeFolder = treeService.getTreePackageFolder(treeAlias); if (packageTreeFolder) { return (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + "/" + packageTreeFolder + 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 fa5d297a88..ba9ebc1b00 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 @@ -166,27 +166,23 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS * * @description * Determines if the current tree is a plugin tree and if so returns the package folder it has declared - * so we know where to find its views, otherwise it will just return undefined. + * so we know where to find it's views, otherwise it will just return undefined. * * @param {String} treeAlias The tree alias to check - * @param {String} sectionAlias The current section */ - getTreePackageFolder: function (treeAlias, sectionAlias) { + getTreePackageFolder: function (treeAlias) { //we determine this based on the server variables - if (!Umbraco.Sys.ServerVariables.umbracoPlugins || !Utilities.isArray(Umbraco.Sys.ServerVariables.umbracoPlugins.trees)) { - return undefined; - } + if (Umbraco.Sys.ServerVariables.umbracoPlugins && + Umbraco.Sys.ServerVariables.umbracoPlugins.trees && + Utilities.isArray(Umbraco.Sys.ServerVariables.umbracoPlugins.trees)) { - let found; - if (sectionAlias !== undefined) { - found = Umbraco.Sys.ServerVariables.umbracoPlugins.trees.find(item => - invariantEquals(item.alias, treeAlias) && invariantEquals(item.sectionAlias, sectionAlias)); - } else { - found = Umbraco.Sys.ServerVariables.umbracoPlugins.trees.find(item => - invariantEquals(item.alias, treeAlias)); - } + var found = _.find(Umbraco.Sys.ServerVariables.umbracoPlugins.trees, function (item) { + return invariantEquals(item.alias, treeAlias); + }); - return found ? found.packageFolder : undefined; + return found ? found.packageFolder : undefined; + } + return undefined; }, /** @@ -872,7 +868,7 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS //start var wrappedPromise = doSync(); - //then wrap it + //then wrap it wrappedPromise.then(function (args) { deferred.resolve(args); }, function (args) { diff --git a/src/Umbraco.Web.UI.Client/src/routes.js b/src/Umbraco.Web.UI.Client/src/routes.js index e6d97ea18f..7e65346d1b 100644 --- a/src/Umbraco.Web.UI.Client/src/routes.js +++ b/src/Umbraco.Web.UI.Client/src/routes.js @@ -1,5 +1,5 @@ window.app.config(function ($routeProvider) { - + /** * This determines if the route can continue depending on authentication and initialization requirements * @param {boolean} authRequired If true, it checks if the user is authenticated and will resolve successfully @@ -117,9 +117,9 @@ window.app.config(function ($routeProvider) { template: "
", //This controller will execute for this route, then we can execute some code in order to set the template Url controller: function ($scope, $route, $routeParams, $location, sectionService) { - + //We are going to check the currently loaded sections for the user and if the section we are navigating - //to has a custom route path we'll use that + //to has a custom route path we'll use that sectionService.getSectionsForUser().then(function(sections) { //find the one we're requesting var found = _.find(sections, function(s) { @@ -175,9 +175,8 @@ window.app.config(function ($routeProvider) { if ($routeParams.section.toLowerCase() === "users" && $routeParams.tree.toLowerCase() === "users" && usersPages.indexOf($routeParams.method.toLowerCase()) === -1) { $scope.templateUrl = "views/users/overview.html"; return; - } - - $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method, $routeParams.section); + } + $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method); }, reloadOnSearch: false, resolve: canRoute(true) @@ -191,9 +190,8 @@ window.app.config(function ($routeProvider) { if (!$routeParams.tree || !$routeParams.method) { $scope.templateUrl = "views/common/dashboard.html"; return; - } - - $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method, $routeParams.section); + } + $scope.templateUrl = navigationService.getTreeTemplateUrl($routeParams.tree, $routeParams.method); }, reloadOnSearch: false, reloadOnUrl: false, @@ -201,7 +199,7 @@ window.app.config(function ($routeProvider) { }) .otherwise({ redirectTo: '/login' }); }).config(function ($locationProvider) { - + $locationProvider.html5Mode(false); //turn html5 mode off $locationProvider.hashPrefix(''); }); diff --git a/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js b/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js index 63800a9e12..4d19cf557a 100644 --- a/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js +++ b/src/Umbraco.Web.UI.Client/test/unit/common/services/tree-service.spec.js @@ -298,13 +298,13 @@ describe('tree service tests', function () { it('can find a plugin based tree', function () { //we know this exists in the mock umbraco server vars - var found = treeService.getTreePackageFolder("myTree", "MyPackageSectionAlias"); + var found = treeService.getTreePackageFolder("myTree"); expect(found).toBe("MyPackage"); }); it('returns undefined for a not found tree', function () { //we know this does not exist in the mock umbraco server vars - var found = treeService.getTreePackageFolder("asdfasdf", "fdsafdsa"); + var found = treeService.getTreePackageFolder("asdfasdf"); expect(found).not.toBeDefined(); }); From f18d4b2078498c428899f5bbe0ec71f1ec1bafae Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 6 Jul 2023 07:52:11 +0000 Subject: [PATCH 26/27] Render all tabs in the background to ensure they register their initial state on any $scope.model in the stack. (#14493) Sometimes a tab, e.g. a "block list settings model" might register some default values, but if the user never clicks on the tab then they are not registered due to how AngularJS renders views with "ng-if". --- .../src/views/components/editor/umb-editor-sub-views.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html index 56c7a9cf48..be6f21ed96 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/editor/umb-editor-sub-views.html @@ -5,7 +5,7 @@ ng-repeat="subView in subViews track by subView.alias" ng-class="'sub-view-' + subView.name" val-sub-view="subView" - ng-if="subView.active" + ng-show="subView.active" >
From dc5c7a14a576afc4c349877785c5f009275d630c Mon Sep 17 00:00:00 2001 From: Zeegaan Date: Thu, 6 Jul 2023 10:40:50 +0200 Subject: [PATCH 27/27] Bump version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 964482479f..c88476851d 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "10.6.0", + "version": "10.6.1", "assemblyVersion": { "precision": "build" },