From 6bc537713ce7eef4922d262844a6aa40db6b1dd6 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 14 Nov 2022 16:01:01 +0100 Subject: [PATCH 01/24] v11: Rich text editor - remove distraction-free mode and optimise inline mode (#13394) * combine 'inline' and 'distraction-free' modes with the quickbars plugin * remove 'distraction-free' and map to 'inline' * remove container overrides for 'distraction-free' --- .../src/common/services/tinymce.service.js | 14 ++++++++------ .../views/propertyeditors/rte/rte.controller.js | 6 +++--- .../rte/rte.prevalues.controller.js | 4 ++++ .../views/propertyeditors/rte/rte.prevalues.html | 5 ++--- 4 files changed, 17 insertions(+), 12 deletions(-) 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 65c4a50e43..8614173af8 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 @@ -347,18 +347,18 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s plugins.push("autoresize"); var modeInline = false; - var toolbar = args.toolbar.join(" "); + var toolbarActions = args.toolbar.join(" "); + var toolbar = toolbarActions; + var quickbar = toolbarActions; // Based on mode set // classic = Theme: modern, inline: false // inline = Theme: modern, inline: true, - // distraction-free = Theme: inlite, inline: true - if (args.mode === "inline") { - modeInline = true; - } - else if (args.mode === "distraction-free") { + // distraction-free = Same as inline - kept for legacy reasons due to older versions of Umbraco having this as a mode + if (args.mode === "inline" || args.mode === 'distraction-free') { modeInline = true; toolbar = false; + plugins.push('quickbars'); } //create a baseline Config to extend upon @@ -379,6 +379,8 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s //this would be for a theme other than inlite toolbar: toolbar, + quickbars_insert_toolbar: quickbar, + quickbars_selection_toolbar: quickbar, body_class: "umb-rte", diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js index ac3c2f9e7e..4973bede7a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.controller.js @@ -20,9 +20,9 @@ angular.module("umbraco") var width = editorConfig.dimensions ? parseInt(editorConfig.dimensions.width, 10) || null : null; var height = editorConfig.dimensions ? parseInt(editorConfig.dimensions.height, 10) || null : null; - $scope.containerWidth = editorConfig.mode === "distraction-free" ? (width ? width : "auto") : "auto"; - $scope.containerHeight = editorConfig.mode === "distraction-free" ? (height ? height : "auto") : "auto"; - $scope.containerOverflow = editorConfig.mode === "distraction-free" ? (height ? "auto" : "inherit") : "inherit"; + $scope.containerWidth = "auto"; + $scope.containerHeight = "auto"; + $scope.containerOverflow = "inherit"; var promises = []; 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..4e90dd063b 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 @@ -22,6 +22,10 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController", if (!$scope.model.value.mode) { $scope.model.value.mode = "classic"; } + else if ($scope.model.value.mode === 'distraction-free') { + // Due to legacy reasons, the older 'distraction-free' mode is kept and remapped to 'inline' + $scope.model.value.mode = 'inline'; + } tinyMceService.configuration().then(function(config){ $scope.tinyMceConfig = config; 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 0926efd6a4..eac505040c 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 @@ -40,9 +40,8 @@
From 8a04f9fd99ff64d1b289f2f9810bfee37a9cb1d6 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 16 Nov 2022 11:48:18 +0100 Subject: [PATCH 02/24] v11: Fix for TinyMCE dropdowns (#13417) * Set higher z-index for TinyMCE overlays as they were set below that of our property editor overlays Fixes #13414 * replace !important with more specificity --- src/Umbraco.Web.UI.Client/src/less/rte.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/less/rte.less b/src/Umbraco.Web.UI.Client/src/less/rte.less index ed25ce4e90..522d387c93 100644 --- a/src/Umbraco.Web.UI.Client/src/less/rte.less +++ b/src/Umbraco.Web.UI.Client/src/less/rte.less @@ -140,6 +140,12 @@ } } +.tox { + &.tox-tinymce-aux { + z-index: 65535; + } +} + .tox-tinymce-inline { z-index: 999; } From dc2358f4f069e22aa4097bbd13b3131ef7367df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 16 Nov 2022 11:52:40 +0100 Subject: [PATCH 03/24] Block Grid Editor: Removal of the forced placement feature (#13400) * removal of the forceLeft/forceRight code * removal of forced placement in css * bring back removed code --- .../EmbeddedResources/BlockGrid/items.cshtml | 4 - .../EmbeddedResources/Lang/da.xml | 6 - .../EmbeddedResources/Lang/en.xml | 6 - .../EmbeddedResources/Lang/en_us.xml | 6 - .../Models/Blocks/BlockGridItem.cs | 12 -- .../Models/Blocks/BlockGridLayoutItem.cs | 6 - .../BlockGridPropertyValueConverter.cs | 2 - .../blockgrid/blockgridui.less | 151 +----------------- .../blockgrid/razorhtml.temp.html | 2 - .../blockgrid/umb-block-grid-entries.html | 2 - .../blockgrid/umb-block-grid-entry.html | 32 ---- .../umbblockgridentries.component.js | 148 ++++------------- .../blockgrid/umbblockgridentry.component.js | 14 -- .../umbraco-blockgridlayout-flexbox.css | 12 -- .../blockgrid/umbraco-blockgridlayout.css | 6 - .../Views/Partials/blockgrid/items.cshtml | 5 +- 16 files changed, 31 insertions(+), 383 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/BlockGrid/items.cshtml b/src/Umbraco.Core/EmbeddedResources/BlockGrid/items.cshtml index 165044553a..f00e2481ac 100644 --- a/src/Umbraco.Core/EmbeddedResources/BlockGrid/items.cshtml +++ b/src/Umbraco.Core/EmbeddedResources/BlockGrid/items.cshtml @@ -7,8 +7,6 @@
@foreach (var item in Model) { - bool attrForceLeft = item.ForceLeft; - bool attrForceRight = item.ForceRight;
@{ var partialViewName = "blockgrid/Components/" + item.Content.ContentType.Alias; diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index 049b617f93..1c23c53e38 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -2244,12 +2244,6 @@ Mange hilsner fra Umbraco robotten - Påtving placering i venstre side - Påtving placering i højre side - Fjern påtvungen placering i venstre side - Fjern påtvungen placering i højre side - Skift påtvungen placering i venstre side - Skift påtvungen placering i højre side Træk for at skalere Tilføj indhold label Overskriv labellen for tilføj indholds knappen i dette område. diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 99428a8837..3cd7f0d40a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -2794,12 +2794,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont - Force placement at left side - Force placement at right side - Remove forced placement at left side - Remove forced placement at right side - Toggle forced placement at left side - Toggle forced placement at right side Drag to scale Create Button Label Overwrite the label on the create button of this Area. diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 483219eeb8..a20075769a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -2897,12 +2897,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont - Force placement at left side - Force placement at right side - Remove forced placement at left side - Remove forced placement at right side - Toggle forced placement at left side - Toggle forced placement at right side Drag to scale Create Button Label Overwrite the label on the create button of this Area. diff --git a/src/Umbraco.Core/Models/Blocks/BlockGridItem.cs b/src/Umbraco.Core/Models/Blocks/BlockGridItem.cs index 097882c5ab..eb554ef90d 100644 --- a/src/Umbraco.Core/Models/Blocks/BlockGridItem.cs +++ b/src/Umbraco.Core/Models/Blocks/BlockGridItem.cs @@ -81,18 +81,6 @@ namespace Umbraco.Cms.Core.Models.Blocks [DataMember(Name = "columnSpan")] public int ColumnSpan { get; set; } - /// - /// Forcing the item to be located in the left side. - /// - [DataMember(Name = "forceLeft")] - public bool ForceLeft { get; set; } - - /// - /// Forcing the item to be located in the right side. - /// - [DataMember(Name = "forceRight")] - public bool ForceRight { get; set; } - /// /// The grid areas within this item /// diff --git a/src/Umbraco.Infrastructure/Models/Blocks/BlockGridLayoutItem.cs b/src/Umbraco.Infrastructure/Models/Blocks/BlockGridLayoutItem.cs index 9014e2789a..30494b03f7 100644 --- a/src/Umbraco.Infrastructure/Models/Blocks/BlockGridLayoutItem.cs +++ b/src/Umbraco.Infrastructure/Models/Blocks/BlockGridLayoutItem.cs @@ -25,12 +25,6 @@ public class BlockGridLayoutItem : IBlockLayoutItem [JsonProperty("rowSpan", NullValueHandling = NullValueHandling.Ignore)] public int? RowSpan { get; set; } - [JsonProperty("forceLeft")] - public bool ForceLeft { get; set; } - - [JsonProperty("forceRight")] - public bool ForceRight { get; set; } - [JsonProperty("areas", NullValueHandling = NullValueHandling.Ignore)] public BlockGridLayoutAreaItem[] Areas { get; set; } = Array.Empty(); } diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs index 6cd2d4bd38..ae330870fa 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/BlockGridPropertyValueConverter.cs @@ -49,8 +49,6 @@ namespace Umbraco.Cms.Core.PropertyEditors.ValueConverters blockItem.RowSpan = layoutItem.RowSpan!.Value; blockItem.ColumnSpan = layoutItem.ColumnSpan!.Value; - blockItem.ForceLeft = layoutItem.ForceLeft; - blockItem.ForceRight = layoutItem.ForceRight; blockItem.AreaGridColumns = blockConfig.AreaGridColumns; blockItem.GridColumns = configuration.GridColumns; blockItem.Areas = layoutItem.Areas.Select(area => diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less index 38ff8086c6..b6205d73ac 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less @@ -28,9 +28,7 @@ > ng-form > .umb-block-grid__block--inline-create-button, > ng-form > .umb-block-grid__block--validation-border, - > ng-form > .umb-block-grid__block--actions, - > ng-form > .umb-block-grid__force-left, - > ng-form > .umb-block-grid__force-right { + > ng-form > .umb-block-grid__block--actions { z-index: 3; } } @@ -80,11 +78,6 @@ ng-form.ng-invalid-val-server-match-content > .umb-block-grid__block:not(.--acti opacity: 0; transition: opacity 120ms; } - > .umb-block-grid__force-left, - > .umb-block-grid__force-right { - opacity: 0; - transition: opacity 120ms; - } > .umb-block-grid__block--context { opacity: 0; transition: opacity 120ms; @@ -149,10 +142,6 @@ ng-form.ng-invalid-val-server-match-content > .umb-block-grid__block:not(.--acti > .umb-block-grid__scale-label { opacity: 1; } - > .umb-block-grid__force-left, - > .umb-block-grid__force-right { - opacity: 1; - } } /** make sure to hide child block ui: */ @@ -169,10 +158,6 @@ ng-form.ng-invalid-val-server-match-content > .umb-block-grid__block:not(.--acti > .umb-block-grid__block--actions { display: none; } - > .umb-block-grid__force-left, - > .umb-block-grid__force-right { - display: none; - } } &.--block-ui-visible { @@ -221,10 +206,6 @@ ng-form.ng-invalid-val-server-match-content > .umb-block-grid__block:not(.--acti > .umb-block-grid__scale-handler { opacity: var(--umb-block-grid--block-ui-opacity); } - > .umb-block-grid__force-left, - > .umb-block-grid__force-right { - opacity: var(--umb-block-grid--block-ui-opacity); - } } } @@ -372,106 +353,6 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl } } -.umb-block-grid__force-left, -.umb-block-grid__force-right { - position: absolute; - z-index: 2; - top: 50%; - height: 30px; - width: 15px; - margin-top:-15px; - background-color: transparent; - color: @blueDark; - border: 1px solid rgba(255, 255, 255, .2); - font-size: 12px; - padding: 0; - cursor: pointer; - box-sizing: border-box; - border-radius: 8px; - display: var(--umb-block-grid--block-ui-display, flex); - justify-content: center; - align-items: center; - pointer-events: all; - - opacity: 0; - transition: background-color 120ms, border-color 120ms, color 120ms, opacity 120ms; - - .icon { - position: relative; - display: inline-block; - pointer-events: none; - opacity: 0; - transition: transform 120ms ease-in-out, opacity 120ms; - ::before { - content: ''; - position: absolute; - background-color:currentColor; - width:2px; - height: 8px; - top: 2px; - transition: transform 120ms ease-in-out; - } - } - - &:hover { - opacity: 1; - color: @blueDark; - background-color: @white; - } - &:hover, - &.--active { - .icon { - opacity: 1; - transform: translateX(0); - ::before { - transform: translateX(0); - } - } - } - - &.--active { - background-color: @blueDark; - color: white; - &:hover { - color: white; - } - } -} - -.umb-block-grid__force-left { - left: 0; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - .icon { - transform: translateX(3px); - ::before { - left: 2px; - transform: translateX(-3px); - } - } - &:hover, - &.--active { - border-left-color: @blueDark; - } -} -.umb-block-grid__force-right { - right: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - .icon { - margin-right: 1px; - transform: translateX(-3px); - ::before { - right: 2px; - transform: translateX(3px); - } - } - &:hover, - &.--active { - border-right-color: @blueDark; - } -} - .umb-block-grid__scale-handler { cursor: nwse-resize; @@ -745,36 +626,6 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl 100% { background-color: rgba(@blueMidLight, 0.22); } } } -.umb-block-grid__layout-item-placeholder .indicateForceLeft, -.umb-block-grid__layout-item-placeholder .indicateForceRight { - position:absolute; - - z-index: 2; - height: 100%; - width: 15px; - - background-color: @blueDark; - - background-position: center center; - background-repeat: no-repeat; - display: block !important; - - animation: umb-block-grid__indicateForce__pulse 400ms ease-in-out alternate infinite; -} - -.umb-block-grid__layout-item-placeholder .indicateForceLeft { - left:0; - background-image: url("data:image/svg+xml;utf8,"); -} -.umb-block-grid__layout-item-placeholder .indicateForceRight { - right:0; - background-image: url("data:image/svg+xml;utf8,"); -} - -@keyframes umb-block-grid__indicateForce__pulse { - 0% { background-color: rgba(@blueDark, 1); } - 100% { background-color: rgba(@blueDark, 0.5); } -} .umb-block-grid__area { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/razorhtml.temp.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/razorhtml.temp.html index 9c7a95a101..5c64d795d1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/razorhtml.temp.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/razorhtml.temp.html @@ -14,8 +14,6 @@ data-element-udi="{{layoutEntry.contentUdi}}" data-col-span="{{layoutEntry.columnSpan}}" data-row-span="{{layoutEntry.rowSpan}}" - ng-attr-data-force-left="{{layoutEntry.forceLeft || undefined}}" - ng-attr-data-force-right="{{layoutEntry.forceRight || undefined}}" style=" --umb-block-grid--item-column-span: {{layoutEntry.columnSpan}}; --umb-block-grid--item-row-span: {{layoutEntry.rowSpan}}; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html index 301208c6f2..4aed670ffd 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html @@ -14,8 +14,6 @@ data-element-udi="{{layoutEntry.contentUdi}}" data-col-span="{{layoutEntry.columnSpan}}" data-row-span="{{layoutEntry.rowSpan}}" - ng-attr-data-force-left="{{layoutEntry.forceLeft || undefined}}" - ng-attr-data-force-right="{{layoutEntry.forceRight || undefined}}" style=" --umb-block-grid--item-column-span: {{layoutEntry.columnSpan}}; --umb-block-grid--item-row-span: {{layoutEntry.rowSpan}}; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html index e3f439a891..0caebd35c2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html @@ -132,38 +132,6 @@
- - - - -
+ + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.less index bf66c34661..4f5d45c67c 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.less @@ -217,6 +217,9 @@ Grid part: display: flex; align-items: center; justify-content: center; + + height:50px; + width:100%; color: @ui-action-discreet-type; font-weight: bold; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaAllowanceEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaAllowanceEditor.component.js index 693cdcc223..9729ddd85b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaAllowanceEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaAllowanceEditor.component.js @@ -27,7 +27,7 @@ } }); - function BlockGridAreaAllowanceController($scope, $element, assetsService, localizationService, editorService) { + function BlockGridAreaAllowanceController($scope) { var unsubscribe = []; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js index 9126a6cc54..3b9b6b4bea 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js @@ -1,6 +1,44 @@ (function () { "use strict"; + + // Utils: + + function getInterpolatedIndexOfPositionInWeightMap(target, weights) { + const map = [0]; + weights.reduce((a, b, i) => { return map[i+1] = a+b; }, 0); + const foundValue = map.reduce((a, b) => { + let aDiff = Math.abs(a - target); + let bDiff = Math.abs(b - target); + + if (aDiff === bDiff) { + return a < b ? a : b; + } else { + return bDiff < aDiff ? b : a; + } + }) + const foundIndex = map.indexOf(foundValue); + const targetDiff = (target-foundValue); + let interpolatedIndex = foundIndex; + if (targetDiff < 0 && foundIndex === 0) { + // Don't adjust. + } else if (targetDiff > 0 && foundIndex === map.length-1) { + // Don't adjust. + } else { + const foundInterpolationWeight = weights[targetDiff >= 0 ? foundIndex : foundIndex-1]; + interpolatedIndex += foundInterpolationWeight === 0 ? interpolatedIndex : (targetDiff/foundInterpolationWeight) + } + return interpolatedIndex; + } + + function getAccumulatedValueOfIndex(index, weights) { + let i = 0, len = Math.min(index, weights.length), calc = 0; + while(i modelEntry.key === el.dataset.areaKey, + querySelectModelToElement: (container, modelEntry) => container.querySelector(`[data-area-key='${modelEntry.key}']`), + itemHasNestedContainersResolver: () => false,// We never have nested in this case. + containerSelector: ".umb-block-grid-area-editor__grid-wrapper", + itemSelector: ".umb-block-grid-area-editor__area", + placeholderClass: "umb-block-grid-area-editor__area-placeholder", + onSync: onSortSync } - const gridContainerEl = $element[0].querySelector('.umb-block-grid-area-editor__grid-wrapper'); + function onSortSync() { + $scope.$evalAsync(); + setDirty(); + } - const sortable = Sortable.create(gridContainerEl, { - sort: true, // sorting inside list - animation: 150, // ms, animation speed moving items when sorting, `0` — without animation - easing: "cubic-bezier(1, 0, 0, 1)", // Easing for animation. Defaults to null. See https://easings.net/ for examples. - cancel: '', - draggable: ".umb-block-grid-area-editor__area", // Specifies which items inside the element should be draggable - ghostClass: "umb-block-grid-area-editor__area-placeholder", - onAdd: function (evt) { - _sync(evt); - $scope.$evalAsync(); - }, - onUpdate: function (evt) { - _sync(evt); - $scope.$evalAsync(); + function resolveVerticalDirection(data) { + + /** We need some data about the grid to figure out if there is room to be placed next to the found element */ + const approvedContainerComputedStyles = getComputedStyle(data.containerElement); + const gridColumnGap = Number(approvedContainerComputedStyles.columnGap.split("px")[0]) || 0; + const gridColumnNumber = vm.rootLayoutColumns; + + const foundElColumns = parseInt(data.relatedElement.dataset.colSpan, 10); + const currentElementColumns = data.item.columnSpan; + + if(currentElementColumns >= gridColumnNumber) { + return true; } - }); - - // TODO: setDirty if sort has happend. + + // Get grid template: + const approvedContainerGridColumns = approvedContainerComputedStyles.gridTemplateColumns.trim().split("px").map(x => Number(x)).filter(n => n > 0).map((n, i, list) => list.length === i ? n : n + gridColumnGap); + + // ensure all columns are there. + // This will also ensure handling non-css-grid mode, + // use container width divided by amount of columns( or the item width divided by its amount of columnSpan) + let amountOfColumnsInWeightMap = approvedContainerGridColumns.length; + const amountOfUnknownColumns = gridColumnNumber-amountOfColumnsInWeightMap; + if(amountOfUnknownColumns > 0) { + let accumulatedValue = getAccumulatedValueOfIndex(amountOfColumnsInWeightMap, approvedContainerGridColumns) || 0; + const layoutWidth = data.containerRect.width; + const missingColumnWidth = (layoutWidth-accumulatedValue)/amountOfUnknownColumns; + if(missingColumnWidth > 0) { + while(amountOfColumnsInWeightMap++ < gridColumnNumber) { + approvedContainerGridColumns.push(missingColumnWidth); + } + } + } + + let offsetPlacement = 0; + /* If placeholder is in this same line, we want to assume that it will offset the placement of the found element, + which provides more potential space for the item to drop at. + This is relevant in this calculation where we look at the space to determine if its a vertical or horizontal drop in relation to the found element. + */ + if(data.placeholderIsInThisRow && data.elementRect.left < data.relatedRect.left) { + offsetPlacement = -(data.elementRect.width + gridColumnGap); + } + + const relatedStartX = Math.max(data.relatedRect.left - data.containerRect.left + offsetPlacement, 0); + const relatedStartCol = Math.round(getInterpolatedIndexOfPositionInWeightMap(relatedStartX, approvedContainerGridColumns)); + + // If the found related element does not have enough room after which for the current element, then we go vertical mode: + return (relatedStartCol + (data.horizontalPlaceAfter ? foundElColumns : 0) + currentElementColumns > gridColumnNumber); + + } + } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridColumnEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridColumnEditor.component.js index 864f479009..1dcbc5b2da 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridColumnEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridColumnEditor.component.js @@ -25,9 +25,7 @@ } }); - function BlockGridColumnController($scope) { - - //var unsubscribe = []; + function BlockGridColumnController() { var vm = this; @@ -58,12 +56,6 @@ } } - /*$scope.$on("$destroy", function () { - for (const subscription of unsubscribe) { - subscription(); - } - });*/ - } })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html index 4aed670ffd..ef02d28318 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entries.html @@ -2,9 +2,10 @@
-
+
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 a0f56ee883..56c7a9cf48 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 @@ -1,17 +1,12 @@
- -
- -
-
- -
- +
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js index f5fd3bfd9c..d0de742205 100644 --- a/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/packages/overview.controller.js @@ -1,99 +1,99 @@ (function () { - "use strict"; + "use strict"; - function PackagesOverviewController($scope, $location, $routeParams, localizationService, localStorageService) { + function PackagesOverviewController($location, $routeParams, localizationService, localStorageService) { - //Hack! - // if there is a local storage value for packageInstallData then we need to redirect there, - // the issue is that we still have webforms and we cannot go to a hash location and then window.reload - // because it will double load it. - // we will refresh and then navigate there. + //Hack! + // if there is a local storage value for packageInstallData then we need to redirect there, + // the issue is that we still have webforms and we cannot go to a hash location and then window.reload + // because it will double load it. + // we will refresh and then navigate there. - let packageInstallData = localStorageService.get("packageInstallData"); - let packageUri = $routeParams.method; + let packageInstallData = localStorageService.get("packageInstallData"); + let packageUri = $routeParams.method; - if (packageInstallData) { - localStorageService.remove("packageInstallData"); + if (packageInstallData) { + localStorageService.remove("packageInstallData"); - if (packageInstallData.postInstallationPath) { - //navigate to the custom installer screen if set - $location.path(packageInstallData.postInstallationPath).search("packageId", packageInstallData.id); - return; - } + if (packageInstallData.postInstallationPath) { + //navigate to the custom installer screen if set + $location.path(packageInstallData.postInstallationPath).search("packageId", packageInstallData.id); + return; + } - //if it is "installed" then set the uri/path to that - if (packageInstallData === "installed") { - packageUri = "installed"; - } - } - - var vm = this; - vm.page = {}; - vm.page.labels = {}; - vm.page.name = ""; - vm.page.navigation = []; - - onInit(); - - function onInit() { - - loadNavigation(); - - setPageName(); - } - - function loadNavigation() { - - var labels = ["sections_packages", "packager_installed", "packager_installLocal", "packager_created"]; - - localizationService.localizeMany(labels).then(function (data) { - vm.page.labels.packages = data[0]; - vm.page.labels.installed = data[1]; - vm.page.labels.install = data[2]; - vm.page.labels.created = data[3]; - - vm.page.navigation = [ - { - "name": vm.page.labels.packages, - "icon": "icon-cloud", - "view": "views/packages/views/repo.html", - "active": !packageUri || packageUri === "repo", - "alias": "umbPackages", - "action": function () { - $location.path("/packages/packages/repo"); - } - }, - { - "name": vm.page.labels.installed, - "icon": "icon-box", - "view": "views/packages/views/installed.html", - "active": packageUri === "installed", - "alias": "umbInstalled", - "action": function () { - $location.path("/packages/packages/installed"); - } - }, - { - "name": vm.page.labels.created, - "icon": "icon-files", - "view": "views/packages/views/created.html", - "active": packageUri === "created", - "alias": "umbCreatedPackages", - "action": function () { - $location.path("/packages/packages/created"); - } - } - ]; - }); - } - - function setPageName() { - localizationService.localize("sections_packages").then(function (data) { - vm.page.name = data; - }) - } + //if it is "installed" then set the uri/path to that + if (packageInstallData === "installed") { + packageUri = "installed"; + } } - angular.module("umbraco").controller("Umbraco.Editors.Packages.OverviewController", PackagesOverviewController); + var vm = this; + vm.page = {}; + vm.page.labels = {}; + vm.page.name = ""; + vm.page.navigation = []; + + onInit(); + + function onInit() { + + loadNavigation(); + + setPageName(); + } + + function loadNavigation() { + + var labels = ["sections_marketplace", "packager_installed", "packager_installLocal", "packager_created"]; + + localizationService.localizeMany(labels).then(function (data) { + vm.page.labels.marketplace = data[0]; + vm.page.labels.installed = data[1]; + vm.page.labels.install = data[2]; + vm.page.labels.created = data[3]; + + vm.page.navigation = [ + { + "name": vm.page.labels.marketplace, + "icon": "icon-cloud", + "view": "views/packages/views/marketplace.html", + "active": !packageUri || packageUri === "repo", + "alias": "umbMarketplace", + "action": function () { + $location.path("/packages/packages/repo"); + } + }, + { + "name": vm.page.labels.installed, + "icon": "icon-box", + "view": "views/packages/views/installed.html", + "active": packageUri === "installed", + "alias": "umbInstalled", + "action": function () { + $location.path("/packages/packages/installed"); + } + }, + { + "name": vm.page.labels.created, + "icon": "icon-files", + "view": "views/packages/views/created.html", + "active": packageUri === "created", + "alias": "umbCreatedPackages", + "action": function () { + $location.path("/packages/packages/created"); + } + } + ]; + }); + } + + function setPageName() { + localizationService.localize("sections_marketplace").then(function (data) { + vm.page.name = data; + }) + } + } + + angular.module("umbraco").controller("Umbraco.Editors.Packages.OverviewController", PackagesOverviewController); })(); diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.controller.js new file mode 100644 index 0000000000..f2a4deb2c1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.controller.js @@ -0,0 +1,18 @@ +(function () { + "use strict"; + + function MarketplaceController($sce) { + + var vm = this; + var marketplaceUrl = new URL(Umbraco.Sys.ServerVariables.umbracoUrls.marketplaceUrl); + + function init() { + vm.marketplaceUrl = $sce.trustAsResourceUrl(marketplaceUrl.toString()); + } + + init(); + } + + angular.module("umbraco").controller("Umbraco.Editors.Packages.MarketplaceController", MarketplaceController); + +})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.html new file mode 100644 index 0000000000..95a28061b4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/views/packages/views/marketplace.html @@ -0,0 +1,13 @@ +
+ +
diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js deleted file mode 100644 index b690efacdf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.controller.js +++ /dev/null @@ -1,265 +0,0 @@ -(function () { - "use strict"; - - function PackagesRepoController($scope, $timeout, ourPackageRepositoryResource, $q, localizationService, notificationsService) { - - var vm = this; - - vm.packageViewState = "packageList"; - vm.categories = []; - vm.loading = true; - vm.pagination = { - pageNumber: 1, - totalPages: 10, - pageSize: 24 - }; - vm.searchQuery = ""; - vm.selectCategory = selectCategory; - vm.showPackageDetails = showPackageDetails; - vm.setPackageViewState = setPackageViewState; - vm.nextPage = nextPage; - vm.prevPage = prevPage; - vm.goToPage = goToPage; - vm.openLightbox = openLightbox; - vm.closeLightbox = closeLightbox; - vm.search = search; - vm.installCompleted = false; - vm.highlightedPackageCollections = []; - vm.labels = {}; - - var defaultSort = "Latest"; - var currSort = defaultSort; - - //used to cancel any request in progress if another one needs to take it's place - var canceler = null; - - function getActiveCategory() { - if (vm.searchQuery !== "") { - return ""; - } - for (var i = 0; i < vm.categories.length; i++) { - if (vm.categories[i].active === true) { - return vm.categories[i].name; - } - } - return ""; - } - - function init() { - - vm.loading = true; - localizationService.localizeMany(["packager_packagesPopular", "packager_packagesPromoted"]) - .then(function (labels) { - vm.labels.popularPackages = labels[0]; - vm.labels.promotedPackages = labels[1]; - - var popularPackages, promotedPackages; - $q.all([ - ourPackageRepositoryResource.getCategories() - .then(function (cats) { - vm.categories = cats.filter(function (cat) { - return cat.name !== "Umbraco Pro"; - }); - }), - ourPackageRepositoryResource.getPopular(10) - .then(function (pack) { - popularPackages = { title: vm.labels.popularPackages, packages: pack.packages }; - }), - ourPackageRepositoryResource.getPromoted(20) - .then(function (pack) { - promotedPackages = { title: vm.labels.promotedPackages, packages: pack.packages }; - }), - ourPackageRepositoryResource.search(vm.pagination.pageNumber - 1, vm.pagination.pageSize, currSort) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - }) - ]) - .then(function () { - vm.highlightedPackageCollections = [popularPackages, promotedPackages]; - vm.loading = false; - }); - }); - } - - function selectCategory(selectedCategory, categories) { - - for (var i = 0; i < categories.length; i++) { - var category = categories[i]; - if (category.name === selectedCategory.name) { - //it's already selected, let's unselect to show all again - if (category.active === true) { - category.active = false; - } - else { - category.active = true; - } - } - else { - category.active = false; - } - } - - vm.loading = true; - vm.searchQuery = ""; - - var reset = selectedCategory.active === false; - var searchCategory = reset ? "" : selectedCategory.name; - - currSort = defaultSort; - - var popularPackages, promotedPackages; - $q.all([ - ourPackageRepositoryResource.getPopular(10, searchCategory) - .then(function (pack) { - popularPackages = { title: vm.labels.popularPackages, packages: pack.packages }; - }), - ourPackageRepositoryResource.getPromoted(20, searchCategory) - .then(function (pack) { - promotedPackages = { title: vm.labels.promotedPackages, packages: pack.packages }; - }), - ourPackageRepositoryResource.search(vm.pagination.pageNumber - 1, vm.pagination.pageSize, currSort, searchCategory, vm.searchQuery) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - vm.pagination.pageNumber = 1; - }) - ]) - .then(function () { - vm.highlightedPackageCollections = [popularPackages, promotedPackages]; - vm.loading = false; - }); - } - - function showPackageDetails(selectedPackage) { - ourPackageRepositoryResource.getDetails(selectedPackage.id) - .then(function (pack) { - vm.package = pack; - vm.packageViewState = "packageDetails"; - }); - } - - function setPackageViewState(state) { - if (state) { - vm.packageViewState = state; - } - } - - function nextPage(pageNumber) { - ourPackageRepositoryResource.search(pageNumber - 1, vm.pagination.pageSize, currSort, getActiveCategory(), vm.searchQuery) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - }); - } - - function prevPage(pageNumber) { - ourPackageRepositoryResource.search(pageNumber - 1, vm.pagination.pageSize, currSort, getActiveCategory(), vm.searchQuery) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - }); - } - - function goToPage(pageNumber) { - ourPackageRepositoryResource.search(pageNumber - 1, vm.pagination.pageSize, currSort, getActiveCategory(), vm.searchQuery) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - }); - } - var previousElement = null; - - function openLightbox(itemIndex, items) { - - previousElement = ( document.activeElement || document.body ); - - vm.lightbox = { - show: true, - items: items, - activeIndex: itemIndex, - focus: true - }; - } - - function closeLightbox() { - vm.lightbox.show = false; - vm.lightbox = null; - - if(previousElement){ - - setTimeout(function(){ - previousElement.focus(); - previousElement = null; - }, 100) - } - } - - - var searchDebounced = _.debounce(function (e) { - //a canceler exists, so perform the cancelation operation and reset - if (canceler) { - canceler.resolve(); - } - - canceler = $q.defer(); - - $scope.$apply(function () { - currSort = vm.searchQuery ? "Default" : "Latest"; - - ourPackageRepositoryResource.search(vm.pagination.pageNumber - 1, - vm.pagination.pageSize, - currSort, - "", - vm.searchQuery, - canceler.promise) - .then(function (pack) { - vm.packages = pack.packages; - vm.pagination.totalPages = Math.ceil(pack.total / vm.pagination.pageSize); - vm.pagination.pageNumber = 1; - vm.loading = false; - //set back to null so it can be re-created - canceler = null; - }) - .catch(function (err) { - canceler = null; - - if (err) { - // If an abort happened, ignore it since it happened because of a new search - if (err.xhrStatus === 'abort') { - return; - } - - // Otherwise, show the error - if (err.errorMsg) { - notificationsService.error(err.errorMsg); - return; - } - } - - console.error(err); - }); - - }); - - }, 200); - - function search(searchQuery) { - vm.loading = true; - searchDebounced(); - } - - vm.reloadPage = function () { - //reload on next digest (after cookie) - $timeout(function () { - window.location.reload(true); - }); - } - - init(); - - } - - angular.module("umbraco").controller("Umbraco.Editors.Packages.RepoController", PackagesRepoController); - -})(); diff --git a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html b/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html deleted file mode 100644 index 1c3e3ec5d8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/views/packages/views/repo.html +++ /dev/null @@ -1,318 +0,0 @@ -
- - - - -
- -
- -
- -
-
- -
-
- -
- -
-
-

{{highlightedPackageCollection.title}}

-
- -
- -
- -
-
-
- -
- -

New Releases

-

Results for '{{ vm.searchQuery }}'

- -
- -
- -
- -
-
- -
- - - - -
- - - -

We couldn't find anything for '{{ vm.searchQuery }}'

-

Please try searching for another package or browse through the categories.

-
- - -

Sorry, we can not find what you are looking for.

-

Please try searching for another package or browse through the categories.

-
- -
- -
- - - -
- - - - - - - -
- -
- -
- - - -
{{ vm.package.name }}
-
- -
-
- - - - -
- -
- - - -
Install Instructions
-
- dotnet add package {{vm.package.nuGetPackageId}} -
-
-
- - - -
- -
- - -
- -
-
{{ vm.package.ownerInfo.owner }}
-
- {{ vm.package.ownerInfo.owner }} has {{ vm.package.ownerInfo.karma }} karma points -
-
-
-
-
- - - -
Information
-
- -
-
Owner:
-
{{vm.package.ownerInfo.owner}}
-
- -
-
Contributors:
-
- {{ contributor }} -
-
- -
-
Created:
-
{{vm.package.created | date:'yyyy-MM-dd HH:mm:ss'}}
-
- -
-
Current version:
-
{{vm.package.latestVersion}}
-
- -
-
.NET Version:
-
{{vm.package.information.netVersion}}
-
- -
-
License:
-
{{vm.package.licenseName}}
-
- -
-
Downloads:
-
{{vm.package.downloads}}
-
- -
-
Likes:
-
{{vm.package.likes}}
-
- -
-
Verified to work on Umbraco CLoud
-
- -
-
-
- - - -
Compatibility
-
This package is compatible with the following versions of Umbraco, as reported by community members. Full compatability cannot be guaranteed for versions reported below 100%
-
-
- {{compatibility.version}} - ({{compatibility.percentage}}%) -
- - -
-
-
- - - -
External sources
- -
-
- -
- -
-
-
- -
From f2798a6790a3af784f698b86c6e314406d87d4ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 13:22:00 +0100 Subject: [PATCH 13/24] Block Grid Editor adjust while sorting (#13442) * make sure area border is on top of block views. * rename class to avoid confusion * change witch UI goes on top on hover * Description informing all blocks are allowed when none is configured. * add 'When empty' * Sort mode * ability to switch out property actions * enter and exit sortmode from property actions * gridsortblock * rename block class to use sortblock * Sort mode styling * remove unused css selector * fixing style for inline-creat button to appear above and not when hovering contextbar * work on block grid inline editor * use uui-button + enable installing demo blocks when its not the first dataType of this kind. * improvements to inline editing POC * update title of area config overlay editor * reset columnSpan if no column span options is defined. * Inline editing * remove html comment * remove code for transfer of stylesheets * ability to hide label from directive * inline editing using slots to render the umb-property in light dom * remove property editor proxies when moving a block to a new area/block/context * minor adjustments to custom views * use individual slots for each area. * Inline editing * a little smaller rte min-height * fire Custom focus/blur event for Block Grid Editor to catch for focus imitation * disable inline editing prevalue field when custom view is set * Fix scroll parent block into view * initial work on sorter directive * remove mediaBlock controller * initial notes and structure * further concept work * remove consol log * CSS for getting bigger areas * removal of the forceLeft/forceRight code * proven concept * fix grid space detection. vertical/horizontal * clean up and notes * move into inner containers as well * use last available index pr default * boundary selector, for improved choise of dropping into an area * hide last inline create button when dragging around * remove console.log * removal of forced placement in css * default config and clean up * notes * bring back removed code * show area ui when in dragging mode * more specific selector * drop allowance + clean up * notes and clean up * auto scroll * turn --umb-block-grid--dragging-mode into conditional CSS Custom Property * auto scroll * refactoring * fix condition mistake * scope.config.resolveVerticalDirection * wrap up simple setDragImage solution * bring back vm.notifyVisualUpdate and clean up * make draggableSelector optional, fallback to element * implement umb-block-grid-sorter for Area PreValue editor * remove sortableJS dependency * remove sortableJs from dependencies * wups, bring back the comma * removed sortablejs from package-lock * finished implementation of sorter for PreValue Block Areas * fix for FireFox shadowDom issue, contains temprorary code. * stop auto scroll * make full thing dragable * fix firefox issue (applying translateZ) * comment * make block fit in context columns * revert element to where it came from if sync could not succeed + clean up * ensure block does not push the amount of columns, this occourse when dragging item around. * take horizontalPlaceAfter into account * implement horizontalPlaceAfter in Areas Prevalue editor * clean up dependencies * Shift related el to first in row or last in row when there is no horizontal room * clean up and correct calculation * remove unused attribute * revert to using el.getBoundingClientRect(), as the config.draggableSelector is not available for the placeholder item. * bind model via dedicated binding to ensure it stay connected with the source model * Update src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.html Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> * fix eslint issues * ensure missingColumnWidth is above 0 * Do not allow dragging something thats not found in the model. * remove as this is not an error. * update to Flexbox solution * as the complex model does not change we can use single way binding * Adjust columnSpan to context container, keep start columnSpan as the target for the calculation. * change let to const * Revert "change let to const" This reverts commit fe19f8c5edf27c0445743c35d4a8566044a02a50. Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> --- .../umbblockgridentries.component.js | 42 ++++++++++++------- .../umbblockgridsortable.directive.js | 15 ++++++- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridentries.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridentries.component.js index bd823b62e6..395683d1b4 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridentries.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridentries.component.js @@ -227,6 +227,7 @@ function initializeSorter() { vm.sorterOptions = { + ownerVM: vm, resolveVerticalDirection: resolveVerticalDirection, dataTransferResolver: (dataTransfer, item) => {dataTransfer.setData("text/plain", item.$block.label)}, // (Optional) Append OS data to the moved item. compareElementToModel: (el, modelEntry) => modelEntry.contentUdi === el.dataset.elementUdi, @@ -241,6 +242,7 @@ ghostClass: "umb-block-grid__layout-item-ghost", onStart: onSortStart, onEnd: onSortEnd, + onContainerChange: onSortContainerChange, onSync: onSortSync, onDisallowed: onSortDisallowed, onAllowed: onSortAllowed, @@ -248,7 +250,10 @@ } } + var currentItemColumnSpanTarget; function onSortStart(data) { + currentItemColumnSpanTarget = data.item.columnSpan; + // Gather containedPropertyEditorProxies from this element. currentContainedPropertyEditorProxies = Array.from(data.element.querySelectorAll('slot[data-is-property-editor-proxy]')).map(x => x.getAttribute('name')); vm.blockEditorApi.internal.startDraggingMode(); @@ -261,22 +266,31 @@ $scope.$evalAsync(); } + function getColumnSpanForContext(currentColumnSpan, columnSpanOptions, contextColumns) { + if (columnSpanOptions.length > 0) { + const availableOptions = columnSpanOptions.filter(option => option.columnSpan <= contextColumns); + if(availableOptions.length > 0) { + const closestColumnSpan = availableOptions.map(x => x.columnSpan).reduce( + (prev, curr) => { + return Math.abs(curr - currentColumnSpan) < Math.abs(prev - currentColumnSpan) ? curr : prev + }, 99999 + ); + if(closestColumnSpan) { + return closestColumnSpan; + } + } + } + return contextColumns; + } + + function onSortContainerChange(data) { + const contextColumns = vm.blockEditorApi.internal.getContextColumns(data.ownerVM.parentBlock, data.ownerVM.areaKey); + data.item.columnSpan = getColumnSpanForContext(currentItemColumnSpanTarget, data.item.$block.config.columnSpanOptions, contextColumns); + } + function onSortSync(data) { if (data.fromController !== data.toController) { - removeAllContainedPropertyEditorProxies(); - - const contextColumns = vm.blockEditorApi.internal.getContextColumns(vm.parentBlock, vm.areaKey); - - // if colSpan is lower than contextColumns, and we do have some columnSpanOptions: - if (data.item.columnSpan < contextColumns && data.item.$block.config.columnSpanOptions.length > 0) { - // then check if the colSpan is a columnSpanOption, if NOT then reset to contextColumns. - const found = data.item.$block.config.columnSpanOptions.find(option => option.columnSpan === data.item.columnSpan); - if(!found) { - data.item.columnSpan = contextColumns; - } - } else { - data.item.columnSpan = contextColumns; - } + removeAllContainedPropertyEditorProxies(); } $scope.$evalAsync(); vm.blockEditorApi.internal.setDirty(); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridsortable.directive.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridsortable.directive.js index fc973ce490..cfcab3b9be 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridsortable.directive.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbblockgridsortable.directive.js @@ -82,6 +82,7 @@ const config = {...DefaultConfig, ...scope.config}; vm.identifier = config.identifier; + vm.ownerVM = config.ownerVM || null; let scrollElement = null; @@ -219,6 +220,11 @@ if(currentContainerVM.sync(currentElement, vm) === false) { // Sync could not succeed, might be because item is not allowed here. + currentContainerVM = vm; + if (config.onContainerChange) { + config.onContainerChange({item: currentItem, element: currentElement, ownerVM: currentContainerVM.ownerVM}); + } + // Lets move the Element back to where it came from: const movingItemIndex = scope.model.indexOf(currentItem); if(movingItemIndex < scope.model.length-1) { @@ -229,7 +235,6 @@ containerEl.appendChild(currentElement); } - currentContainerVM = vm; } if (config.onEnd) { @@ -315,6 +320,9 @@ if(parentContainerVM.identifier === vm.identifier) { currentContainerElement = parentContainer; currentContainerVM = parentContainerVM; + if (config.onContainerChange) { + config.onContainerChange({item: currentItem, element: currentElement, ownerVM: currentContainerVM.ownerVM}); + } } } } @@ -392,6 +400,9 @@ if(subVm.identifier === vm.identifier) { currentContainerElement = subLayoutEl; currentContainerVM = subVm; + if (config.onContainerChange) { + config.onContainerChange({item: currentItem, element: currentElement, ownerVM: currentContainerVM.ownerVM}); + } moveCurrentElement(); return; } @@ -482,7 +493,7 @@ } if(config.onChange) { - config.onChange(); + config.onChange({element: currentElement, item: currentItem, ownerVM: currentContainerVM.ownerVM}); } } From 195cf4f9ec58b7b58eaf636e34b65a8126ec6c8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 14:17:47 +0100 Subject: [PATCH 14/24] Block Grid Editor - make prevalue overlay medium sized (#13443) * make sure area border is on top of block views. * rename class to avoid confusion * change witch UI goes on top on hover * Description informing all blocks are allowed when none is configured. * add 'When empty' * Sort mode * ability to switch out property actions * enter and exit sortmode from property actions * gridsortblock * rename block class to use sortblock * Sort mode styling * remove unused css selector * fixing style for inline-creat button to appear above and not when hovering contextbar * work on block grid inline editor * use uui-button + enable installing demo blocks when its not the first dataType of this kind. * improvements to inline editing POC * update title of area config overlay editor * reset columnSpan if no column span options is defined. * Inline editing * remove html comment * remove code for transfer of stylesheets * ability to hide label from directive * inline editing using slots to render the umb-property in light dom * remove property editor proxies when moving a block to a new area/block/context * minor adjustments to custom views * use individual slots for each area. * Inline editing * a little smaller rte min-height * fire Custom focus/blur event for Block Grid Editor to catch for focus imitation * disable inline editing prevalue field when custom view is set * Fix scroll parent block into view * initial work on sorter directive * remove mediaBlock controller * initial notes and structure * further concept work * remove consol log * CSS for getting bigger areas * removal of the forceLeft/forceRight code * proven concept * fix grid space detection. vertical/horizontal * clean up and notes * move into inner containers as well * use last available index pr default * boundary selector, for improved choise of dropping into an area * hide last inline create button when dragging around * remove console.log * removal of forced placement in css * default config and clean up * notes * bring back removed code * show area ui when in dragging mode * more specific selector * drop allowance + clean up * notes and clean up * auto scroll * turn --umb-block-grid--dragging-mode into conditional CSS Custom Property * auto scroll * refactoring * fix condition mistake * scope.config.resolveVerticalDirection * wrap up simple setDragImage solution * bring back vm.notifyVisualUpdate and clean up * make draggableSelector optional, fallback to element * implement umb-block-grid-sorter for Area PreValue editor * remove sortableJS dependency * remove sortableJs from dependencies * wups, bring back the comma * removed sortablejs from package-lock * finished implementation of sorter for PreValue Block Areas * fix for FireFox shadowDom issue, contains temprorary code. * stop auto scroll * make full thing dragable * fix firefox issue (applying translateZ) * comment * make block fit in context columns * revert element to where it came from if sync could not succeed + clean up * ensure block does not push the amount of columns, this occourse when dragging item around. * take horizontalPlaceAfter into account * implement horizontalPlaceAfter in Areas Prevalue editor * clean up dependencies * Shift related el to first in row or last in row when there is no horizontal room * clean up and correct calculation * remove unused attribute * revert to using el.getBoundingClientRect(), as the config.draggableSelector is not available for the placeholder item. * bind model via dedicated binding to ensure it stay connected with the source model * Update src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.html Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> * fix eslint issues * ensure missingColumnWidth is above 0 * Do not allow dragging something thats not found in the model. * remove as this is not an error. * update to Flexbox solution * as the complex model does not change we can use single way binding * Adjust columnSpan to context container, keep start columnSpan as the target for the calculation. * make prevalue editor overlay medium size Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> --- ...kgrid.blockconfiguration.area.overlay.html | 2 +- ...blockgrid.blockconfiguration.controller.js | 2 +- .../blockgrid.blockconfiguration.overlay.html | 114 +++++++++--------- .../blockgrid.blockconfiguration.overlay.less | 23 ---- 4 files changed, 60 insertions(+), 81 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.area.overlay.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.area.overlay.html index 90918d71e1..a4ba0db72e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.area.overlay.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.area.overlay.html @@ -13,7 +13,7 @@ -
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js index 3c005663e8..993088e2eb 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js @@ -287,7 +287,7 @@ title: data, openAreas: openAreas, view: "views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html", - size: "large", + size: "medium", submit: function(overlayModel) { loadElementTypes()// lets load elementType again, to ensure we are up to date. TransferProperties(overlayModel.block, block);// transfer properties back to block object. (Doing this cause we dont know if block object is added to model jet, therefor we cant use index or replace the object.) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html index 27c1a2f006..5aa544200a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html @@ -15,9 +15,9 @@ -
+
-
+
General @@ -80,9 +80,59 @@
- -
+ +
+ +
+ Permissions +
+ +
+ + +
+
+ + + Make this block available in the root of the layout. + +
+ + +
+
+
+ + + +
+
+ + + Make this block available within other Blocks. + +
+ + +
+
+
+ +
+ +
+ + + + +
@@ -131,7 +181,7 @@ -
+
Catalogue appearance @@ -196,59 +246,11 @@
- -
- -
- Allowance -
- -
- - -
-
- - - Make this block available in the root of the layout. - -
- - -
-
-
- - - -
-
- - - Make this block available within other Blocks. - -
- - -
-
-
- -
- -
-
-
+
@@ -288,7 +290,7 @@
-
+
Advanced @@ -413,4 +415,4 @@ -
\ No newline at end of file +
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.less index 57507f8044..5861cfdda5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.less @@ -1,28 +1,5 @@ .umb-block-grid-block-configuration-overlay { - .umb-block-grid-block-configuration-layout { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - - grid-gap: 0 20px; - grid-auto-flow: row; - grid-auto-rows: minmax(50px, auto); - - - } - - - .umb-block-grid-block-configuration__umb-group-panel { - @media (max-width: 1024px) { - grid-column: span 2; - } - &.--span-two-cols { - grid-column: span 2; - } - &.--span-two-rows { - grid-row: span 2; - } - } .umb-node-preview { flex-grow: 1; From 3b9fc38078c3a04396afaf9bb0d980ec52f86086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 16:22:49 +0100 Subject: [PATCH 15/24] block grid editor visual adjustments (#13446) * make sure area border is on top of block views. * rename class to avoid confusion * change witch UI goes on top on hover * Description informing all blocks are allowed when none is configured. * add 'When empty' * Sort mode * ability to switch out property actions * enter and exit sortmode from property actions * gridsortblock * rename block class to use sortblock * Sort mode styling * remove unused css selector * fixing style for inline-creat button to appear above and not when hovering contextbar * work on block grid inline editor * use uui-button + enable installing demo blocks when its not the first dataType of this kind. * improvements to inline editing POC * update title of area config overlay editor * reset columnSpan if no column span options is defined. * Inline editing * remove html comment * remove code for transfer of stylesheets * ability to hide label from directive * inline editing using slots to render the umb-property in light dom * remove property editor proxies when moving a block to a new area/block/context * minor adjustments to custom views * use individual slots for each area. * Inline editing * a little smaller rte min-height * fire Custom focus/blur event for Block Grid Editor to catch for focus imitation * disable inline editing prevalue field when custom view is set * Fix scroll parent block into view * initial work on sorter directive * remove mediaBlock controller * initial notes and structure * further concept work * remove consol log * CSS for getting bigger areas * removal of the forceLeft/forceRight code * proven concept * fix grid space detection. vertical/horizontal * clean up and notes * move into inner containers as well * use last available index pr default * boundary selector, for improved choise of dropping into an area * hide last inline create button when dragging around * remove console.log * removal of forced placement in css * default config and clean up * notes * bring back removed code * show area ui when in dragging mode * more specific selector * drop allowance + clean up * notes and clean up * auto scroll * turn --umb-block-grid--dragging-mode into conditional CSS Custom Property * auto scroll * refactoring * fix condition mistake * scope.config.resolveVerticalDirection * wrap up simple setDragImage solution * bring back vm.notifyVisualUpdate and clean up * make draggableSelector optional, fallback to element * implement umb-block-grid-sorter for Area PreValue editor * remove sortableJS dependency * remove sortableJs from dependencies * wups, bring back the comma * removed sortablejs from package-lock * finished implementation of sorter for PreValue Block Areas * fix for FireFox shadowDom issue, contains temprorary code. * stop auto scroll * make full thing dragable * fix firefox issue (applying translateZ) * comment * make block fit in context columns * revert element to where it came from if sync could not succeed + clean up * ensure block does not push the amount of columns, this occourse when dragging item around. * take horizontalPlaceAfter into account * implement horizontalPlaceAfter in Areas Prevalue editor * clean up dependencies * Shift related el to first in row or last in row when there is no horizontal room * clean up and correct calculation * remove unused attribute * revert to using el.getBoundingClientRect(), as the config.draggableSelector is not available for the placeholder item. * bind model via dedicated binding to ensure it stay connected with the source model * Update src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-area-editor.html Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> * fix eslint issues * ensure missingColumnWidth is above 0 * Do not allow dragging something thats not found in the model. * remove as this is not an error. * update to Flexbox solution * as the complex model does not change we can use single way binding * Adjust columnSpan to context container, keep start columnSpan as the target for the calculation. * make prevalue editor overlay medium size * more white borders on UI * move Catalogue appearance to Advanced Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> --- .../blockgrid/blockgridui.less | 8 +- .../blockgrid.blockconfiguration.overlay.html | 131 +++++++++--------- 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less index c037631d46..d66a6bf5c5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less @@ -223,8 +223,8 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl .umb-block-grid__block--context { position: absolute; - top: -20px; - right: 0; + top: -21px; + right: -1px; font-size: 12px; z-index: 4; display: var(--umb-block-grid--block-ui-display, flex); @@ -245,6 +245,9 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl padding-top: 1px; background-color: #3544B1; color: white; + border-top: rgba(255, 255, 255, .7) 1px solid; + border-left: rgba(255, 255, 255, .7) 1px solid; + border-right: rgba(255, 255, 255, .7) 1px solid; border-top-left-radius: 3px; border-top-right-radius: 3px; display: inline-block; @@ -367,6 +370,7 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl padding: 0; background-color: white; border: @blueDark solid 1px; + box-shadow: 0 0 0 1px rgba(255, 255, 255, .7); opacity: 0; transition: opacity 120ms; } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html index 5aa544200a..cc22c6d93a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html @@ -179,73 +179,6 @@
- - -
- -
- Catalogue appearance -
- -
- - - - -
-
- -
- - -
-
-
- - -
-
- -
- - -
-
-
- - -
-
- -
-
- - -
- -
-
- -
-
-
- -
- -
-
@@ -386,6 +319,70 @@
+
+ +
+ Catalogue appearance +
+ +
+ + + + +
+
+ +
+ + +
+
+
+ + +
+
+ +
+ + +
+
+
+ + +
+
+ +
+
+ + +
+ +
+
+ +
+
+
+ +
+ +
From a0f348862fcba10a036a5061a94093f2fc79b03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 16:23:07 +0100 Subject: [PATCH 16/24] Display media trashed state on custom view for image demo block (#13448) --- .../umbBlockGridDemoImageBlock.html | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoImageBlock.html b/src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoImageBlock.html index cd3379994a..e5c6a4d04d 100644 --- a/src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoImageBlock.html +++ b/src/Umbraco.Cms.StaticAssets/wwwroot/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoImageBlock.html @@ -66,11 +66,22 @@ transition: opacity 120ms; } + .is-trashed { + background-color: #d42054 !important; + color:white !important; + } + .is-trashed .file-name { + opacity: 1; + } + - \ No newline at end of file From 0def36ac31d0521821444543b9e87d351b268a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 20:07:18 +0100 Subject: [PATCH 17/24] Block Grid Editor translations and Area size keyboard navigation (#13450) --- .../EmbeddedResources/Lang/da.xml | 3 +++ .../EmbeddedResources/Lang/en.xml | 3 +++ .../EmbeddedResources/Lang/en_us.xml | 3 +++ .../umb-block-grid-column-editor-option.html | 2 +- ...b-block-grid-configuration-area-entry.html | 8 ++++---- .../umbBlockGridAreaEditor.component.js | 3 --- ...ockGridConfigurationAreaEntry.component.js | 19 ++++++++++--------- 7 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index 32317e57d0..a374907279 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -2268,6 +2268,9 @@ Mange hilsner fra Umbraco robotten Sortings tilstand Afslut sortings tilstand Dette område alias skal være unikt sammenlignet med andre områder af denne Blok. + Konfigurer område + Slet område + Tilføj mulighed for %0% koloner Hvad er Indholdsskabeloner? diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index f3bdf620d4..4787679027 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -2817,6 +2817,9 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Sort mode End sort mode This Areas Alias must be unique compared to the other Areas of this Block. + Configure area + Delete area + Add spanning %0% columns option What are Content Templates? diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index c19642d351..9e3fe2305a 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -2920,6 +2920,9 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Sort mode End sort mode This Areas Alias must be unique compared to the other Areas of this Block. + Configure area + Delete area + Add spanning %0% columns option What are Content Templates? diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-column-editor-option.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-column-editor-option.html index ab63757bb5..05f55d3a07 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-column-editor-option.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-column-editor-option.html @@ -18,7 +18,7 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-configuration-area-entry.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-configuration-area-entry.html index 524be4f4cd..9909b640a1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-configuration-area-entry.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umb-block-grid-configuration-area-entry.html @@ -4,18 +4,18 @@
- -
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js index 3b9b6b4bea..914e701fa6 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridAreaEditor.component.js @@ -164,7 +164,6 @@ } vm.requestDeleteArea = function (area) { - // TODO: Translations localizationService.localizeMany(["general_delete", "blockEditor_confirmDeleteBlockAreaMessage", "blockEditor_confirmDeleteBlockAreaNotice"]).then(function (data) { overlayService.confirmDelete({ title: data[0], @@ -216,8 +215,6 @@ vm.openArea = null; vm.openAreaOverlay = function (area) { - - // TODO: use the right localization key: localizationService.localize("blockEditor_blockConfigurationOverlayTitle").then(function (localized) { var clonedAreaData = Utilities.copy(area); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridConfigurationAreaEntry.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridConfigurationAreaEntry.component.js index f7c1351c47..64d5e421e2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridConfigurationAreaEntry.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/umbBlockGridConfigurationAreaEntry.component.js @@ -2,9 +2,7 @@ "use strict"; /** - * * Note for new backoffice: there is a lot of similarities between the Area configuration and the Block entry, as they both share Grid scaling features. - * TODO: Can we already as part of this PR make it shared as a dictionary or something? */ @@ -100,6 +98,13 @@ function updateGridLayoutData() { + if(!layoutContainer) { + layoutContainer = $element[0].closest('.umb-block-grid-area-editor__grid-wrapper'); + if(!layoutContainer) { + console.error($element[0], 'could not find area-container'); + } + } + const computedStyles = window.getComputedStyle(layoutContainer); gridColumns = computedStyles.gridTemplateColumns.trim().split("px").map(x => Number(x)); @@ -126,12 +131,6 @@ window.addEventListener('mouseup', vm.onMouseUp); window.addEventListener('mouseleave', vm.onMouseUp); - - layoutContainer = $element[0].closest('.umb-block-grid-area-editor__grid-wrapper'); - if(!layoutContainer) { - console.error($element[0], 'could not find area-container'); - } - updateGridLayoutData(); scaleBoxBackdropEl = document.createElement('div'); @@ -217,6 +216,8 @@ vm.scaleHandlerKeyUp = function($event) { + updateGridLayoutData(); + let addCol = 0; let addRow = 0; @@ -236,7 +237,7 @@ } // Todo: Ensure value fit with configuration. - vm.area.columnSpan = Math.max(vm.area.columnSpan + addCol, 1); + vm.area.columnSpan = Math.min(Math.max(vm.area.columnSpan + addCol, 1), gridColumns.length); vm.area.rowSpan = Math.max(vm.area.rowSpan + addRow, 1); $event.originalEvent.stopPropagation(); From bde2f7c0c383e6245704e401acd566336082a753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Mon, 21 Nov 2022 20:08:12 +0100 Subject: [PATCH 18/24] use custom prop for calculated width (#13451) --- .../src/views/propertyeditors/blockgrid/blockgridui.less | 4 ++-- .../views/propertyeditors/blockgrid/umb-block-grid-entry.html | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less index d66a6bf5c5..ce7dcf3faa 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/blockgridui.less @@ -423,7 +423,7 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl } .umb-block-grid__block--inline-create-button.--above { left: 0; - width: 100%; + width: var(--umb-block-grid-editor--inline-create-width, 100%); top: calc(var(--umb-block-grid--row-gap, 0px) * -0.5); } @@ -435,7 +435,7 @@ ng-form.ng-invalid > .umb-block-grid__block:not(.--active) > .umb-block-grid__bl /* If at root, and full-width then become 40px wider: */ --calc: clamp(0, calc(var(--umb-block-grid--item-column-span) - (var(--umb-block-grid--grid-columns)-1)), 1); left: calc(-20px * var(--calc)); - width: calc(100% + 40px * var(--calc)); + width: calc(var(--umb-block-grid-editor--inline-create-width, 100%) + 40px * var(--calc)); } .umb-block-grid__block--inline-create-button.--after { diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html index 0caebd35c2..d8621f7a5b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umb-block-grid-entry.html @@ -1,7 +1,7 @@ Date: Tue, 22 Nov 2022 04:49:21 +0100 Subject: [PATCH 19/24] Bump engine.io and socket.io in /src/Umbraco.Web.UI.Client Bumps [engine.io](https://github.com/socketio/engine.io) and [socket.io](https://github.com/socketio/socket.io). These dependencies needed to be updated together. Updates `engine.io` from 6.1.3 to 6.2.1 - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/6.1.3...6.2.1) Updates `socket.io` from 4.4.1 to 4.5.3 - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/4.4.1...4.5.3) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect - dependency-name: socket.io dependency-type: indirect ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 189 +++++++------------- 1 file changed, 64 insertions(+), 125 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index dad86ecd05..bee1526b66 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1919,14 +1919,11 @@ "node": ">=4" } }, - "node_modules/@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true }, "node_modules/@tootallnate/once": { "version": "2.0.0", @@ -1951,12 +1948,6 @@ "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.4.tgz", "integrity": "sha512-wPS/ncJWhyxJsndsW1B6Ta8D4mi97x1yItSu+rkLDytU3oRIh2CFAjMuJceYwFAh9+DIohndWM0QBA9OU2Hv0g==" }, - "node_modules/@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -2742,27 +2733,6 @@ "node": ">= 0.6" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/ace-builds": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.10.1.tgz", @@ -6108,9 +6078,9 @@ } }, "node_modules/engine.io": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", - "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -6129,13 +6099,10 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", "dev": true, - "dependencies": { - "@socket.io/base64-arraybuffer": "~1.0.2" - }, "engines": { "node": ">=10.0.0" } @@ -11811,21 +11778,21 @@ } }, "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "dependencies": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -15103,36 +15070,35 @@ "dev": true }, "node_modules/socket.io": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", - "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", - "socket.io-parser": "~4.0.4" + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "node_modules/socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "dependencies": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" }, "engines": { @@ -16701,7 +16667,7 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "engines": { "node": ">= 0.8" @@ -18540,10 +18506,10 @@ "dev": true, "optional": true }, - "@socket.io/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, "@tootallnate/once": { @@ -18563,12 +18529,6 @@ "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.8.4.tgz", "integrity": "sha512-wPS/ncJWhyxJsndsW1B6Ta8D4mi97x1yItSu+rkLDytU3oRIh2CFAjMuJceYwFAh9+DIohndWM0QBA9OU2Hv0g==" }, - "@types/component-emitter": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", - "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", - "dev": true - }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -19346,23 +19306,6 @@ "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" - }, - "dependencies": { - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "dev": true - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dev": true, - "requires": { - "mime-db": "1.51.0" - } - } } }, "ace-builds": { @@ -22086,9 +22029,9 @@ } }, "engine.io": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", - "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", + "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -22113,13 +22056,10 @@ } }, "engine.io-parser": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", - "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", - "dev": true, - "requires": { - "@socket.io/base64-arraybuffer": "~1.0.2" - } + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", + "dev": true }, "ent": { "version": "2.2.0", @@ -26526,18 +26466,18 @@ "dev": true }, "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -28995,33 +28935,32 @@ } }, "socket.io": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", - "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", + "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.2", - "engine.io": "~6.1.0", - "socket.io-adapter": "~2.3.3", - "socket.io-parser": "~4.0.4" + "engine.io": "~6.2.0", + "socket.io-adapter": "~2.4.0", + "socket.io-parser": "~4.2.0" } }, "socket.io-adapter": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", - "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", "dev": true }, "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", + "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", "dev": true, "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", + "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, @@ -30269,7 +30208,7 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, "vinyl": { From 82cd8330eae0e0c73cf277c38114e9e5fed43344 Mon Sep 17 00:00:00 2001 From: niekvanderreest Date: Mon, 21 Nov 2022 14:57:01 +0100 Subject: [PATCH 20/24] Cherry pick #13373 to v10/dev --- .../Persistence/UmbracoDatabase.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs index 3d8f9ac898..5be7cfdde2 100644 --- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs +++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabase.cs @@ -81,6 +81,51 @@ public class UmbracoDatabase : Database, IUmbracoDatabase { Mappers.AddRange(_mapperCollection); } + + InitCommandTimeout(); + } + + // https://github.com/umbraco/Umbraco-CMS/issues/13354 + // This sets the Database Command to connectionString Connection Timeout / Connect Timeout + // This could be better, ideally the UmbracoDatabaseFactory.CreateDatabase() function would set this based on a setting (global or connectionstring setting) + private void InitCommandTimeout() + { + if (CommandTimeout != 0) + { + // CommandTimeout configured elsewhere, so we'll skip + return; + } + + if (Connection is not null && Connection.ConnectionTimeout > 0) + { + CommandTimeout = Connection.ConnectionTimeout; + return; + } + + // get from ConnectionString + var connectionParser = new DbConnectionStringBuilder + { + ConnectionString = ConnectionString + }; + + if (connectionParser.TryGetValue("connection timeout", out var connectionTimeoutString)) + { + if (int.TryParse(connectionTimeoutString.ToString(), out var connectionTimeout)) + { + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connection Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; + return; + } + } + + if (connectionParser.TryGetValue("connect timeout", out var connectTimeoutString)) + { + if (int.TryParse(connectTimeoutString.ToString(), out var connectionTimeout)) + { + _logger.LogTrace("Setting Command Timeout to value configured in connectionstring Connect Timeout : {TimeOut} seconds", connectionTimeout); + CommandTimeout = connectionTimeout; + } + } } #endregion From 22caf2319d052b6fb2a0bbf9faf65d2f120c472d Mon Sep 17 00:00:00 2001 From: nikolajlauridsen Date: Tue, 22 Nov 2022 09:51:34 +0100 Subject: [PATCH 21/24] Bump version --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 47bcc5fc24..60cb23262d 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": "11.0.0-rc4", + "version": "11.0.0-rc5", "assemblyVersion": { "precision": "build" }, From 85842bde9f9d1c827b2e73123b9cace9743b2248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 22 Nov 2022 10:54:43 +0100 Subject: [PATCH 22/24] remove the hidding of catelouge appearance as its not located under advance (#13456) --- src/Umbraco.Core/EmbeddedResources/Lang/da.xml | 4 +--- src/Umbraco.Core/EmbeddedResources/Lang/en.xml | 1 - src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml | 1 - .../prevalue/blockgrid.blockconfiguration.overlay.html | 10 +++------- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml index a374907279..879a6b4a62 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/da.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/da.xml @@ -2248,9 +2248,7 @@ Mange hilsner fra Umbraco robotten Træk for at skalere Tilføj indhold label Overskriv labellen for tilføj indholds knappen i dette område. - Tilføj skalerings muligheder - Tilføj områder - Tilføj katalog udseende + Tilføj skalerings muligheder Tilføj Blok Tilføj gruppe Tilføj gruppe eller Blok diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 4787679027..26e94c0f24 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -2799,7 +2799,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create Button Label Overwrite the label on the create button of this Area. Show resize options - Show catalogue appearance Add Block Add group Pick group or Block diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 9e3fe2305a..160b2416e1 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -2902,7 +2902,6 @@ To manage your website, simply open the Umbraco backoffice and start adding cont Create Button Label Overwrite the label on the create button of this Area. Show resize options - Show catalogue appearance Add Block Add group Pick group or Block diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html index cc22c6d93a..85668c0786 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html @@ -327,12 +327,8 @@
- - -
+
@@ -346,7 +342,7 @@
-
+
@@ -360,7 +356,7 @@
-
+
From 2e54579a2f221e2a3093b8efd23e66ccb8cdb992 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Tue, 22 Nov 2022 12:48:11 +0100 Subject: [PATCH 23/24] Simplify JSON schema, generation, copying and updating (#13427) * Simplify JSON schema and only generate appsettings-schema.Umbraco.Cms.json * Use Umbraco.JsonSchema.Extensions to dynamically add JSON schema references * Move DependentUpon items to shared MSBuild props * Update LangVersion to latest * Update Umbraco.GitVersioning.Extensions to 0.2.0 * Remove JSON schemas on clean * Remove Umbraco.JsonSchema.Core project * Fix JSON schema nullability * Ignore additional JSON schema files in template * Update CompatibilitySuppressions.xml * Remove GlobalSettings.UmbracoPath from JSON schema again * Remove RemoveUmbracoJsonSchemaFiles target * Update Umbraco.JsonSchema.Extensions to 0.2.0 and add weights * Flatten generated JSON schema hierarchy * Remove LicensesSettings from CMS codebase * Change AdditionalParameters to IDictionary --- .gitignore | 2 +- Directory.Build.props | 4 +- src/JsonSchema/AppSettings.cs | 81 ------------------ .../NamespacePrefixedSchemaNameGenerator.cs | 13 --- src/JsonSchema/Options.cs | 16 ---- src/JsonSchema/Program.cs | 49 ----------- src/JsonSchema/UmbracoJsonSchemaGenerator.cs | 83 ------------------- .../UmbracoJsonSchemaGeneratorSettings.cs | 43 ---------- src/JsonSchema/appsettings-schema.json | 61 -------------- .../Umbraco.Cms.Targets.csproj | 38 +++++++-- .../buildTransitive/Umbraco.Cms.Targets.props | 4 + .../Umbraco.Cms.Targets.targets | 34 ++++++-- .../Configuration/Models/GlobalSettings.cs | 4 +- .../Configuration/Models/LicensesSettings.cs | 11 --- .../Models/MarketplaceSettings.cs | 2 +- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 9 -- .../appsettings.Development.template.json | 2 +- src/Umbraco.Web.UI/appsettings.template.json | 2 +- templates/UmbracoProject/.gitignore | 3 +- .../UmbracoProject/UmbracoProject.csproj | 9 -- .../appsettings.Development.json | 2 +- templates/UmbracoProject/appsettings.json | 2 +- tools/Umbraco.JsonSchema/Options.cs | 7 ++ tools/Umbraco.JsonSchema/Program.cs | 14 ++++ .../Umbraco.JsonSchema.csproj | 7 +- tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs | 81 ++++++++++++++++++ .../UmbracoJsonSchemaGenerator.cs | 35 ++++++++ umbraco.sln | 5 +- 28 files changed, 214 insertions(+), 409 deletions(-) delete mode 100644 src/JsonSchema/AppSettings.cs delete mode 100644 src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs delete mode 100644 src/JsonSchema/Options.cs delete mode 100644 src/JsonSchema/Program.cs delete mode 100644 src/JsonSchema/UmbracoJsonSchemaGenerator.cs delete mode 100644 src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs delete mode 100644 src/JsonSchema/appsettings-schema.json delete mode 100644 src/Umbraco.Core/Configuration/Models/LicensesSettings.cs create mode 100644 tools/Umbraco.JsonSchema/Options.cs create mode 100644 tools/Umbraco.JsonSchema/Program.cs rename src/JsonSchema/JsonSchema.csproj => tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj (62%) create mode 100644 tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs create mode 100644 tools/Umbraco.JsonSchema/UmbracoJsonSchemaGenerator.cs diff --git a/.gitignore b/.gitignore index 81c60b6019..9f17b77d05 100644 --- a/.gitignore +++ b/.gitignore @@ -101,7 +101,7 @@ preserve.belle /tests/Umbraco.Tests.UnitTests/[Uu]mbraco/[Dd]ata/TEMP/ # Ignore auto-generated schema -/src/Umbraco.Cms.Targets/appsettings-schema.json +/src/Umbraco.Cms.Targets/tasks/ /src/Umbraco.Cms.Targets/appsettings-schema.*.json /src/Umbraco.Web.UI/appsettings-schema.json /src/Umbraco.Web.UI/appsettings-schema.*.json diff --git a/Directory.Build.props b/Directory.Build.props index dd6f8126b1..37b2e66977 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ net7.0 - preview + latest Umbraco HQ Umbraco Copyright © Umbraco $([System.DateTime]::Today.ToString('yyyy')) @@ -41,7 +41,7 @@ - + diff --git a/src/JsonSchema/AppSettings.cs b/src/JsonSchema/AppSettings.cs deleted file mode 100644 index 6f53541df4..0000000000 --- a/src/JsonSchema/AppSettings.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using Umbraco.Cms.Core.Configuration; -using Umbraco.Cms.Core.Configuration.Models; - -namespace JsonSchema; - -internal class AppSettings -{ - // ReSharper disable once InconsistentNaming - public CmsDefinition? CMS { get; set; } - - /// - /// Configurations for the Umbraco CMS - /// - public class CmsDefinition - { - public ContentSettings? Content { get; set; } - - public CoreDebugSettings? Debug { get; set; } - - public ExceptionFilterSettings? ExceptionFilter { get; set; } - - public ModelsBuilderSettings? ModelsBuilder { get; set; } - - public GlobalSettings? Global { get; set; } - - public HealthChecksSettings? HealthChecks { get; set; } - - public HostingSettings? Hosting { get; set; } - - public ImagingSettings? Imaging { get; set; } - - public IndexCreatorSettings? Examine { get; set; } - - public KeepAliveSettings? KeepAlive { get; set; } - - public LoggingSettings? Logging { get; set; } - - public NuCacheSettings? NuCache { get; set; } - - public RequestHandlerSettings? RequestHandler { get; set; } - - public RuntimeSettings? Runtime { get; set; } - - public SecuritySettings? Security { get; set; } - - public TourSettings? Tours { get; set; } - - public TypeFinderSettings? TypeFinder { get; set; } - - public WebRoutingSettings? WebRouting { get; set; } - - public UmbracoPluginSettings? Plugins { get; set; } - - public UnattendedSettings? Unattended { get; set; } - - public RichTextEditorSettings? RichTextEditor { get; set; } - - public RuntimeMinificationSettings? RuntimeMinification { get; set; } - - public BasicAuthSettings? BasicAuth { get; set; } - - public PackageMigrationSettings? PackageMigration { get; set; } - - public LegacyPasswordMigrationSettings? LegacyPasswordMigration { get; set; } - - public ContentDashboardSettings? ContentDashboard { get; set; } - - public HelpPageSettings? HelpPage { get; set; } - - public InstallDefaultDataSettings? DefaultDataCreation { get; set; } - - public DataTypesSettings? DataTypes { get; set; } - - public LicensesSettings? Licenses { get; set; } - - public MarketplaceSettings? Marketplace { get; set; } - } -} diff --git a/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs b/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs deleted file mode 100644 index 137dd551cf..0000000000 --- a/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using System; -using NJsonSchema.Generation; - -namespace JsonSchema -{ - internal class NamespacePrefixedSchemaNameGenerator : DefaultSchemaNameGenerator - { - public override string Generate(Type type) => type.Namespace?.Replace(".", string.Empty) + base.Generate(type); - } -} diff --git a/src/JsonSchema/Options.cs b/src/JsonSchema/Options.cs deleted file mode 100644 index 7f4ed511a9..0000000000 --- a/src/JsonSchema/Options.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using CommandLine; - -namespace JsonSchema -{ - internal class Options - { - [Option('m', "mainOutputFile", Required = false, HelpText = "Set path of the main output file.", Default = "../../../../Umbraco.Web.UI/appsettings-schema.json")] - public string MainOutputFile { get; set; } = null!; - - [Option('f', "cmsOutputFile", Required = false, HelpText = "Set path of the cms output file.", Default = "../../../../Umbraco.Web.UI/appsettings-schema.umbraco.json")] - public string CmsOutputFile { get; set; } = null!; - } -} diff --git a/src/JsonSchema/Program.cs b/src/JsonSchema/Program.cs deleted file mode 100644 index 12246ceecb..0000000000 --- a/src/JsonSchema/Program.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using System; -using System.IO; -using System.Threading.Tasks; -using CommandLine; - -namespace JsonSchema -{ - internal class Program - { - public static async Task Main(string[] args) - { - try - { - await Parser.Default.ParseArguments(args) - .WithParsedAsync(Execute); - } - catch (Exception e) - { - Console.WriteLine(e); - throw; - } - } - - private static async Task Execute(Options options) - { - var generator = new UmbracoJsonSchemaGenerator(); - - var cmsSchema = await generator.GenerateCmsFile(); - await WriteSchemaToFile(cmsSchema, options.CmsOutputFile); - - var schema = await generator.GenerateMainFile(); - await WriteSchemaToFile(schema, options.MainOutputFile); - } - - private static async Task WriteSchemaToFile(string schema, string filePath) - { - var mainPath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, filePath)); - Console.WriteLine("Path to use {0}", mainPath); - Directory.CreateDirectory(Path.GetDirectoryName(mainPath)!); - Console.WriteLine("Ensured directory exists"); - await File.WriteAllTextAsync(mainPath, schema); - - Console.WriteLine("File written at {0}", mainPath); - } - } -} diff --git a/src/JsonSchema/UmbracoJsonSchemaGenerator.cs b/src/JsonSchema/UmbracoJsonSchemaGenerator.cs deleted file mode 100644 index eeec48bcd7..0000000000 --- a/src/JsonSchema/UmbracoJsonSchemaGenerator.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using Microsoft.Extensions.FileProviders; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using NJsonSchema.Generation; -using Umbraco.Cms.Core.Configuration.Models; - -namespace JsonSchema; - -/// -/// Generator of the JsonSchema for AppSettings.json including A specific Umbraco version. -/// -public class UmbracoJsonSchemaGenerator -{ - private static readonly HttpClient s_client = new(); - private readonly JsonSchemaGenerator _innerGenerator; - - /// - /// Initializes a new instance of the class. - /// - public UmbracoJsonSchemaGenerator() - => _innerGenerator = new JsonSchemaGenerator(new UmbracoJsonSchemaGeneratorSettings()); - - /// - /// Generates a json representing the JsonSchema for AppSettings.json including A specific Umbraco version.. - /// - public async Task GenerateMainFile() - { - JObject officialSchema = await GetOfficialAppSettingsSchema(); - JObject externalFilePoints = GenerateSchemaWithExternalDefinitions(); - - officialSchema.Merge(externalFilePoints); - - return officialSchema.ToString(); - } - - - /// - /// Generates the CMS file - /// - /// - public Task GenerateCmsFile() - { - JObject cmsSchema = GenerateUmbracoSchema(); - - return Task.FromResult(cmsSchema.ToString()); - } - - - - private JObject GenerateSchemaWithExternalDefinitions() - { - var fileProvider = new EmbeddedFileProvider(GetType().Assembly); - - IFileInfo schema = fileProvider.GetFileInfo("appsettings-schema.json"); - - using (Stream? stream = schema.CreateReadStream()) - using (var reader = new StreamReader(stream)) - { - return JsonConvert.DeserializeObject(reader.ReadToEnd())!; - } - } - - private async Task GetOfficialAppSettingsSchema() - { - HttpResponseMessage response = await s_client.GetAsync("https://json.schemastore.org/appsettings.json") - .ConfigureAwait(false); - - var result = await response.Content.ReadAsStringAsync(); - - return JsonConvert.DeserializeObject(result)!; - } - - private JObject GenerateUmbracoSchema() - { - NJsonSchema.JsonSchema schema = _innerGenerator.Generate(typeof(AppSettings)); - - // TODO: when the "UmbracoPath" setter is removed from "GlobalSettings" (scheduled for V12), remove this line as well - schema.Definitions["UmbracoCmsCoreConfigurationModelsGlobalSettings"]?.Properties?.Remove(nameof(GlobalSettings.UmbracoPath));return JsonConvert.DeserializeObject(schema.ToJson())!; - } -} diff --git a/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs b/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs deleted file mode 100644 index 46625aeb2c..0000000000 --- a/src/JsonSchema/UmbracoJsonSchemaGeneratorSettings.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -using System; -using System.Collections.Generic; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Serialization; -using NJsonSchema.Generation; - -namespace JsonSchema -{ - /// - public class UmbracoJsonSchemaGeneratorSettings : JsonSchemaGeneratorSettings - { - /// - /// Initializes a new instance of the class. - /// - public UmbracoJsonSchemaGeneratorSettings() - { - AlwaysAllowAdditionalObjectProperties = true; - SerializerSettings = new JsonSerializerSettings() - { - ContractResolver = new WritablePropertiesOnlyResolver() - }; - DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; - SchemaNameGenerator = new NamespacePrefixedSchemaNameGenerator(); - SerializerSettings.Converters.Add(new StringEnumConverter()); - IgnoreObsoleteProperties = true; - GenerateExamples = true; - } - - private class WritablePropertiesOnlyResolver : DefaultContractResolver - { - protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) - { - IList props = base.CreateProperties(type, memberSerialization); - return props.Where(p => p.Writable).ToList(); - } - } - } -} diff --git a/src/JsonSchema/appsettings-schema.json b/src/JsonSchema/appsettings-schema.json deleted file mode 100644 index 44b006b853..0000000000 --- a/src/JsonSchema/appsettings-schema.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "properties": { - "Umbraco": { - "description": "The container of all Umbraco content", - "oneOf": [ - { - "type": "null" - }, - { - "properties": { - "CMS": { - "description": "Configuration of Umbraco CMS", - "oneOf": [ - { - "type": "null" - }, - { - "$ref": "appsettings-schema.Umbraco.Cms.json#/definitions/JsonSchemaCmsDefinition" - } - ] - }, - "Forms": { - "description": "Configuration of Umbraco Forms", - "oneOf": [ - { - "type": "null" - }, - { - "$ref": "appsettings-schema.Umbraco.Forms.json#/definitions/JsonSchemaFormsDefinition" - } - ] - }, - "Deploy": { - "description": "Configuration of Umbraco Deploy", - "oneOf": [ - { - "type": "null" - }, - { - "$ref": "appsettings-schema.Umbraco.Deploy.json#/definitions/JsonSchemaDeployDefinition" - } - ] - }, - "Workflow": { - "description": "Configuration of Umbraco Workflow", - "oneOf": [ - { - "type": "null" - }, - { - "$ref": "appsettings-schema.Umbraco.Workflow.json#/definitions/JsonSchemaWorkflowDefinition" - } - ] - } - } - } - ] - } - } -} diff --git a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj index b86d4f6e52..056eb09513 100644 --- a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj +++ b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj @@ -16,18 +16,38 @@ - - - + - $(MSBuildThisFileDirectory)appsettings-schema.json - $(MSBuildThisFileDirectory)appsettings-schema.Umbraco.Cms.json - $(MSBuildThisFileDirectory)..\JsonSchema\ + <_UmbracoCmsJsonSchemaReference>appsettings-schema.Umbraco.Cms.json + NU5100;NU5128 - - - + + + + + + + + + + <_UmbracoJsonSchemaExtensionsFiles Include="$(PkgUmbraco_JsonSchema_Extensions)\tasks\netstandard2.0\**" /> + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props index a967c4fd33..6168686bcb 100644 --- a/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props +++ b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.props @@ -9,4 +9,8 @@ + + + + diff --git a/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets index d33f644293..4d6e128b68 100644 --- a/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets +++ b/src/Umbraco.Cms.Targets/buildTransitive/Umbraco.Cms.Targets.targets @@ -1,13 +1,32 @@ - - - <_SchemaFiles Include="$(MSBuildThisFileDirectory)..\appsettings-schema.json" /> - <_SchemaFiles Include="$(MSBuildThisFileDirectory)..\appsettings-schema.Umbraco.Cms.json" /> - - - + + + + appsettings.json + + + appsettings-schema.json + + + + + + + + + + + + + + + + + + + <_AppPluginsFiles Include="App_Plugins\**" /> @@ -15,6 +34,7 @@ + <_UmbracoFolderFiles Include="umbraco\config\**" /> diff --git a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs index 92c443fd77..19b2fb44fb 100644 --- a/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/GlobalSettings.cs @@ -82,8 +82,8 @@ public class GlobalSettings public string UmbracoPath { get => Constants.System.DefaultUmbracoPath; - [Obsolete($"{nameof(UmbracoPath)} is no longer configurable, property setter is scheduled for removal in V12")] - // NOTE: when removing this, also clean up the hardcoded removal of UmbracoPath in UmbracoJsonSchemaGenerator + [Obsolete($"{nameof(UmbracoPath)} is no longer configurable, this property setter is scheduled for removal in V12.")] + // NOTE: When removing this, also clean up the hardcoded removal of UmbracoPath in Umbraco.JsonSchema set { } } diff --git a/src/Umbraco.Core/Configuration/Models/LicensesSettings.cs b/src/Umbraco.Core/Configuration/Models/LicensesSettings.cs deleted file mode 100644 index f8de1d7265..0000000000 --- a/src/Umbraco.Core/Configuration/Models/LicensesSettings.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Umbraco. -// See LICENSE for more details. - -namespace Umbraco.Cms.Core.Configuration.Models; - -/// -/// Typed configuration options for license settings. -/// -public class LicensesSettings : Dictionary -{ -} diff --git a/src/Umbraco.Core/Configuration/Models/MarketplaceSettings.cs b/src/Umbraco.Core/Configuration/Models/MarketplaceSettings.cs index 73f7da185f..092e420e3c 100644 --- a/src/Umbraco.Core/Configuration/Models/MarketplaceSettings.cs +++ b/src/Umbraco.Core/Configuration/Models/MarketplaceSettings.cs @@ -12,5 +12,5 @@ public class MarketplaceSettings /// /// Gets or sets the additional parameters that are sent to the Marketplace. /// - public Dictionary AdditionalParameters { get; set; } = new (); + public IDictionary AdditionalParameters { get; set; } = new Dictionary(); } diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index e1a0831efd..45d32a65ee 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -28,15 +28,6 @@ false - - - appsettings.json - - - appsettings-schema.json - - - diff --git a/src/Umbraco.Web.UI/appsettings.Development.template.json b/src/Umbraco.Web.UI/appsettings.Development.template.json index b2bde5bf2d..b02fdd604a 100644 --- a/src/Umbraco.Web.UI/appsettings.Development.template.json +++ b/src/Umbraco.Web.UI/appsettings.Development.template.json @@ -1,5 +1,5 @@ { - "$schema" : "./appsettings-schema.json", + "$schema": "appsettings-schema.json", "Serilog": { "MinimumLevel": { "Default": "Information", diff --git a/src/Umbraco.Web.UI/appsettings.template.json b/src/Umbraco.Web.UI/appsettings.template.json index b7aa07acf8..c0d6784ac2 100644 --- a/src/Umbraco.Web.UI/appsettings.template.json +++ b/src/Umbraco.Web.UI/appsettings.template.json @@ -1,5 +1,5 @@ { - "$schema": "./appsettings-schema.json", + "$schema": "appsettings-schema.json", "ConnectionStrings": { "umbracoDbDSN": "" }, diff --git a/templates/UmbracoProject/.gitignore b/templates/UmbracoProject/.gitignore index 088126cc3a..1b6f65e6da 100644 --- a/templates/UmbracoProject/.gitignore +++ b/templates/UmbracoProject/.gitignore @@ -459,8 +459,9 @@ $RECYCLE.BIN/ ## Umbraco CMS ## -# JSON schema file for appsettings.json +# JSON schema files for appsettings.json appsettings-schema.json +appsettings-schema.*.json # Packages created from the backoffice (package.xml/package.zip) /umbraco/Data/CreatedPackages/ diff --git a/templates/UmbracoProject/UmbracoProject.csproj b/templates/UmbracoProject/UmbracoProject.csproj index a71d367a7a..00f7c4b6ff 100644 --- a/templates/UmbracoProject/UmbracoProject.csproj +++ b/templates/UmbracoProject/UmbracoProject.csproj @@ -26,15 +26,6 @@ false false - - - - appsettings.json - - - appsettings-schema.json - - diff --git a/templates/UmbracoProject/appsettings.Development.json b/templates/UmbracoProject/appsettings.Development.json index d789f6cd32..17b9f86361 100644 --- a/templates/UmbracoProject/appsettings.Development.json +++ b/templates/UmbracoProject/appsettings.Development.json @@ -1,5 +1,5 @@ { - "$schema": "./appsettings-schema.json", + "$schema": "appsettings-schema.json", "Serilog": { "MinimumLevel": { "Default": "Information" diff --git a/templates/UmbracoProject/appsettings.json b/templates/UmbracoProject/appsettings.json index 85f6c15dc7..f1e53a9e48 100644 --- a/templates/UmbracoProject/appsettings.json +++ b/templates/UmbracoProject/appsettings.json @@ -1,5 +1,5 @@ { - "$schema": "./appsettings-schema.json", + "$schema": "appsettings-schema.json", "Serilog": { "MinimumLevel": { "Default": "Information", diff --git a/tools/Umbraco.JsonSchema/Options.cs b/tools/Umbraco.JsonSchema/Options.cs new file mode 100644 index 0000000000..e2e8793db4 --- /dev/null +++ b/tools/Umbraco.JsonSchema/Options.cs @@ -0,0 +1,7 @@ +using CommandLine; + +internal class Options +{ + [Option("outputFile", Default = "appsettings-schema.Umbraco.Cms.json", HelpText = "Output file to save the generated JSON schema for Umbraco CMS.")] + public string OutputFile { get; set; } = null!; +} diff --git a/tools/Umbraco.JsonSchema/Program.cs b/tools/Umbraco.JsonSchema/Program.cs new file mode 100644 index 0000000000..adf17c5c8c --- /dev/null +++ b/tools/Umbraco.JsonSchema/Program.cs @@ -0,0 +1,14 @@ +using CommandLine; +using Umbraco.Cms.Core.Configuration.Models; + +await Parser.Default.ParseArguments(args).WithParsedAsync(async options => +{ + // Generate CMS schema + var jsonSchemaGenerator = new UmbracoJsonSchemaGenerator(); + var jsonSchema = jsonSchemaGenerator.Generate(typeof(UmbracoCmsSchema)); + + // TODO: When the UmbracoPath setter is removed from GlobalSettings (scheduled for V12), remove this line as well + jsonSchema.Definitions[nameof(GlobalSettings)]?.Properties?.Remove(nameof(GlobalSettings.UmbracoPath)); + + await File.WriteAllTextAsync(options.OutputFile, jsonSchema.ToJson()); +}); diff --git a/src/JsonSchema/JsonSchema.csproj b/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj similarity index 62% rename from src/JsonSchema/JsonSchema.csproj rename to tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj index 36463de3e0..32da8f798a 100644 --- a/src/JsonSchema/JsonSchema.csproj +++ b/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj @@ -8,14 +8,9 @@ - - - - - - + diff --git a/tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs b/tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs new file mode 100644 index 0000000000..86e64d2aa5 --- /dev/null +++ b/tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs @@ -0,0 +1,81 @@ +using Umbraco.Cms.Core.Configuration; +using Umbraco.Cms.Core.Configuration.Models; + +internal class UmbracoCmsSchema +{ + public UmbracoDefinition Umbraco { get; set; } = null!; + + /// + /// Configuration container for all Umbraco products. + /// + public class UmbracoDefinition + { + public UmbracoCmsDefinition CMS { get; set; } = null!; + } + + /// + /// Configuration of Umbraco CMS. + /// + public class UmbracoCmsDefinition + { + public ContentSettings Content { get; set; } = null!; + + public CoreDebugSettings Debug { get; set; } = null!; + + public ExceptionFilterSettings ExceptionFilter { get; set; } = null!; + + public ModelsBuilderSettings ModelsBuilder { get; set; } = null!; + + public GlobalSettings Global { get; set; } = null!; + + public HealthChecksSettings HealthChecks { get; set; } = null!; + + public HostingSettings Hosting { get; set; } = null!; + + public ImagingSettings Imaging { get; set; } = null!; + + public IndexCreatorSettings Examine { get; set; } = null!; + + public KeepAliveSettings KeepAlive { get; set; } = null!; + + public LoggingSettings Logging { get; set; } = null!; + + public NuCacheSettings NuCache { get; set; } = null!; + + public RequestHandlerSettings RequestHandler { get; set; } = null!; + + public RuntimeSettings Runtime { get; set; } = null!; + + public SecuritySettings Security { get; set; } = null!; + + public TourSettings Tours { get; set; } = null!; + + public TypeFinderSettings TypeFinder { get; set; } = null!; + + public WebRoutingSettings WebRouting { get; set; } = null!; + + public UmbracoPluginSettings Plugins { get; set; } = null!; + + public UnattendedSettings Unattended { get; set; } = null!; + + public RichTextEditorSettings RichTextEditor { get; set; } = null!; + + public RuntimeMinificationSettings RuntimeMinification { get; set; } = null!; + + public BasicAuthSettings BasicAuth { get; set; } = null!; + + public PackageMigrationSettings PackageMigration { get; set; } = null!; + + public LegacyPasswordMigrationSettings LegacyPasswordMigration { get; set; } = null!; + + public ContentDashboardSettings ContentDashboard { get; set; } = null!; + + public HelpPageSettings HelpPage { get; set; } = null!; + + public InstallDefaultDataSettings DefaultDataCreation { get; set; } = null!; + + public DataTypesSettings DataTypes { get; set; } = null!; + + public MarketplaceSettings Marketplace { get; set; } = null!; + } +} diff --git a/tools/Umbraco.JsonSchema/UmbracoJsonSchemaGenerator.cs b/tools/Umbraco.JsonSchema/UmbracoJsonSchemaGenerator.cs new file mode 100644 index 0000000000..f1a55479e3 --- /dev/null +++ b/tools/Umbraco.JsonSchema/UmbracoJsonSchemaGenerator.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Serialization; +using NJsonSchema.Generation; + +/// +public class UmbracoJsonSchemaGenerator : JsonSchemaGenerator +{ + /// + /// Initializes a new instance of the class. + /// + public UmbracoJsonSchemaGenerator() + : base(new JsonSchemaGeneratorSettings() + { + AlwaysAllowAdditionalObjectProperties = true, + DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull, + FlattenInheritanceHierarchy = true, + IgnoreObsoleteProperties = true, + SerializerSettings = new JsonSerializerSettings() + { + ContractResolver = new WritablePropertiesOnlyResolver() + } + }) + { + Settings.SerializerSettings.Converters.Add(new StringEnumConverter()); + } + + /// + private class WritablePropertiesOnlyResolver : DefaultContractResolver + { + /// + protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) + => base.CreateProperties(type, memberSerialization).Where(p => p.Writable).ToList(); + } +} diff --git a/umbraco.sln b/umbraco.sln index a98ac5cc0d..f0122909d6 100644 --- a/umbraco.sln +++ b/umbraco.sln @@ -81,7 +81,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Tests.UnitTests", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Web.Common", "src\Umbraco.Web.Common\Umbraco.Web.Common.csproj", "{79E4293D-C92C-4649-AEC8-F1EFD95BDEB1}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonSchema", "src\JsonSchema\JsonSchema.csproj", "{2A5027D9-F71D-4957-929E-F7A56AA1B95A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.JsonSchema", "tools\Umbraco.JsonSchema\Umbraco.JsonSchema.csproj", "{2A5027D9-F71D-4957-929E-F7A56AA1B95A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Persistence.Sqlite", "src\Umbraco.Cms.Persistence.Sqlite\Umbraco.Cms.Persistence.Sqlite.csproj", "{32F6A309-EC1E-4CDB-BA80-C804CF680BEE}" EndProject @@ -156,6 +156,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "styles", "styles", "{EA628A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.Cms.Imaging.ImageSharp", "src\Umbraco.Cms.Imaging.ImageSharp\Umbraco.Cms.Imaging.ImageSharp.csproj", "{C280181E-597B-4AA5-82E7-D7017E928749}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{05878304-40EB-4F84-B40B-91BDB70DE094}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -325,6 +327,7 @@ Global {D6319409-777A-4BD0-93ED-B2DFD805B32C} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} {A499779C-1B3B-48A8-B551-458E582E6E96} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} {9102ABDF-E537-4E46-B525-C9ED4833EED0} = {B5BD12C1-A454-435E-8A46-FF4A364C0382} + {2A5027D9-F71D-4957-929E-F7A56AA1B95A} = {05878304-40EB-4F84-B40B-91BDB70DE094} {05C1D0C8-C592-468F-AF8F-A299B9B3A903} = {6D72A60B-0542-4AA9-A493-DD4179E838A1} {0946531B-F06D-415B-A4E3-6CBFF5DB1C12} = {995D9EFA-8BB1-4333-80AD-C525A06FD984} {CBCE0A1E-BF29-49A6-9581-EAB3587D823A} = {995D9EFA-8BB1-4333-80AD-C525A06FD984} From dc1b10f324635b34a7f52229d52fcd69ddf0a91c Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Tue, 22 Nov 2022 10:57:31 +0100 Subject: [PATCH 24/24] Adjust sorting of block grid editor groups to y-axis only (#13225) fixes https://github.com/umbraco/Umbraco-CMS/issues/13180 --- ...blockgrid.blockconfiguration.controller.js | 76 ++++++++++--------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js index 993088e2eb..85c31dfc6b 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.controller.js @@ -38,12 +38,12 @@ "groupKey": null }; - function BlockConfigurationController($scope, $element, $http, elementTypeResource, overlayService, localizationService, editorService, eventsService, udiService, dataTypeResource, umbRequestHelper) { var unsubscribe = []; - var vm = this; + const vm = this; + vm.openBlock = null; vm.showSampleDataCTA = false; @@ -57,6 +57,7 @@ if (blockGroupModel.value == null) { blockGroupModel.value = []; } + vm.blockGroups = blockGroupModel.value; if (!$scope.model.value) { @@ -72,12 +73,10 @@ }); loadElementTypes(); - } - function loadElementTypes() { - return elementTypeResource.getAll().then(function (elementTypes) { + return elementTypeResource.getAll().then(elementTypes => { vm.elementTypes = elementTypes; }); } @@ -90,13 +89,14 @@ } } } + unsubscribe.push(eventsService.on("editors.documentType.saved", updateUsedElementTypes)); function removeReferencesToElementTypeKey(contentElementTypeKey) { // Clean up references to this one: $scope.model.value.forEach(blockType => { blockType.areas.forEach(area => { - area.specifiedAllowance = area.specifiedAllowance?.filter(allowance => + area.specifiedAllowance = area.specifiedAllowance?.filter(allowance => allowance.elementTypeKey !== contentElementTypeKey ) || []; }); @@ -107,7 +107,7 @@ // Clean up references to this one: $scope.model.value.forEach(blockType => { blockType.areas.forEach(area => { - area.specifiedAllowance = area.specifiedAllowance?.filter(allowance => + area.specifiedAllowance = area.specifiedAllowance?.filter(allowance => allowance.groupKey !== groupKey ) || []; }); @@ -134,27 +134,29 @@ vm.removeBlockByIndex = function (index) { const blockType = $scope.model.value[index]; - if(blockType) { + if (blockType) { $scope.model.value.splice(index, 1); removeReferencesToElementTypeKey(blockType.contentElementTypeKey); } }; const defaultOptions = { - axis: '', tolerance: "pointer", opacity: 0.7, scroll: true }; + vm.groupSortableOptions = { - ...defaultOptions, + ...defaultOptions, + axis: 'y', handle: '.__handle', items: ".umb-block-card-group", cursor: "grabbing", placeholder: 'umb-block-card-group --sortable-placeholder' }; + vm.blockSortableOptions = { - ...defaultOptions, + ...defaultOptions, "ui-floating": true, connectWith: ".umb-block-card-grid", items: "umb-block-card", @@ -170,7 +172,6 @@ } }; - vm.getAvailableElementTypes = function () { return vm.elementTypes.filter(function (type) { return !$scope.model.value.find(function (entry) { @@ -201,18 +202,18 @@ if (node.metaData.isElement === true) { var key = udiService.getKey(node.udi); // If a Block with this ElementType as content already exists, we will emit it as a possible option. - return $scope.model.value.find(function (entry) { + return $scope.model.value.find(function(entry) { return key === entry.contentElementTypeKey; }); } return true; }, filterCssClass: "not-allowed", - select: function (node) { + select: function(node) { vm.addBlockFromElementTypeKey(udiService.getKey(node.udi), groupKey); editorService.close(); }, - close: function () { + close: function() { editorService.close(); }, extraActions: [ @@ -241,13 +242,13 @@ infiniteMode: true, noTemplate: true, isElement: true, - submit: function (model) { - loadElementTypes().then( function () { + submit: function(model) { + loadElementTypes().then(function() { callback(model.documentTypeKey); }); editorService.close(); }, - close: function () { + close: function() { editorService.close(); } }; @@ -261,24 +262,19 @@ $scope.model.value.push(blockType); vm.openBlockOverlay(blockType); - }; - - - - vm.openBlockOverlay = function (block, openAreas) { var elementType = vm.getElementTypeByKey(block.contentElementTypeKey); - if(elementType) { + if (elementType) { localizationService.localize("blockEditor_blockConfigurationOverlayTitle", [elementType.name]).then(function (data) { var clonedBlockData = Utilities.copy(block); vm.openBlock = block; - var overlayModel = { + const overlayModel = { block: clonedBlockData, allBlockTypes: $scope.model.value, allBlockGroups: vm.blockGroups, @@ -291,7 +287,7 @@ submit: function(overlayModel) { loadElementTypes()// lets load elementType again, to ensure we are up to date. TransferProperties(overlayModel.block, block);// transfer properties back to block object. (Doing this cause we dont know if block object is added to model jet, therefor we cant use index or replace the object.) - + overlayModel.close(); }, close: function() { @@ -305,14 +301,24 @@ }); } else { - alert("Cannot be edited cause ElementType does not exist."); + + const overlay = { + close: () => { + overlayService.close() + } + }; + + localizationService.localize("blockEditor_elementTypeDoesNotExist").then(data => { + overlay.content = data; + overlayService.open(overlay); + }); } }; vm.requestRemoveGroup = function(blockGroup) { - if(blockGroup.key) { + if (blockGroup.key) { localizationService.localizeMany(["general_delete", "blockEditor_confirmDeleteBlockGroupMessage", "blockEditor_confirmDeleteBlockGroupNotice"]).then(function (data) { overlayService.confirmDelete({ title: data[0], @@ -331,7 +337,7 @@ return false; } else { - return true; + return true; } } ); @@ -354,10 +360,8 @@ } } - - dataTypeResource.getAll().then(function(dataTypes) { - if(dataTypes.filter(x => x.alias === "Umbraco.BlockGrid").length === 0) { + if (dataTypes.filter(x => x.alias === "Umbraco.BlockGrid").length === 0) { vm.showSampleDataCTA = true; } }); @@ -378,7 +382,7 @@ }; vm.blockGroups.push(sampleGroup); } - + function initSampleBlock(udi, groupKey, options) { const key = udiService.getKey(udi); if ($scope.model.value.find(X => X.contentElementTypeKey === key) === undefined) { @@ -386,7 +390,7 @@ $scope.model.value.push(blockType); } } - + initSampleBlock(data.umbBlockGridDemoHeadlineBlock, sampleGroup.key, {"label": "Headline ({{headline | truncate:true:36}})", "view": "~/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoHeadlineBlock.html"}); initSampleBlock(data.umbBlockGridDemoImageBlock, sampleGroup.key, {"label": "Image", "view": "~/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoImageBlock.html"}); initSampleBlock(data.umbBlockGridDemoRichTextBlock, sampleGroup.key, { "label": "Rich Text ({{richText | ncRichText | truncate:true:36}})", "view": "~/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoRichTextBlock.html"}); @@ -411,10 +415,10 @@ } ]; initSampleBlock(data.umbBlockGridDemoTwoColumnLayoutBlock, sampleGroup.key, {"label": "Two Column Layout", "view": "~/App_Plugins/Umbraco.BlockGridEditor.DefaultCustomViews/umbBlockGridDemoTwoColumnLayoutBlock.html", "allowInAreas": false, "areas": twoColumnLayoutAreas}); - + vm.showSampleDataCTA = false; }); - + }); }