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:
@@ -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)" />
|
||||
|
||||
@@ -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>();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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+'\')';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
width: 100%;
|
||||
height: auto;
|
||||
height: 100%;
|
||||
margin-right: 20px;
|
||||
margin-bottom: 20px;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user