Merge remote-tracking branch 'origin/release/13.5' into v13/dev

# Conflicts:
#	version.json
This commit is contained in:
Bjarke Berg
2024-09-18 12:55:35 +02:00
6 changed files with 34 additions and 22 deletions

View File

@@ -4,9 +4,6 @@
<name>The Umbraco community</name>
<link>https://docs.umbraco.com/umbraco-cms/extending/language-files</link>
</creator>
<area alias="apps">
<key alias="umbContent">Innehåll</key>
</area>
<area alias="actions">
<key alias="assigndomain">Hantera domännamn</key>
<key alias="auditTrail">Hantera versioner</key>

View File

@@ -350,7 +350,13 @@ public class LocalizedTextService : ILocalizedTextService
IEnumerable<XElement> areas = xmlSource[cult].Value.XPathSelectElements("//area");
foreach (XElement area in areas)
{
var result = new Dictionary<string, string>(StringComparer.InvariantCulture);
var areaAlias = area.Attribute("alias")!.Value;
if (!overallResult.TryGetValue(areaAlias, out IDictionary<string, string>? result))
{
result = new Dictionary<string, string>(StringComparer.InvariantCulture);
}
IEnumerable<XElement> keys = area.XPathSelectElements("./key");
foreach (XElement key in keys)
{
@@ -364,7 +370,10 @@ public class LocalizedTextService : ILocalizedTextService
}
}
overallResult.Add(area.Attribute("alias")!.Value, result);
if (!overallResult.ContainsKey(areaAlias))
{
overallResult.Add(areaAlias, result);
}
}
// Merge English Dictionary
@@ -374,11 +383,11 @@ public class LocalizedTextService : ILocalizedTextService
IEnumerable<XElement> enUS = xmlSource[englishCulture].Value.XPathSelectElements("//area");
foreach (XElement area in enUS)
{
IDictionary<string, string>
result = new Dictionary<string, string>(StringComparer.InvariantCulture);
if (overallResult.ContainsKey(area.Attribute("alias")!.Value))
var areaAlias = area.Attribute("alias")!.Value;
if (!overallResult.TryGetValue(areaAlias, out IDictionary<string, string>? result))
{
result = overallResult[area.Attribute("alias")!.Value];
result = new Dictionary<string, string>(StringComparer.InvariantCulture);
}
IEnumerable<XElement> keys = area.XPathSelectElements("./key");
@@ -394,9 +403,9 @@ public class LocalizedTextService : ILocalizedTextService
}
}
if (!overallResult.ContainsKey(area.Attribute("alias")!.Value))
if (!overallResult.ContainsKey(areaAlias))
{
overallResult.Add(area.Attribute("alias")!.Value, result);
overallResult.Add(areaAlias, result);
}
}
}

View File

@@ -5,7 +5,7 @@
appState, contentResource, entityResource, navigationService, notificationsService, contentAppHelper,
serverValidationManager, contentEditingHelper, localizationService, formHelper, umbRequestHelper,
editorState, $http, eventsService, overlayService, $location, localStorageService, treeService,
$exceptionHandler, uploadTracker) {
$exceptionHandler, uploadTracker) {
var evts = [];
var infiniteMode = $scope.infiniteModel && $scope.infiniteModel.infiniteMode;
@@ -497,6 +497,7 @@
//Set them all to be invalid
var fieldsToRollback = checkValidility();
eventsService.emit("content.saving", { content: $scope.content, action: args.action });
eventsService.emit("form.lock");
return contentEditingHelper.contentEditorPerformSave({
saveMethod: args.saveMethod,
@@ -517,6 +518,7 @@
syncTreeNode($scope.content, data.path, false, args.reloadChildren);
eventsService.emit("content.saved", { content: $scope.content, action: args.action, valid: true });
eventsService.emit("form.unlock");
if($scope.contentForm.$invalid !== true) {
resetNestedFieldValiation(fieldsToRollback);
@@ -534,6 +536,7 @@
if (err && err.status === 400 && err.data) {
// content was saved but is invalid.
eventsService.emit("content.saved", { content: $scope.content, action: args.action, valid: false });
eventsService.emit("form.unlock");
}
return $q.reject(err);
@@ -1002,7 +1005,7 @@
const openPreviewWindow = (url, target) => {
// Chromes popup blocker will kick in if a window is opened
// without the initial scoped request. This trick will fix that.
const previewWindow = $window.open(url, target);
previewWindow.addEventListener('load', () => {

View File

@@ -2,7 +2,7 @@
'use strict';
/** This directive is used to render out the current variant tabs and properties and exposes an API for other directives to consume */
function tabbedContentDirective($timeout, $filter, contentEditingHelper, contentTypeHelper) {
function tabbedContentDirective($timeout, $filter, contentEditingHelper, contentTypeHelper, eventsService) {
function link($scope, $element) {
@@ -156,14 +156,13 @@
}
});
$scope.$on("formSubmitting", function() {
$scope.allowUpdate = false;
eventsService.on("form.lock", function() {
$scope.$evalAsync(() => {
$scope.allowUpdate = false;
});
});
$scope.$on("formSubmitted", function() {
setAllowUpdate();
});
$scope.$on("formSubmittedValidationFailed", function() {
eventsService.on("form.unlock", function() {
setAllowUpdate();
});

View File

@@ -50,13 +50,13 @@
function rawRteBlockResolver(propertyValue, propPasteResolverMethod) {
if (propertyValue != null && typeof propertyValue === "object") {
if (propertyValue && typeof propertyValue === "object" && propertyValue.markup) {
// object property of 'blocks' holds the data for the Block Editor.
var value = propertyValue.blocks;
// we got an object, and it has these three props then we are most likely dealing with a Block Editor.
if ((value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) {
if ((value && value.layout !== undefined && value.contentData !== undefined && value.settingsData !== undefined)) {
// replaceUdisOfObject replaces udis of the value object(by instance reference), but also returns the updated markup (as we cant update the reference of a string).
propertyValue.markup = replaceUdisOfObject(value.layout, value, propertyValue.markup);

View File

@@ -1056,6 +1056,10 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
editor.undoManager.clear();
}
}
angularHelper.safeApply($rootScope, function () {
editor.dispatch("Change");
});
});
});