Merge remote-tracking branch 'origin/netcore/netcore' into netcore/feature/merge-v8-into-netcore-netcore

# Conflicts:
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.controller.js
This commit is contained in:
Bjarke Berg
2020-08-27 08:39:02 +02:00
14 changed files with 130 additions and 80 deletions

View File

@@ -41,7 +41,6 @@
<dependency id="Microsoft.Extensions.DependencyInjection" version="[3.1.2,3.999999)" />
<dependency id="Microsoft.Extensions.Configuration.Abstractions" version="[3.1.2,3.999999)" />
<dependency id="Microsoft.Extensions.Identity.Stores" version="[3.1.2,3.999999)" />
<dependency id="Microsoft.SourceLink.GitHub" version="[1.0.0,1.999999)" />
<dependency id="MiniProfiler.Shared" version="[4.1.0,4.999999)" />
<dependency id="Newtonsoft.Json" version="[12.0.3,12.999999)" />
<dependency id="NPoco" version="[4.0.2,4.999999)" />

View File

@@ -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<IBackOfficeExamineSearcher, BackOfficeExamineSearcher>();

View File

@@ -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;

View File

@@ -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);
});

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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();;
}
},

View File

@@ -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;
}

View File

@@ -1,6 +1,6 @@
<div class="__showcase" ng-style="{'background-color':vm.blockConfigModel.backgroundColor, 'background-image': vm.blockConfigModel.thumbnail ? 'url('+vm.blockConfigModel.thumbnail+'?upscale=false&width=400)' : 'transparent'}">
<i ng-if="vm.blockConfigModel.thumbnail == null && vm.elementTypeModel.icon" class="__icon {{ vm.elementTypeModel.icon }}" ng-style="{'color':vm.blockConfigModel.iconColor}" aria-hidden="true"></i>
<div class="__showcase" ng-style="{'background-color':vm.blockConfigModel.backgroundColor, 'background-image': vm.styleBackgroundImage}">
<i ng-if="vm.blockConfigModel.thumbnail == null && vm.elementTypeModel.icon" class="__icon {{ vm.elementTypeModel.icon }}" ng-attr-style="{{'color:'+vm.blockConfigModel.iconColor+' !important'}}" aria-hidden="true"></i>
</div>
<div class="__info">
<div class="__name" ng-bind="vm.elementTypeModel.name"></div>

View File

@@ -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 {

View File

@@ -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+'\')';
}
}

View File

@@ -4,7 +4,7 @@
position: relative;
display: inline-flex;
width: 100%;
height: auto;
height: 100%;
margin-right: 20px;
margin-bottom: 20px;

View File

@@ -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);

View File

@@ -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