From ac1d462bc5286114a78b280cd0e58d1f601d9eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 10 Apr 2019 14:52:16 +0200 Subject: [PATCH 01/56] ability to remove tag by pressing delete or backspace --- .../directives/components/tags/umbtagseditor.directive.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js index 40def728ed..7d1def43a8 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tags/umbtagseditor.directive.js @@ -41,6 +41,7 @@ vm.removeTag = removeTag; vm.showPrompt = showPrompt; vm.hidePrompt = hidePrompt; + vm.onKeyUpOnTag = onKeyUpOnTag; vm.htmlId = "t" + String.CreateGuid(); vm.isLoading = true; @@ -272,6 +273,12 @@ vm.promptIsVisible = "-1"; } + function onKeyUpOnTag(tag, $event) { + if ($event.keyCode === 8 || $event.keyCode === 46) { + removeTag(tag); + } + } + // helper method to remove current tags function removeCurrentTagsFromSuggestions(suggestions) { return $.grep(suggestions, function (suggestion) { From f8af9fd895b4af1985167e6813d4b008b6f97117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 10 Apr 2019 14:52:39 +0200 Subject: [PATCH 02/56] correct spacing between properties --- src/Umbraco.Web.UI.Client/src/less/main.less | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/main.less b/src/Umbraco.Web.UI.Client/src/less/main.less index c666a69166..9f9bbce310 100644 --- a/src/Umbraco.Web.UI.Client/src/less/main.less +++ b/src/Umbraco.Web.UI.Client/src/less/main.less @@ -118,7 +118,6 @@ h5.-black { .umb-control-group { border-bottom: 1px solid @gray-11; padding-bottom: 20px; - margin-bottom: 15px !important; } .umb-control-group.-no-border { From 7afd01ff5c15715dcd9b5bde67c93f5ce1b895df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 10 Apr 2019 14:52:54 +0200 Subject: [PATCH 03/56] Styling update for umb-tags --- .../src/less/property-editors.less | 34 +++++++++++++------ .../src/less/typeahead.less | 6 ++-- .../components/tags/umb-tags-editor.html | 2 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 9d2c3301fb..4b86947366 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -851,25 +851,28 @@ // // Tags // -------------------------------------------------- -.umb-tags{ +.umb-tags { border: @inputBorder solid 1px; - padding: 10px; + padding: 5px; + min-height: 54px; font-size: 13px; text-shadow: none; .tag { cursor: default; - margin: 7px; + margin: 10px; padding: 10px; - background: @blueDark; + background: @blueExtraDark; position: relative; - - .icon-trash{ - cursor: pointer; - padding: 2px; - font-size: 12px; + user-select: all; + + .icon-trash { position: relative; - right: -6px; + cursor: pointer; + padding-left: 4px; + font-size: 15px; + right: -2px; + bottom: -1px; } .umb_confirm-action__overlay.-left{ @@ -879,10 +882,19 @@ } } - input{ + input { border: none; background: @white; } + + .twitter-typeahead { + margin: 10px; + margin-top: 16px; + vertical-align: top; + input { + padding-left: 0; + } + } } // diff --git a/src/Umbraco.Web.UI.Client/src/less/typeahead.less b/src/Umbraco.Web.UI.Client/src/less/typeahead.less index 884f44974a..4822605200 100644 --- a/src/Umbraco.Web.UI.Client/src/less/typeahead.less +++ b/src/Umbraco.Web.UI.Client/src/less/typeahead.less @@ -31,8 +31,8 @@ padding: 8px 0; background-color: @white; border: 1px solid @gray-8; - border-radius: 8px; - box-shadow: 0 5px 10px rgba(0,0,0,.2); + border-radius: 3px; + box-shadow: 0 3px 6px rgba(0,0,0,.16); } .tt-suggestion { @@ -44,7 +44,7 @@ .tt-suggestion.tt-cursor { color: @white; - background-color: @turquoise; + background-color: @ui-selected-type-hover; } .tt-suggestion p { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html b/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html index 804a3516f8..9de5726341 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/tags/umb-tags-editor.html @@ -8,7 +8,7 @@ - + From 9ad5dad710e943a677040bf568d4f4a3648d511b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Wed, 10 Apr 2019 14:59:16 +0200 Subject: [PATCH 04/56] additional spacing added --- src/Umbraco.Web.UI.Client/src/less/property-editors.less | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/property-editors.less b/src/Umbraco.Web.UI.Client/src/less/property-editors.less index 4b86947366..a3a45d4001 100644 --- a/src/Umbraco.Web.UI.Client/src/less/property-editors.less +++ b/src/Umbraco.Web.UI.Client/src/less/property-editors.less @@ -861,7 +861,7 @@ .tag { cursor: default; margin: 10px; - padding: 10px; + padding: 10px 15px; background: @blueExtraDark; position: relative; user-select: all; @@ -869,9 +869,9 @@ .icon-trash { position: relative; cursor: pointer; - padding-left: 4px; + padding-left: 2px; font-size: 15px; - right: -2px; + right: -5px; bottom: -1px; } From 3b22480b5d36b75d0e7e8fcd831cf37b9f0bab57 Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Mon, 15 Apr 2019 21:46:09 +0200 Subject: [PATCH 05/56] Update with correct paths --- src/ApiDocs/docfx.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ApiDocs/docfx.json b/src/ApiDocs/docfx.json index 520622a0e0..0d0efe4f66 100644 --- a/src/ApiDocs/docfx.json +++ b/src/ApiDocs/docfx.json @@ -2,7 +2,8 @@ "metadata": [ { "src": [ - { + { + "src": "../", "files": [ "Umbraco.Core/Umbraco.Core.csproj", "Umbraco.Web/Umbraco.Web.csproj" @@ -11,12 +12,11 @@ "**/obj/**", "**/bin/**", "_site/**" - ], - "cwd": "../src" + ] } ], - "dest": "../apidocs/api", - "filter": "../apidocs/docfx.filter.yml" + "dest": "api", + "filter": "docfx.filter.yml" } ], "build": { @@ -72,4 +72,4 @@ "default", "umbracotemplate" ] } -} \ No newline at end of file +} From dba241ef50b8fc7ca8997d82128643b8925ebc64 Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Mon, 15 Apr 2019 22:04:55 +0200 Subject: [PATCH 06/56] Adding build script for API docs --- build/build-docs.ps1 | 119 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 build/build-docs.ps1 diff --git a/build/build-docs.ps1 b/build/build-docs.ps1 new file mode 100644 index 0000000000..c1b2b22f03 --- /dev/null +++ b/build/build-docs.ps1 @@ -0,0 +1,119 @@ +$PSScriptFilePath = (Get-Item $MyInvocation.MyCommand.Path); +$RepoRoot = (get-item $PSScriptFilePath).Directory.Parent.FullName; +$SolutionRoot = Join-Path -Path $RepoRoot "src"; +$ToolsRoot = Join-Path -Path $RepoRoot "\build\temp"; +$DocFx = Join-Path -Path $ToolsRoot "docfx\docfx.exe" +$DocFxFolder = (Join-Path -Path $ToolsRoot "docfx") +$DocFxJson = Join-Path -Path $SolutionRoot "ApiDocs\docfx.json" +$7Zip = Join-Path -Path $ToolsRoot "7za.exe" +$DocFxSiteOutput = Join-Path -Path $SolutionRoot "ApiDocs\_site\*.*" +#$NgDocsSiteOutput = Join-Path -Path $RepoRoot "src\Umbraco.Web.UI.Client\docs\api\*.*" +$ProgFiles86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)"); +$MSBuild = "$ProgFiles86\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" + +<# +################ Do the UI docs + +"Changing to Umbraco.Web.UI.Client folder" +cd .. +cd src\Umbraco.Web.UI.Client +Write-Host $(Get-Location) + +"Creating build folder so MSBuild doesn't run the whole grunt build" +if (-Not (Test-Path "build")) { + md "build" +} + +"Installing node" +# Check if Install-Product exists, should only exist on the build server +if (Get-Command Install-Product -errorAction SilentlyContinue) +{ + Install-Product node '' +} + +"Installing node modules" +& npm install + +"Installing grunt" +& npm install -g grunt-cli + +"Moving back to build folder" +cd .. +cd .. +cd build +Write-Host $(Get-Location) + + & grunt --gruntfile ../src/umbraco.web.ui.client/gruntfile.js docs + +# change baseUrl +$BaseUrl = "https://our.umbraco.org/apidocs/ui/" +$IndexPath = "../src/umbraco.web.ui.client/docs/api/index.html" +(Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath +# zip it + +& $7Zip a -tzip ui-docs.zip $NgDocsSiteOutput -r + +#> + +################ Do the c# docs + +# Build the solution in debug mode +$SolutionPath = Join-Path -Path $SolutionRoot -ChildPath "umbraco.sln" + +# Go get nuget.exe if we don't have it +$NuGet = "$ToolsRoot\nuget.exe" +$FileExists = Test-Path $NuGet +If ($FileExists -eq $False) { + Write-Host "Retrieving nuget.exe..." + $SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" + Invoke-WebRequest $SourceNugetExe -OutFile $NuGet +} + +#restore nuget packages +Write-Host "Restoring nuget packages..." +& $NuGet restore $SolutionPath + +& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount /t:Clean +if (-not $?) +{ + throw "The MSBuild process returned an error code." +} +& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount +if (-not $?) +{ + throw "The MSBuild process returned an error code." +} + +# Go get docfx if we don't have it +$FileExists = Test-Path $DocFx +If ($FileExists -eq $False) { + + If(!(Test-Path $DocFxFolder)) + { + New-Item $DocFxFolder -type directory + } + + Write-Host "Getting docfx..." + $DocFxZip = Join-Path -Path $ToolsRoot "docfx\docfx.zip" + $DocFxSource = "https://github.com/dotnet/docfx/releases/download/v2.41/docfx.zip" + # Create SSL/TLS secure channel to access GitHub API endpoint + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Invoke-WebRequest $DocFxSource -OutFile $DocFxZip + + #unzip it + & $7Zip e $DocFxZip "-o$DocFxFolder" +} + +#clear site +If(Test-Path(Join-Path -Path $RepoRoot "ApiDocs\_site")) +{ + Remove-Item $DocFxSiteOutput -recurse +} + +# run it! +& $DocFx metadata $DocFxJson +& $DocFx $DocFxJson --serve + +# zip it + +& $7Zip a -tzip csharp-docs.zip $DocFxSiteOutput -r \ No newline at end of file From e139fa671984732ba48ffb4897933467a06c8786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 26 Apr 2019 13:22:00 +0200 Subject: [PATCH 07/56] first version of copyService --- .../src/common/services/copy.service.js | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/common/services/copy.service.js diff --git a/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js new file mode 100644 index 0000000000..36b49ed423 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js @@ -0,0 +1,139 @@ +function copyService(notificationsService, eventsService) { + + + var STORAGE_KEY = "uCopyService"; + + var supportsLocalStorage = function () { + var test = "test"; + + try { + window.localStorage.setItem(test, test); + window.localStorage.removeItem(test); + return true; + } catch (e) { + return false; + } + + return false; + } + + var retriveStorage = function() { + if (supportsLocalStorage === false) { + return null; + } + var dataString = window.localStorage.getItem(STORAGE_KEY); + if (dataString == null) { + return null; + } + return JSON.parse(dataString); + } + + var saveStorage = function(storage) { + var storageString = JSON.stringify(storage) + + try { + var storageJSON = JSON.parse(storageString); + window.localStorage.setItem(STORAGE_KEY, storageString); + + eventsService.emit("copyService.storageUpdate"); + + return true; + } catch(e) { + return false; + } + + return false; + } + + + var service = {}; + + /** + * @ngdoc method + * @name umbraco.services.copyService#copy + * @methodOf umbraco.services.copyService + * + * @description + * Saves a JS-object to the LocalStage of copied items. + * + */ + service.copy = function(nodeType, data) { + + var storage = retriveStorage(); + if(storage === null) { + storage = new Object(); + } + + + if(nodeType === "content" || nodeType === "element") { + if(data.contentTypeAlias === undefined) { + // missing contentTypeAlias... then we cant copy jet. + success = false; + } + } + + /** + Will need to store things differently... + + Can we copy real IpublishedContent... + + And should I wrap data into a entry-object knowing about the data type.. + + */ + + delete data.key; + delete data.$$hashKey; + + if(storage.items === undefined) { + storage.items = []; + } + + storage.items.push({nodeType:nodeType, data:data}); + + if (saveStorage(storage) === true) { + notificationsService.success("", "Copied to clipboard."); + } else { + notificationsService.success("", "Couldnt copy this data to clipboard."); + } + + }; + + service.supportsCopy = supportsLocalStorage; + + service.hasDataOfType = function(nodeType, nodeTypeAliases) { + + if(service.retriveDataOfType(nodeType, nodeTypeAliases).length > 0) { + return true; + } + + return false; + }; + + service.retriveDataOfType = function(nodeType, nodeTypeAliases) { + + var storage = retriveStorage(); + + if (storage === null) { + return []; + } + + var itemsOfType = storage.items.filter( + (item) => item.nodeType === nodeType + ); + if (nodeTypeAliases) { + return itemsOfType.filter( + (item) => { + return nodeTypeAliases.filter(alias => alias === item.data.contentTypeAlias).length > 0; + } + ); + } else { + return itemsOfType; + } + + }; + + + + return service; +} +angular.module("umbraco.services").factory("copyService", copyService); From 4d3154c7fa39467b7b180f647c8da887387ef12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 26 Apr 2019 13:34:38 +0200 Subject: [PATCH 08/56] prototype, not working correctly. --- .../components/umbnestedcontent.directive.js | 10 +- .../nestedcontent/nestedcontent.controller.js | 170 +++++++++++------- .../nestedcontent/nestedcontent.html | 6 + 3 files changed, 118 insertions(+), 68 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js index 366294630b..3fe32a0684 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js @@ -12,10 +12,10 @@ $scope.nodeContext = $scope.model; // Find the selected tab - var selectedTab = $scope.model.tabs[0]; + var selectedTab = $scope.model.variants[0].tabs[0]; if ($scope.tabAlias) { - angular.forEach($scope.model.tabs, function (tab) { + angular.forEach($scope.model.variants[0].tabs, function (tab) { if (tab.alias.toLowerCase() === $scope.tabAlias.toLowerCase()) { selectedTab = tab; return; @@ -32,8 +32,10 @@ // Tell inner controls we are submitting $scope.$broadcast("formSubmitting", { scope: $scope }); + console.log("Form Submitting:: ", $scope.ngModel); + // Sync the values back - angular.forEach($scope.ngModel.tabs, function (tab) { + angular.forEach($scope.ngModel.variants[0].tabs, function (tab) { if (tab.alias.toLowerCase() === selectedTab.alias.toLowerCase()) { var localPropsMap = selectedTab.properties.reduce(function (map, obj) { @@ -94,4 +96,4 @@ // }, // link: link // } -//}); \ No newline at end of file +//}); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index a78abf2466..13fc999ac9 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -30,10 +30,10 @@ ncResources.getContentTypes().then(function (docTypes) { $scope.model.docTypes = docTypes; - + // Populate document type tab dictionary docTypes.forEach(function (value) { - $scope.docTypeTabs[value.alias] = value.tabs; + $scope.docTypeTabs[value.alias] = value.variants[0].tabs; }); }); @@ -46,7 +46,6 @@ return docType.alias === c.ncAlias; }); }); - } if (!$scope.model.value) { @@ -65,10 +64,17 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop "contentResource", "localizationService", "iconHelper", - - function ($scope, $interpolate, $filter, $timeout, contentResource, localizationService, iconHelper) { + "copyService", + "eventsService", + + function ($scope, $interpolate, $filter, $timeout, contentResource, localizationService, iconHelper, copyService, eventsService) { var inited = false; + + var contentTypeAliases = []; + _.each($scope.model.config.contentTypes, function (contentType) { + contentTypeAliases.push(contentType.ncAlias); + }); _.each($scope.model.config.contentTypes, function (contentType) { contentType.nameExp = !!contentType.nameTemplate @@ -222,7 +228,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop return name; }; - + $scope.getIcon = function (idx) { var scaffold = $scope.getScaffold($scope.model.value[idx].ncContentTypeAlias); return scaffold && scaffold.icon ? iconHelper.convertFromLegacyIcon(scaffold.icon) : "icon-folder"; @@ -269,7 +275,38 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop return contentType.ncAlias === alias; }); } - + + $scope.showCopy = copyService.supportsCopy(); + + $scope.showPaste = false; + + $scope.clickCopy = function($event, node) { + copyService.copy("elementType", node); + $event.stopPropagation(); + } + + $scope.clickPaste = function($event) { + + var newNode = copyService.retriveDataOfType("elementType", contentTypeAliases).pop(); + + if (newNode === undefined) { + return; + } + + console.log(newNode); + + $scope.nodes.push(newNode); + updatemodel(); + + $scope.currentNode = newNode; + } + + function checkAbilityToPasteContent() { + $scope.showPaste = copyService.hasDataOfType("elementType", contentTypeAliases); + } + + eventsService.on("copyService.storageUpdate", checkAbilityToPasteContent); + var notSupported = [ "Umbraco.Tags", "Umbraco.UploadField", @@ -288,9 +325,9 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop var tab = _.find(tabs, function (tab) { return tab.id !== 0 && (tab.alias.toLowerCase() === contentType.ncTabAlias.toLowerCase() || contentType.ncTabAlias === ""); }); - scaffold.tabs = []; + scaffold.variants[0].tabs = []; if (tab) { - scaffold.tabs.push(tab); + scaffold.variants[0].tabs.push(tab); angular.forEach(tab.properties, function (property) { @@ -319,7 +356,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop if ($scope.model.config.contentTypes.length === scaffoldsLoaded) { // Because we're loading the scaffolds async one at a time, we need to // sort them explicitly according to the sort order defined by the data type. - var contentTypeAliases = []; + contentTypeAliases = []; _.each($scope.model.config.contentTypes, function (contentType) { contentTypeAliases.push(contentType.ncAlias); }); @@ -353,64 +390,85 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop } inited = true; + + checkAbilityToPasteContent(); } } var initNode = function (scaffold, item) { var node = angular.copy(scaffold); - - node.key = item && item.key ? item.key : UUID.generate(); - node.ncContentTypeAlias = scaffold.contentTypeAlias; - - for (var t = 0; t < node.tabs.length; t++) { - var tab = node.tabs[t]; - for (var p = 0; p < tab.properties.length; p++) { - var prop = tab.properties[p]; - prop.propertyAlias = prop.alias; - prop.alias = $scope.model.alias + "___" + prop.alias; - // Force validation to occur server side as this is the - // only way we can have consistency between mandatory and - // regex validation messages. Not ideal, but it works. - prop.validation = { - mandatory: false, - pattern: "" - }; - if (item) { - if (item[prop.propertyAlias]) { + + node.key = item && item.key ? item.key : String.CreateGuid(); + //node.ncContentTypeAlias = scaffold.contentTypeAlias; + + for (var v = 0; v < node.variants.length; v++) { + var variant = node.variants[v]; + + console.log("- variant:", variant); + + for (var t = 0; t < variant.tabs.length; t++) { + var tab = variant.tabs[t]; + + console.log("-- tab:", tab); + + for (var p = 0; p < tab.properties.length; p++) { + var prop = tab.properties[p]; + + console.log("--- prop:", prop.alias, prop.value); + + prop.propertyAlias = prop.alias; + prop.alias = $scope.model.alias + "___" + prop.alias; + // Force validation to occur server side as this is the + // only way we can have consistency between mandatory and + // regex validation messages. Not ideal, but it works. + prop.validation = { + mandatory: false, + pattern: "" + }; + + if (item && item[prop.propertyAlias]) { + + console.log("setting property: ", prop.propertyAlias, item[prop.propertyAlias]); prop.value = item[prop.propertyAlias]; } } } } - + + console.log("initNode node:", node); + $scope.nodes.push(node); return node; } + + function convertNodeIntoNCEntry(node) { + var obj = { + key: node.key, + name: node.name, + ncContentTypeAlias: node.contentTypeAlias + }; + for (var t = 0; t < node.variants[0].tabs.length; t++) { + var tab = node.variants[0].tabs[t]; + for (var p = 0; p < tab.properties.length; p++) { + var prop = tab.properties[p]; + if (typeof prop.value !== "function") { + obj[prop.propertyAlias] = prop.value; + } + } + } + console.log(obj); + return obj; + } - var updateModel = function () { + function updateModel() { if ($scope.realCurrentNode) { $scope.$broadcast("ncSyncVal", { key: $scope.realCurrentNode.key }); } if (inited) { var newValues = []; for (var i = 0; i < $scope.nodes.length; i++) { - var node = $scope.nodes[i]; - var newValue = { - key: node.key, - name: node.name, - ncContentTypeAlias: node.ncContentTypeAlias - }; - for (var t = 0; t < node.tabs.length; t++) { - var tab = node.tabs[t]; - for (var p = 0; p < tab.properties.length; p++) { - var prop = tab.properties[p]; - if (typeof prop.value !== "function") { - newValue[prop.propertyAlias] = prop.value; - } - } - } - newValues.push(newValue); + newValues.push(convertNodeIntoNCEntry($scope.nodes[i])); } $scope.model.value = newValues; } @@ -428,23 +486,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.$on("$destroy", function () { unsubscribe(); }); - - // TODO: Move this into a shared location? - var UUID = (function () { - var self = {}; - var lut = []; for (var i = 0; i < 256; i++) { lut[i] = (i < 16 ? "0" : "") + (i).toString(16); } - self.generate = function () { - var d0 = Math.random() * 0xffffffff | 0; - var d1 = Math.random() * 0xffffffff | 0; - var d2 = Math.random() * 0xffffffff | 0; - var d3 = Math.random() * 0xffffffff | 0; - return lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + "-" + - lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + "-" + lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + "-" + - lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + "-" + lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] + - lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]; - } - return self; - })(); + } ]); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index bca767f650..f257f6dff0 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -21,6 +21,9 @@ + + + @@ -40,6 +43,9 @@ + + + From 48ceb0d41dbacca797fe78b1e8d2e5c845a0bd08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Fri, 26 Apr 2019 15:15:27 +0200 Subject: [PATCH 09/56] working prototype --- .../components/umbnestedcontent.directive.js | 4 +- .../src/common/services/copy.service.js | 51 ++++++++----------- .../nestedcontent/nestedcontent.controller.js | 48 ++++++++--------- 3 files changed, 43 insertions(+), 60 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js index 3fe32a0684..471714d30b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js +++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbnestedcontent.directive.js @@ -3,7 +3,7 @@ function () { var link = function ($scope) { - + // Clone the model because some property editors // do weird things like updating and config values // so we want to ensure we start from a fresh every @@ -31,8 +31,6 @@ // Tell inner controls we are submitting $scope.$broadcast("formSubmitting", { scope: $scope }); - - console.log("Form Submitting:: ", $scope.ngModel); // Sync the values back angular.forEach($scope.ngModel.variants[0].tabs, function (tab) { diff --git a/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js index 36b49ed423..32f23d2525 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js @@ -64,52 +64,38 @@ function copyService(notificationsService, eventsService) { storage = new Object(); } - - if(nodeType === "content" || nodeType === "element") { - if(data.contentTypeAlias === undefined) { - // missing contentTypeAlias... then we cant copy jet. - success = false; - } - } - - /** - Will need to store things differently... - - Can we copy real IpublishedContent... - - And should I wrap data into a entry-object knowing about the data type.. - - */ - - delete data.key; - delete data.$$hashKey; - if(storage.items === undefined) { storage.items = []; } - storage.items.push({nodeType:nodeType, data:data}); + var shallowCloneData = Object.assign({}, data);// Notice only a shallow copy, since we dont need to deep copy. (that will happen when storing the data) + + delete shallowCloneData.key; + delete shallowCloneData.$$hashKey; + + var entry = {nodeType:nodeType, data:shallowCloneData}; + storage.items.push(entry); if (saveStorage(storage) === true) { - notificationsService.success("", "Copied to clipboard."); + notificationsService.success("Clipboard", "Copied to clipboard."); } else { - notificationsService.success("", "Couldnt copy this data to clipboard."); + notificationsService.success("Clipboard", "Couldnt copy this data to clipboard."); } }; service.supportsCopy = supportsLocalStorage; - service.hasDataOfType = function(nodeType, nodeTypeAliases) { + service.hasEntriesOfType = function(nodeType, nodeTypeAliases) { - if(service.retriveDataOfType(nodeType, nodeTypeAliases).length > 0) { + if(service.retriveEntriesOfType(nodeType, nodeTypeAliases).length > 0) { return true; } return false; }; - service.retriveDataOfType = function(nodeType, nodeTypeAliases) { + service.retriveEntriesOfType = function(nodeType, nodeTypeAliases) { var storage = retriveStorage(); @@ -117,19 +103,22 @@ function copyService(notificationsService, eventsService) { return []; } - var itemsOfType = storage.items.filter( + var filteretEntries = storage.items.filter( (item) => item.nodeType === nodeType ); if (nodeTypeAliases) { - return itemsOfType.filter( + filteretEntries = filteretEntries.filter( (item) => { return nodeTypeAliases.filter(alias => alias === item.data.contentTypeAlias).length > 0; } ); - } else { - return itemsOfType; } - + return filteretEntries; + }; + + + service.retriveDataOfType = function(nodeType, nodeTypeAliases) { + return service.retriveEntriesOfType(nodeType, nodeTypeAliases).map((x) => x.data); }; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index 13fc999ac9..cf4ee0dd3e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -113,7 +113,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.addNode = function (alias) { var scaffold = $scope.getScaffold(alias); - var newNode = initNode(scaffold, null); + var newNode = createNode(scaffold, null); $scope.currentNode = newNode; $scope.setDirty(); @@ -224,8 +224,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop if ($scope.nodes[idx].name !== name) { $scope.nodes[idx].name = name; } - - + return name; }; @@ -281,6 +280,9 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.showPaste = false; $scope.clickCopy = function($event, node) { + + syncCurrentNode(); + copyService.copy("elementType", node); $event.stopPropagation(); } @@ -293,16 +295,17 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop return; } - console.log(newNode); + // generate a new key. + newNode.key = String.CreateGuid(); $scope.nodes.push(newNode); - updatemodel(); + //updateModel();// done by setting current node... $scope.currentNode = newNode; } function checkAbilityToPasteContent() { - $scope.showPaste = copyService.hasDataOfType("elementType", contentTypeAliases); + $scope.showPaste = copyService.hasEntriesOfType("elementType", contentTypeAliases); } eventsService.on("copyService.storageUpdate", checkAbilityToPasteContent); @@ -373,7 +376,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop // No such scaffold - the content type might have been deleted. We need to skip it. continue; } - initNode(scaffold, item); + createNode(scaffold, item); } } @@ -394,28 +397,21 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop checkAbilityToPasteContent(); } } - - var initNode = function (scaffold, item) { + + function createNode(scaffold, fromNcEntry) { var node = angular.copy(scaffold); - node.key = item && item.key ? item.key : String.CreateGuid(); - //node.ncContentTypeAlias = scaffold.contentTypeAlias; + node.key = fromNcEntry && fromNcEntry.key ? fromNcEntry.key : String.CreateGuid(); for (var v = 0; v < node.variants.length; v++) { var variant = node.variants[v]; - console.log("- variant:", variant); - for (var t = 0; t < variant.tabs.length; t++) { var tab = variant.tabs[t]; - console.log("-- tab:", tab); - for (var p = 0; p < tab.properties.length; p++) { var prop = tab.properties[p]; - console.log("--- prop:", prop.alias, prop.value); - prop.propertyAlias = prop.alias; prop.alias = $scope.model.alias + "___" + prop.alias; // Force validation to occur server side as this is the @@ -426,17 +422,13 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop pattern: "" }; - if (item && item[prop.propertyAlias]) { - - console.log("setting property: ", prop.propertyAlias, item[prop.propertyAlias]); - prop.value = item[prop.propertyAlias]; + if (fromNcEntry && fromNcEntry[prop.propertyAlias]) { + prop.value = fromNcEntry[prop.propertyAlias]; } } } } - console.log("initNode node:", node); - $scope.nodes.push(node); return node; @@ -457,14 +449,18 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop } } } - console.log(obj); return obj; } - - function updateModel() { + + function syncCurrentNode() { if ($scope.realCurrentNode) { $scope.$broadcast("ncSyncVal", { key: $scope.realCurrentNode.key }); } + } + + function updateModel() { + syncCurrentNode(); + if (inited) { var newValues = []; for (var i = 0; i < $scope.nodes.length; i++) { From 7e064cee83fdb82bc740531c2dcca72399892b2a Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Sun, 28 Apr 2019 21:14:32 +0200 Subject: [PATCH 10/56] Optimizing scripts --- build/build-docs.ps1 | 121 ++++++++----------------------------------- 1 file changed, 23 insertions(+), 98 deletions(-) diff --git a/build/build-docs.ps1 b/build/build-docs.ps1 index c1b2b22f03..15a150ce25 100644 --- a/build/build-docs.ps1 +++ b/build/build-docs.ps1 @@ -1,119 +1,44 @@ -$PSScriptFilePath = (Get-Item $MyInvocation.MyCommand.Path); -$RepoRoot = (get-item $PSScriptFilePath).Directory.Parent.FullName; -$SolutionRoot = Join-Path -Path $RepoRoot "src"; -$ToolsRoot = Join-Path -Path $RepoRoot "\build\temp"; -$DocFx = Join-Path -Path $ToolsRoot "docfx\docfx.exe" -$DocFxFolder = (Join-Path -Path $ToolsRoot "docfx") -$DocFxJson = Join-Path -Path $SolutionRoot "ApiDocs\docfx.json" -$7Zip = Join-Path -Path $ToolsRoot "7za.exe" -$DocFxSiteOutput = Join-Path -Path $SolutionRoot "ApiDocs\_site\*.*" -#$NgDocsSiteOutput = Join-Path -Path $RepoRoot "src\Umbraco.Web.UI.Client\docs\api\*.*" -$ProgFiles86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)"); -$MSBuild = "$ProgFiles86\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\MSBuild.exe" +$uenv=build/build.ps1 -get + +$src = "$($uenv.SolutionRoot)\src" +$tmp = $uenv.BuildTemp +$out = $uenv.BuildOutput +$DocFxJson = "$src\ApiDocs\docfx.json" +$DocFxSiteOutput = "$tmp\_site\*.*" -<# ################ Do the UI docs +$uenv.CompileBelle() -"Changing to Umbraco.Web.UI.Client folder" -cd .. -cd src\Umbraco.Web.UI.Client -Write-Host $(Get-Location) +"Moving to Umbraco.Web.UI.Client folder" +cd .\src\Umbraco.Web.UI.Client -"Creating build folder so MSBuild doesn't run the whole grunt build" -if (-Not (Test-Path "build")) { - md "build" -} - -"Installing node" -# Check if Install-Product exists, should only exist on the build server -if (Get-Command Install-Product -errorAction SilentlyContinue) -{ - Install-Product node '' -} - -"Installing node modules" -& npm install - -"Installing grunt" -& npm install -g grunt-cli - -"Moving back to build folder" -cd .. -cd .. -cd build -Write-Host $(Get-Location) - - & grunt --gruntfile ../src/umbraco.web.ui.client/gruntfile.js docs +"Generating the docs and waiting before executing the next commands" +& gulp docs | Out-Null # change baseUrl $BaseUrl = "https://our.umbraco.org/apidocs/ui/" -$IndexPath = "../src/umbraco.web.ui.client/docs/api/index.html" +$IndexPath = "./docs/api/index.html" (Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath + # zip it +& $uenv.BuildEnv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Client\docs\api\*.*" -& $7Zip a -tzip ui-docs.zip $NgDocsSiteOutput -r - -#> ################ Do the c# docs # Build the solution in debug mode -$SolutionPath = Join-Path -Path $SolutionRoot -ChildPath "umbraco.sln" - -# Go get nuget.exe if we don't have it -$NuGet = "$ToolsRoot\nuget.exe" -$FileExists = Test-Path $NuGet -If ($FileExists -eq $False) { - Write-Host "Retrieving nuget.exe..." - $SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" - Invoke-WebRequest $SourceNugetExe -OutFile $NuGet -} +$SolutionPath = Join-Path -Path $src -ChildPath "umbraco.sln" +#$uenv.CompileUmbraco() #restore nuget packages -Write-Host "Restoring nuget packages..." -& $NuGet restore $SolutionPath +$uenv.RestoreNuGet() -& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount /t:Clean -if (-not $?) -{ - throw "The MSBuild process returned an error code." -} -& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount -if (-not $?) -{ - throw "The MSBuild process returned an error code." -} +# run DocFx +$DocFx = $uenv.BuildEnv.DocFx -# Go get docfx if we don't have it -$FileExists = Test-Path $DocFx -If ($FileExists -eq $False) { - - If(!(Test-Path $DocFxFolder)) - { - New-Item $DocFxFolder -type directory - } - - Write-Host "Getting docfx..." - $DocFxZip = Join-Path -Path $ToolsRoot "docfx\docfx.zip" - $DocFxSource = "https://github.com/dotnet/docfx/releases/download/v2.41/docfx.zip" - # Create SSL/TLS secure channel to access GitHub API endpoint - [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - Invoke-WebRequest $DocFxSource -OutFile $DocFxZip - - #unzip it - & $7Zip e $DocFxZip "-o$DocFxFolder" -} - -#clear site -If(Test-Path(Join-Path -Path $RepoRoot "ApiDocs\_site")) -{ - Remove-Item $DocFxSiteOutput -recurse -} - -# run it! +Write-Host "$DocFxJson" & $DocFx metadata $DocFxJson -& $DocFx $DocFxJson --serve +& $DocFx build $DocFxJson # zip it - -& $7Zip a -tzip csharp-docs.zip $DocFxSiteOutput -r \ No newline at end of file +& $uenv.BuildEnv.Zip a -tzip -r "$out\csharp-docs.zip" $DocFxSiteOutput From 880e86820ef216150b3a10360adf2ae430c7c32b Mon Sep 17 00:00:00 2001 From: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com> Date: Sun, 28 Apr 2019 21:15:59 +0200 Subject: [PATCH 11/56] Updating with correct directory refferences --- src/ApiDocs/docfx.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ApiDocs/docfx.json b/src/ApiDocs/docfx.json index 0d0efe4f66..21f310fec6 100644 --- a/src/ApiDocs/docfx.json +++ b/src/ApiDocs/docfx.json @@ -11,7 +11,7 @@ "exclude": [ "**/obj/**", "**/bin/**", - "_site/**" + "../../build.tmp/_site/**" ] } ], @@ -36,7 +36,7 @@ ], "exclude": [ "obj/**", - "_site/**" + "../../build.tmp/_site/**" ] } ], @@ -47,7 +47,7 @@ ], "exclude": [ "obj/**", - "_site/**" + "../../build.tmp/_site/**" ] } ], @@ -58,7 +58,7 @@ ], "exclude": [ "obj/**", - "_site/**" + "../../build.tmp/_site/**" ] } ], @@ -67,7 +67,7 @@ "_enableSearch": true, "_disableContribution": false }, - "dest": "_site", + "dest": "../../build.tmp/_site", "template": [ "default", "umbracotemplate" ] From 01116e21f44bccf994fcd25ab0e044c4332282cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 12:48:44 +0200 Subject: [PATCH 12/56] finished copy service --- .../src/common/services/copy.service.js | 77 ++++++++++++------- .../nestedcontent/nestedcontent.controller.js | 27 ++++++- 2 files changed, 73 insertions(+), 31 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js index 32f23d2525..abfd6e71e6 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/copy.service.js @@ -21,11 +21,23 @@ function copyService(notificationsService, eventsService) { if (supportsLocalStorage === false) { return null; } + + + var dataJSON; var dataString = window.localStorage.getItem(STORAGE_KEY); - if (dataString == null) { - return null; + if (dataString != null) { + dataJSON = JSON.parse(dataString); } - return JSON.parse(dataString); + + if(dataJSON == null) { + dataJSON = new Object(); + } + + if(dataJSON.entries === undefined) { + dataJSON.entries = []; + } + + return dataJSON; } var saveStorage = function(storage) { @@ -54,27 +66,28 @@ function copyService(notificationsService, eventsService) { * @methodOf umbraco.services.copyService * * @description - * Saves a JS-object to the LocalStage of copied items. + * Saves a JS-object to the LocalStage of copied entries. * */ service.copy = function(nodeType, data) { var storage = retriveStorage(); - if(storage === null) { - storage = new Object(); - } - - if(storage.items === undefined) { - storage.items = []; - } var shallowCloneData = Object.assign({}, data);// Notice only a shallow copy, since we dont need to deep copy. (that will happen when storing the data) - delete shallowCloneData.key; delete shallowCloneData.$$hashKey; - var entry = {nodeType:nodeType, data:shallowCloneData}; - storage.items.push(entry); + var key = data.key || data.$$hashKey || console.error("missing unique key for this content"); + + // remove previous copies of this entry: + storage.entries = storage.entries.filter( + (entry) => { + return entry.unique !== key; + } + ); + + var entry = {unique:key, nodeType:nodeType, data:shallowCloneData}; + storage.entries.push(entry); if (saveStorage(storage) === true) { notificationsService.success("Clipboard", "Copied to clipboard."); @@ -99,28 +112,36 @@ function copyService(notificationsService, eventsService) { var storage = retriveStorage(); - if (storage === null) { - return []; - } - - var filteretEntries = storage.items.filter( - (item) => item.nodeType === nodeType + // Find entries that are furfilling the criterias for this nodeTYpe and nodeTypesAliases. + var filteretEntries = storage.entries.filter( + (entry) => { + return (entry.nodeType === nodeType && nodeTypeAliases.filter(alias => alias === entry.data.contentTypeAlias).length > 0); + } ); - if (nodeTypeAliases) { - filteretEntries = filteretEntries.filter( - (item) => { - return nodeTypeAliases.filter(alias => alias === item.data.contentTypeAlias).length > 0; - } - ); - } + return filteretEntries; }; - service.retriveDataOfType = function(nodeType, nodeTypeAliases) { return service.retriveEntriesOfType(nodeType, nodeTypeAliases).map((x) => x.data); }; + service.clearEntriesOfType = function(nodeType, nodeTypeAliases) { + + var storage = retriveStorage(); + + // Find entries that are NOT furfilling the criterias for this nodeTYpe and nodeTypesAliases. + var filteretEntries = storage.entries.filter( + (entry) => { + return !(entry.nodeType === nodeType && nodeTypeAliases.filter(alias => alias === entry.data.contentTypeAlias).length > 0); + } + ); + + storage.entries = filteretEntries; + + saveStorage(storage); + }; + return service; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index cf4ee0dd3e..b47cd4566a 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -158,13 +158,29 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop if ($scope.overlayMenu.availableItems.length === 0) { return; } - - if ($scope.overlayMenu.availableItems.length === 1) { + + $scope.overlayMenu.pasteItems = []; + var availableNodesForPaste = copyService.retriveDataOfType("elementType", contentTypeAliases); + _.each(availableNodesForPaste, function (node) { + $scope.overlayMenu.pasteItems.push({ + alias: node.contentTypeAlias, + name: node.name, //contentTypeName + icon: iconHelper.convertFromLegacyIcon(node.icon) + }); + }); + $scope.overlayMenu.clickClearPaste = function($event) { + $event.stopPropagation(); + $event.preventDefault(); + copyService.clearEntriesOfType("elementType", contentTypeAliases); + $scope.overlayMenu.pasteItems = [];// This dialog is not connected via the copyService events, so we need to update manually. + }; + + if ($scope.overlayMenu.availableItems.length === 1 && $scope.overlayMenu.pasteItems.length === 0) { // only one scaffold type - no need to display the picker $scope.addNode($scope.scaffolds[0].contentTypeAlias); return; } - + $scope.overlayMenu.show = true; }; @@ -290,6 +306,11 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.clickPaste = function($event) { var newNode = copyService.retriveDataOfType("elementType", contentTypeAliases).pop(); + $scope.pasteFromClipboard(newNode); + + } + + $scope.pasteFromClipboard = function(newNode) { if (newNode === undefined) { return; From 90912a4b2abfe7ceda5fac874e2e51013d8d1078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 12:49:37 +0200 Subject: [PATCH 13/56] restyled umb-overlay + added paste features in nested-content create-overlay --- src/Umbraco.Web.UI.Client/src/less/belle.less | 1 + .../src/less/components/card.less | 53 ++++++++----- .../src/less/components/overlays.less | 79 ++++++++++--------- .../components/overlays/umb-itempicker.less | 3 + .../itempicker/itempicker.html | 8 +- .../macropicker/macropicker.html | 6 +- .../overlays/itempicker/itempicker.html | 32 +++++++- .../mediatypepicker/mediatypepicker.html | 6 +- src/Umbraco.Web.UI/Umbraco/config/lang/da.xml | 4 +- src/Umbraco.Web.UI/Umbraco/config/lang/en.xml | 4 +- .../Umbraco/config/lang/en_us.xml | 4 +- 11 files changed, 129 insertions(+), 71 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/less/components/overlays/umb-itempicker.less diff --git a/src/Umbraco.Web.UI.Client/src/less/belle.less b/src/Umbraco.Web.UI.Client/src/less/belle.less index 4c86f3289b..fed890cab6 100644 --- a/src/Umbraco.Web.UI.Client/src/less/belle.less +++ b/src/Umbraco.Web.UI.Client/src/less/belle.less @@ -129,6 +129,7 @@ @import "components/tooltip/umb-tooltip.less"; @import "components/tooltip/umb-tooltip-list.less"; @import "components/overlays/umb-overlay-backdrop.less"; +@import "components/overlays/umb-itempicker.less"; @import "components/umb-grid.less"; @import "components/umb-empty-state.less"; @import "components/umb-property-editor.less"; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/card.less b/src/Umbraco.Web.UI.Client/src/less/components/card.less index 0f4f2a7a9d..c6a9212b3e 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/card.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/card.less @@ -6,6 +6,7 @@ position: relative; padding: 5px 10px 5px 10px; background: white; + width: 100%; .title{padding: 12px; color: @gray-3; border-bottom: 1px solid @gray-8; font-weight: 400; font-size: 16px; text-transform: none; margin: 0 -10px 10px -10px;} @@ -84,20 +85,20 @@ padding: 0; margin: 0 auto; list-style: none; - + width: 100%; + display: flex; flex-flow: row wrap; justify-content: flex-start; } .umb-card-grid li { - padding: 5px; overflow: hidden; font-size: 12px; text-align: center; - width: 100px; box-sizing: border-box; position: relative; + width: 100px; } .umb-card-grid li.-four-in-row { @@ -111,36 +112,46 @@ } .umb-card-grid .umb-card-grid-item { + position: relative; display: block; width: 100%; - height: 100%; + //height: 100%; + padding-top: 100%; border-radius: 3px; - padding-bottom: 5px; + transition: background-color 120ms; + + > span { + position: absolute; + top: 10px; + bottom: 10px; + left: 10px; + right: 10px; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + background-color: transparent; + } } - .umb-card-grid .umb-card-grid-item:hover, - .umb-card-grid .umb-card-grid-item:focus, - .umb-card-grid .umb-card-grid-item:hover > *, - .umb-card-grid .umb-card-grid-item:focus > * { - background: @ui-option-hover; +.umb-card-grid .umb-card-grid-item:hover, +.umb-card-grid .umb-card-grid-item:focus { + background-color: @ui-option-hover; color: @ui-option-type-hover; - cursor: pointer; - outline: none; - border-radius: 3px; } .umb-card-grid a { - color: @ui-option-type; - text-decoration: none; - } + color: @ui-option-type; + text-decoration: none; +} .umb-card-grid i { - font-size: 30px; - line-height: 50px; - display: block; - color: @ui-option-type; - } + font-size: 30px; + line-height: 20px; + margin-bottom: 10px; + display: block; +} .umb-card-grid .umb-card-grid-item__loading { position: absolute; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less index 9205dc9c5f..a089463a2d 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/overlays.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays.less @@ -5,13 +5,13 @@ z-index: @zindexUmbOverlay; animation: fadeIn 0.2s; box-shadow: 0 10px 50px rgba(0,0,0,0.1), 0 6px 20px rgba(0,0,0,0.16); + text-align: left; } .umb-overlay__form { display: flex; flex-wrap: nowrap; flex-direction: column; - height: 100%; } .umb-overlay .umb-overlay-header { @@ -19,37 +19,61 @@ border-bottom: 1px solid @purple-l3; //background: @blueExtraDark; //color:@u-white; - padding: 10px; margin-top: 0; flex-grow: 0; flex-shrink: 0; + + padding: 20px 30px 0; } -.umb-overlay .umb-overlay__title { + +.umb-overlay__section-header { + width: 100%; + margin-top:30px; + margin-bottom: 10px; + + h5 { + display: inline; + } + + button { + display: inline; + float: right; + background-color: transparent; + border:none; + &:hover { + color: @ui-option-type-hover; + } + } +} + +.umb-overlay__title { font-size: @fontSizeLarge; color: @black; font-weight: bold; margin: 7px 0; } -.umb-overlay .umb-overlay__subtitle { +.umb-overlay__subtitle { font-size: @fontSizeSmall; color: @gray-3; margin: 0; } -.umb-overlay .umb-overlay-container { +.umb-overlay-container { flex-grow: 1; flex-shrink: 1; flex-basis: auto; - overflow-y: auto; - overflow-x: hidden; position: relative; - height: auto; + + padding: 0px 30px; + margin-bottom: 10px; + max-height: calc(100vh - 170px); + overflow-y: auto; } -.umb-overlay .umb-overlay-drawer { +.umb-overlay-drawer { flex-grow: 0; flex-shrink: 0; flex-basis: 31px; @@ -60,16 +84,16 @@ border-top: 1px solid @purple-l3; } -.umb-overlay .umb-overlay-drawer.-auto-height { +.umb-overlay-drawer.-auto-height { flex-basis: auto; } -.umb-overlay .umb-overlay-drawer .umb-overlay-drawer__align-right { +.umb-overlay-drawer .umb-overlay-drawer__align-right { display: flex; justify-content: flex-end; } -.umb-overlay .umb-overlay-drawer .umb-overlay-drawer-content .dropdown-menu { +.umb-overlay-drawer .umb-overlay-drawer-content .dropdown-menu { right: 0; left: auto; } @@ -89,27 +113,23 @@ .umb-overlay.umb-overlay-center .umb-overlay-header { border: none; background: transparent; - padding: 20px 20px 0 20px; + padding: 30px 30px 0; } .umb-overlay.umb-overlay-center .umb-overlay__form { - max-height: 80vh; -} - -.umb-overlay.umb-overlay-center .umb-overlay-container { - padding: 20px; + } .umb-overlay.umb-overlay-center .umb-overlay-drawer { border: none; background: transparent; - padding: 0 20px 20px 20px; + padding: 0 30px 20px; } /* ---------- OVERLAY TARGET ---------- */ .umb-overlay.umb-overlay-target { width: 400px; - height: 400px; + max-height: 100vh; box-sizing: border-box; border-radius: @baseBorderRadius; } @@ -117,18 +137,12 @@ .umb-overlay.umb-overlay-target .umb-overlay-header { border: none; background: transparent; - padding: 20px 20px 0 20px; - text-align: center; -} - -.umb-overlay.umb-overlay-target .umb-overlay-container { - padding: 20px; } .umb-overlay.umb-overlay-target .umb-overlay-drawer { border: none; background: transparent; - padding: 0 20px 20px 20px; + padding: 0 30px 20px; } /* ---------- OVERLAY RIGHT ---------- */ @@ -143,14 +157,9 @@ .umb-overlay.umb-overlay-right .umb-overlay-header { flex-basis: 100px; - padding: 20px; box-sizing: border-box; } -.umb-overlay.umb-overlay-right .umb-overlay-container { - padding: 20px; -} - // reset the top position to 0 because we are in a asbolute container and want to // overlay to go all the way to the top .umb-editors .umb-overlay.umb-overlay-right { @@ -175,14 +184,10 @@ .umb-overlay.umb-overlay-left .umb-overlay-header { flex-basis: 100px; - padding: 20px; + padding: 30px 30px 0; box-sizing: border-box; } -.umb-overlay.umb-overlay-left .umb-overlay-container { - padding: 20px; -} - @media (max-width: 767px) { .umb-overlay.umb-overlay-left { margin-left: 61px; diff --git a/src/Umbraco.Web.UI.Client/src/less/components/overlays/umb-itempicker.less b/src/Umbraco.Web.UI.Client/src/less/components/overlays/umb-itempicker.less new file mode 100644 index 0000000000..010ff4636d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/less/components/overlays/umb-itempicker.less @@ -0,0 +1,3 @@ +.umb-itempicker .form-search { + margin-top:10px; +} diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html index 80d4baff6e..aaefd80250 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/itempicker/itempicker.html @@ -23,14 +23,16 @@ umb-auto-focus no-dirty-check /> - + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html index 1e75a4ba06..53a2858c62 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/macropicker/macropicker.html @@ -34,8 +34,10 @@ ng-click="selectMacro(availableItem)" class="-three-in-row"> - - {{ availableItem.name }} + + + {{ availableItem.name }} + diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html index 328344ea84..e08cba6063 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html @@ -1,4 +1,4 @@ -
+
+
+
Paste from clipboard
+ +
+ + + +
+
Create new
+
+ diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediatypepicker/mediatypepicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediatypepicker/mediatypepicker.html index bd37800717..e7b5dddee1 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediatypepicker/mediatypepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/mediatypepicker/mediatypepicker.html @@ -6,8 +6,10 @@ ng-click="select(mediatype)" class="-three-in-row"> - - {{ mediatype.name }} + + + {{ mediatype.name }} + diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml index 7cc7c7823a..d33962e221 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/da.xml @@ -283,7 +283,9 @@ Klar til at udgive? Klar til at gemme? Send til godkendelse - Vælg dato og klokkeslæt for at udgive og/eller afpublicere indholdet. + Vælg dato og klokkeslæt for at udgive og/eller afpublicere indholdet. + Opret ny + Indsæt fra udklipsmappen Opret en ny indholdsskabelon fra '%0%' diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml index 78fe096bd1..416c8901db 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en.xml @@ -292,7 +292,9 @@ Ready to Publish? Ready to Save? Send for approval - Select the date and time to publish and/or unpublish the content item. + Select the date and time to publish and/or unpublish the content item. + Create new + Paste from clipboard Create a new Content Template from '%0%' diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index 4e13407a4c..3b36a5e596 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -49,7 +49,9 @@ Set permissions Unlock Create Content Template - Resend Invitation + Resend Invitation + Create new + Paste from clipboard Content From 5d7aa4bcf5812564621098be49543be05c6c7bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 13:34:35 +0200 Subject: [PATCH 14/56] remove edit and paste button. --- .../views/propertyeditors/nestedcontent/nestedcontent.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index f257f6dff0..4ae1f7df8d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -12,9 +12,6 @@
- - - @@ -43,9 +40,6 @@ - - -
From 77407a94460bc467b5e2ab3cd113f24dabaaa26e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 13:39:17 +0200 Subject: [PATCH 15/56] correcting text --- .../src/views/common/overlays/itempicker/itempicker.html | 2 +- .../propertyeditors/nestedcontent/nestedcontent.controller.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html index e08cba6063..c7461cdf78 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html @@ -13,7 +13,7 @@
Paste from clipboard
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index b47cd4566a..b97cbadd8d 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -99,7 +99,7 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop $scope.wideMode = Object.toBoolean($scope.model.config.hideLabel); $scope.labels = {}; - localizationService.localizeMany(["grid_insertControl"]).then(function(data) { + localizationService.localizeMany(["grid_addElement"]).then(function(data) { $scope.labels.docTypePickerTitle = data[0]; }); From 18c7680bafbea9fbee383c16b9953932cd4c38ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 13:53:06 +0200 Subject: [PATCH 16/56] remove unused CSS --- .../src/less/components/umb-nested-content.less | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less index eec23869b5..78cb9410d3 100644 --- a/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less +++ b/src/Umbraco.Web.UI.Client/src/less/components/umb-nested-content.less @@ -223,16 +223,6 @@ display: none !important; } -.umb-nested-content__help-text { - display: inline-block; - padding: 10px 20px 10px 20px; - clear: both; - font-size: 14px; - color: @gray-3; - background: @gray-10; - border-radius: 15px; -} - .umb-nested-content__doctypepicker table input, .umb-nested-content__doctypepicker table select { width: 100%; From 8e925c930b0b581b90b0498e3c7bcbc7df1cf7fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 14:05:20 +0200 Subject: [PATCH 17/56] sort items by dragging the item header --- .../nestedcontent/nestedcontent.controller.js | 7 +++++-- .../propertyeditors/nestedcontent/nestedcontent.html | 9 +++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index b97cbadd8d..f64ed84131 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -248,11 +248,14 @@ angular.module("umbraco").controller("Umbraco.PropertyEditors.NestedContent.Prop var scaffold = $scope.getScaffold($scope.model.value[idx].ncContentTypeAlias); return scaffold && scaffold.icon ? iconHelper.convertFromLegacyIcon(scaffold.icon) : "icon-folder"; } - $scope.sortableOptions = { axis: "y", cursor: "move", - handle: ".umb-nested-content__icon--move", + handle:'.umb-nested-content__header-bar', + distance: 10, + opacity: 0.7, + tolerance: "pointer", + scroll: true, start: function (ev, ui) { updateModel(); // Yea, yea, we shouldn't modify the dom, sue me diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html index 0c6f2bb415..851ce44959 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.html @@ -3,18 +3,15 @@ ng-class="{'umb-nested-content--narrow':!wideMode, 'umb-nested-content--wide':wideMode}"> -
+
-
+
- - - @@ -25,7 +22,7 @@
-
+
From 85456bbb9b6aa16b995b5d49c0660d912e2bfddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 14:59:34 +0200 Subject: [PATCH 18/56] correct lang file --- src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml index 3b36a5e596..a147fd4b28 100644 --- a/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml +++ b/src/Umbraco.Web.UI/Umbraco/config/lang/en_us.xml @@ -49,9 +49,7 @@ Set permissions Unlock Create Content Template - Resend Invitation - Create new - Paste from clipboard + Resend Invitation Content @@ -296,7 +294,9 @@ Ready to Publish? Ready to Save? Send for approval - Select the date and time to publish and/or unpublish the content item. + Select the date and time to publish and/or unpublish the content item. + Create new + Paste from clipboard Create a new Content Template from '%0%' @@ -1406,7 +1406,7 @@ To manage your website, simply open the Umbraco back office and start adding con User %0% was deleted Invite user Invitation has been re-sent to %0% - Cannot publish the document since the required '%0%' is not published + Cannot publish the document since the required '%0%' is not published Validation failed for language '%0%' Document type was exported to file An error occurred while exporting the document type From 85905f7a771096b4926208668ee0ff40b02b6b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 15:00:31 +0200 Subject: [PATCH 19/56] fix variant error for collection tabs --- .../datatypepicker/datatypepicker.html | 30 ++++++++++++------- .../nestedcontent/nestedcontent.controller.js | 5 ++-- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/datatypepicker/datatypepicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/datatypepicker/datatypepicker.html index 43933f8051..2755e689b7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/datatypepicker/datatypepicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/datatypepicker/datatypepicker.html @@ -33,9 +33,9 @@
- @@ -49,8 +49,10 @@ ng-click="vm.pickEditor(systemDataType)" class="-four-in-row"> - - {{ systemDataType.name }} + + + {{ systemDataType.name }} + @@ -69,8 +71,10 @@
- - {{ dataType.name }} + + + {{ dataType.name }} + @@ -93,8 +97,10 @@
- - {{ dataType.name }} + + + {{ dataType.name }} + @@ -110,8 +116,10 @@ ng-click="vm.pickEditor(systemDataType)" class="-four-in-row"> - - {{ systemDataType.name }} + + + {{ systemDataType.name }} + diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index f64ed84131..b53e0c4313 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -12,8 +12,7 @@ ncAlias: "", ncTabAlias: "", nameTemplate: "" - } - ); + }); } $scope.remove = function (index) { @@ -33,7 +32,7 @@ // Populate document type tab dictionary docTypes.forEach(function (value) { - $scope.docTypeTabs[value.alias] = value.variants[0].tabs; + $scope.docTypeTabs[value.alias] = value.tabs; }); }); From ab2f0c3a1cf7f50edabfe101f209378503a13189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20Lyngs=C3=B8?= Date: Tue, 30 Apr 2019 15:00:52 +0200 Subject: [PATCH 20/56] go to four lines if more than 6 items in Item-picker --- .../src/views/common/overlays/itempicker/itempicker.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html index c7461cdf78..50766ab983 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/common/overlays/itempicker/itempicker.html @@ -38,7 +38,7 @@