diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec index bb05e91b96..477bb143f9 100644 --- a/build/NuSpecs/UmbracoCms.Core.nuspec +++ b/build/NuSpecs/UmbracoCms.Core.nuspec @@ -41,7 +41,6 @@ - diff --git a/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs b/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs index 724149a01d..b7d9cde9d1 100644 --- a/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs +++ b/src/Umbraco.Examine.Lucene/ExamineLuceneComposer.cs @@ -1,4 +1,5 @@ -using Umbraco.Core; +using System.Runtime.InteropServices; +using Umbraco.Core; using Umbraco.Core.Composing; namespace Umbraco.Examine @@ -10,6 +11,10 @@ namespace Umbraco.Examine { public override void Compose(Composition composition) { + var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + if(!isWindows) return; + + base.Compose(composition); composition.RegisterUnique(); diff --git a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs b/src/Umbraco.Infrastructure/Search/ExamineComposer.cs index e22cef685a..68a1213629 100644 --- a/src/Umbraco.Infrastructure/Search/ExamineComposer.cs +++ b/src/Umbraco.Infrastructure/Search/ExamineComposer.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; -using Examine; -using Umbraco.Core; +using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Models; using Umbraco.Core.PropertyEditors; diff --git a/src/Umbraco.Web.UI.Client/gulp/tasks/views.js b/src/Umbraco.Web.UI.Client/gulp/tasks/views.js index acfe8eb671..ab6d0c8d61 100644 --- a/src/Umbraco.Web.UI.Client/gulp/tasks/views.js +++ b/src/Umbraco.Web.UI.Client/gulp/tasks/views.js @@ -2,6 +2,7 @@ var config = require('../config'); var gulp = require('gulp'); +var rename = require('gulp-rename'); var _ = require('lodash'); var MergeStream = require('merge-stream'); @@ -12,15 +13,19 @@ function views() { _.forEach(config.sources.views, function (group) { - + var task = gulp.src(group.files) + .pipe(rename(function(path) { + path.dirname = path.dirname.toLowerCase(); + path.basename = path.basename.toLowerCase(); + path.extname = path.extname.toLowerCase(); + })); - var task = gulp.src(group.files); - _.forEach(config.roots, function(root){ - console.log("copying " + group.files + " to " + root + config.targets.views + group.folder) - task = task.pipe( gulp.dest(root + config.targets.views + group.folder)); + var destPath = root + config.targets.views + group.folder; + console.log("copying " + group.files + " to " + destPath) + task = task.pipe( gulp.dest(destPath)); }) - + stream.add (task); }); diff --git a/src/Umbraco.Web.UI.Client/gulp/tasks/watchTask.js b/src/Umbraco.Web.UI.Client/gulp/tasks/watchTask.js index 744481391a..7afb8d363f 100644 --- a/src/Umbraco.Web.UI.Client/gulp/tasks/watchTask.js +++ b/src/Umbraco.Web.UI.Client/gulp/tasks/watchTask.js @@ -4,6 +4,7 @@ const config = require('../config'); const {watch, series, parallel, dest, src} = require('gulp'); var _ = require('lodash'); +var rename = require('gulp-rename'); var MergeStream = require('merge-stream'); var processJs = require('../util/processJs'); @@ -12,9 +13,9 @@ var processLess = require('../util/processLess'); var {js} = require('./js'); function watchTask(cb) { - + var watchInterval = 500; - + //Setup a watcher for all groups of JS files _.forEach(config.sources.js, function (group) { if(group.watch !== false) { @@ -36,11 +37,17 @@ function watchTask(cb) { viewWatcher = watch(group.files, { ignoreInitial: true, interval: watchInterval }, parallel( function MoveViewsAndRegenerateJS() { - var task = src(group.files); + var task = src(group.files) + .pipe(rename(function(path) { + path.dirname = path.dirname.toLowerCase(); + path.basename = path.basename.toLowerCase(); + path.extname = path.extname.toLowerCase(); + })); _.forEach(config.roots, function(root){ - console.log("copying " + group.files + " to " + root + config.targets.views + group.folder); - task = task.pipe( dest(root + config.targets.views + group.folder) ); + var destPath = root + config.targets.views + group.folder; + console.log("copying " + group.files + " to " + destPath); + task = task.pipe( dest(destPath) ); }); }, js diff --git a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js index cb583546a5..0d2ca6623b 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/clipboard.service.js @@ -11,13 +11,13 @@ * */ function clipboardService(notificationsService, eventsService, localStorageService, iconHelper) { - + var clearPropertyResolvers = []; - + var STORAGE_KEY = "umbClipboardService"; - + var retriveStorage = function() { if (localStorageService.isSupported === false) { return null; @@ -27,32 +27,32 @@ function clipboardService(notificationsService, eventsService, localStorageServi if (dataString != null) { dataJSON = JSON.parse(dataString); } - + if(dataJSON == null) { dataJSON = new Object(); } - + if(dataJSON.entries === undefined) { dataJSON.entries = []; } - + return dataJSON; } - + var saveStorage = function(storage) { var storageString = JSON.stringify(storage); - + try { var storageJSON = JSON.parse(storageString); localStorageService.set(STORAGE_KEY, storageString); - + eventsService.emit("clipboardService.storageUpdate"); - + return true; } catch(e) { return false; } - + return false; } @@ -86,17 +86,17 @@ function clipboardService(notificationsService, eventsService, localStorageServi var isEntryCompatible = function(entry, type, allowedAliases) { return entry.type === type - && + && ( (entry.alias && allowedAliases.filter(allowedAlias => allowedAlias === entry.alias).length > 0) - || + || (entry.aliases && entry.aliases.filter(entryAlias => allowedAliases.filter(allowedAlias => allowedAlias === entryAlias).length > 0).length === entry.aliases.length) ); } - - + + var service = {}; - + /** * @ngdoc method @@ -160,29 +160,29 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Saves a single JS-object with a type and alias to the clipboard. */ service.copy = function(type, alias, data, displayLabel, displayIcon, uniqueKey, firstLevelClearupMethod) { - + var storage = retriveStorage(); displayLabel = displayLabel || data.name; displayIcon = displayIcon || iconHelper.convertFromLegacyIcon(data.icon); uniqueKey = uniqueKey || data.key || console.error("missing unique key for this content"); - + // remove previous copies of this entry: storage.entries = storage.entries.filter( (entry) => { return entry.unique !== uniqueKey; } ); - - var entry = {unique:uniqueKey, type:type, alias:alias, data:prepareEntryForStorage(data, firstLevelClearupMethod), label:displayLabel, icon:displayIcon}; + + var entry = {unique:uniqueKey, type:type, alias:alias, data:prepareEntryForStorage(data, firstLevelClearupMethod), label:displayLabel, icon:displayIcon, date:Date.now()}; storage.entries.push(entry); - + if (saveStorage(storage) === true) { notificationsService.success("Clipboard", "Copied to clipboard."); } else { notificationsService.error("Clipboard", "Couldnt copy this data to clipboard."); } - + }; @@ -203,32 +203,31 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Saves a single JS-object with a type and alias to the clipboard. */ service.copyArray = function(type, aliases, datas, displayLabel, displayIcon, uniqueKey, firstLevelClearupMethod) { - + var storage = retriveStorage(); - + // Clean up each entry var copiedDatas = datas.map(data => prepareEntryForStorage(data, firstLevelClearupMethod)); - + // remove previous copies of this entry: storage.entries = storage.entries.filter( (entry) => { return entry.unique !== uniqueKey; } ); - - var entry = {unique:uniqueKey, type:type, aliases:aliases, data:copiedDatas, label:displayLabel, icon:displayIcon}; + var entry = {unique:uniqueKey, type:type, aliases:aliases, data:copiedDatas, label:displayLabel, icon:displayIcon, date:Date.now()}; storage.entries.push(entry); - + if (saveStorage(storage) === true) { notificationsService.success("Clipboard", "Copied to clipboard."); } else { notificationsService.error("Clipboard", "Couldnt copy this data to clipboard."); } - + }; - - + + /** * @ngdoc method * @name umbraco.services.supportsCopy#supported @@ -240,7 +239,7 @@ function clipboardService(notificationsService, eventsService, localStorageServi service.isSupported = function() { return localStorageService.isSupported; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#hasEntriesOfType @@ -253,14 +252,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi * Determines whether the current clipboard has entries that match a given type and one of the aliases. */ service.hasEntriesOfType = function(type, aliases) { - + if(service.retriveEntriesOfType(type, aliases).length > 0) { return true; } - + return false; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -268,24 +267,24 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to recive. * @param {string} aliases A array of strings providing the alias of the data you want to recive. - * + * * @description * Returns an array of entries matching the given type and one of the provided aliases. */ service.retriveEntriesOfType = function(type, allowedAliases) { - + var storage = retriveStorage(); - + // Find entries that are fulfilling the criteria for this nodeType and nodeTypesAliases. var filteretEntries = storage.entries.filter( (entry) => { return isEntryCompatible(entry, type, allowedAliases); } ); - + return filteretEntries; }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -293,14 +292,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to recive. * @param {string} aliases A array of strings providing the alias of the data you want to recive. - * + * * @description * Returns an array of data of entries matching the given type and one of the provided aliases. */ service.retriveDataOfType = function(type, aliases) { return service.retriveEntriesOfType(type, aliases).map((x) => x.data); }; - + /** * @ngdoc method * @name umbraco.services.supportsCopy#retriveEntriesOfType @@ -308,12 +307,12 @@ function clipboardService(notificationsService, eventsService, localStorageServi * * @param {string} type A string defining the type of data to remove. * @param {string} aliases A array of strings providing the alias of the data you want to remove. - * + * * @description * Removes entries matching the given type and one of the provided aliases. */ service.clearEntriesOfType = function(type, allowedAliases) { - + var storage = retriveStorage(); // Find entries that are NOT fulfilling the criteria for this nodeType and nodeTypesAliases. @@ -322,14 +321,14 @@ function clipboardService(notificationsService, eventsService, localStorageServi return !isEntryCompatible(entry, type, allowedAliases); } ); - + storage.entries = filteretEntries; saveStorage(storage); }; - - - + + + return service; } diff --git a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js index 2a5d182a59..0907538b24 100644 --- a/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js +++ b/src/Umbraco.Web.UI.Client/src/common/services/navigation.service.js @@ -320,7 +320,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService appState.setGlobalState("showTray", false); }, - /** + /** * @ngdoc method * @name umbraco.services.navigationService#syncTree * @methodOf umbraco.services.navigationService @@ -353,14 +353,14 @@ function navigationService($routeParams, $location, $q, $injector, eventsService }); }, - /** + /** * @ngdoc method * @name umbraco.services.navigationService#hasTree * @methodOf umbraco.services.navigationService * * @description * Checks if a tree with the given alias exists. - * + * * @param {String} treeAlias the tree alias to check */ hasTree: function (treeAlias) { @@ -629,12 +629,12 @@ function navigationService($routeParams, $location, $q, $injector, eventsService getTreeTemplateUrl: function (treeAlias, action) { var packageTreeFolder = treeService.getTreePackageFolder(treeAlias); if (packageTreeFolder) { - return Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + + return (Umbraco.Sys.ServerVariables.umbracoSettings.appPluginsPath + "/" + packageTreeFolder + - "/backoffice/" + treeAlias + "/" + action + ".html"; + "/backoffice/" + treeAlias + "/" + action + ".html").toLowerCase(); } else { - return "views/" + treeAlias + "/" + action + ".html"; + return ("views/" + treeAlias + "/" + action + ".html").toLowerCase();; } }, diff --git a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card-grid.less b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card-grid.less index e4953999fd..58794461df 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card-grid.less +++ b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card-grid.less @@ -9,7 +9,7 @@ /* Grid Setup */ display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - grid-auto-rows: minmax(200px, auto); + grid-auto-rows: minmax(160px, auto); grid-gap: 20px; } diff --git a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.html b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.html index 486bcbda4a..c9cfcb825e 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.html +++ b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.html @@ -1,6 +1,6 @@ -
- +
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.less b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.less index d1cde628e4..3afa32d099 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.less +++ b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umb-block-card.less @@ -75,14 +75,14 @@ umb-block-card { .__info { width: 100%; background-color: #fff; - padding-bottom: 6px; + padding-bottom: 11px;// 10 + 1 to compentiate for the -1 substraction in margin-bottom. .__name { font-weight: bold; font-size: 14px; color: @ui-action-type; margin-left: 16px; - margin-top: 8px; + margin-top: 10px; margin-bottom: -1px; } .__subname { diff --git a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umbBlockCard.component.js b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umbBlockCard.component.js index c0758aa2df..761e7c28ae 100644 --- a/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umbBlockCard.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/components/blockcard/umbBlockCard.component.js @@ -14,9 +14,38 @@ } }); - function BlockCardController() { + function BlockCardController($scope, umbRequestHelper) { var vm = this; + vm.styleBackgroundImage = "none"; + + var unwatch = $scope.$watch("vm.blockConfigModel.thumbnail", (newValue, oldValue) => { + if(newValue !== oldValue) { + vm.updateThumbnail(); + } + }); + + vm.$onInit = function () { + + vm.updateThumbnail(); + + } + vm.$onDestroy = function () { + unwatch(); + } + + vm.updateThumbnail = function () { + if (vm.blockConfigModel.thumbnail == null || vm.blockConfigModel.thumbnail === "") { + vm.styleBackgroundImage = "none"; + return; + } + + var path = umbRequestHelper.convertVirtualToAbsolutePath(vm.blockConfigModel.thumbnail); + if (path.toLowerCase().endsWith(".svg") === false) { + path += "?upscale=false&width=400"; + } + vm.styleBackgroundImage = 'url(\''+path+'\')'; + } } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less index f4d9caa73b..878f6a8ef8 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.less @@ -4,7 +4,7 @@ position: relative; display: inline-flex; width: 100%; - height: auto; + height: 100%; margin-right: 20px; margin-bottom: 20px; diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js index 489c1353ff..d3099154c7 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/umbBlockListPropertyEditor.component.js @@ -456,6 +456,7 @@ blockPickerModel.clipboardItems.push( { type: "elementType", + date: entry.date, pasteData: entry.data, blockConfigModel: modelObject.getScaffoldFromAlias(entry.alias), elementTypeModel: { @@ -471,6 +472,7 @@ blockPickerModel.clipboardItems.push( { type: "elementTypeArray", + date: entry.date, pasteData: entry.data, blockConfigModel: {}, // no block configuration for paste items of elementTypeArray. elementTypeModel: { @@ -481,6 +483,10 @@ ); }); + blockPickerModel.clipboardItems.sort( (a, b) => { + return b.date - a.date + }); + // open block picker overlay editorService.open(blockPickerModel); diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js index 11a3b58c55..4aa1ed2af2 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js @@ -27,7 +27,7 @@ } } } - + clipboardService.registrerClearPropertyResolver(clearNestedContentPropertiesForStorage) @@ -49,7 +49,7 @@ } } } - + clipboardService.registrerClearPropertyResolver(clearInnerNestedContentPropertiesForStorage) }]); @@ -187,7 +187,7 @@ }; vm.openNodeTypePicker = function ($event) { - + if (vm.nodes.length >= vm.maxItems) { return; } @@ -243,6 +243,7 @@ _.each(singleEntriesForPaste, function (entry) { dialog.pasteItems.push({ type: "elementType", + date: entry.date, name: entry.label, data: entry.data, icon: entry.icon @@ -253,6 +254,7 @@ _.each(arrayEntriesForPaste, function (entry) { dialog.pasteItems.push({ type: "elementTypeArray", + date: entry.date, name: entry.label, data: entry.data, icon: entry.icon