diff --git a/build/NuSpecs/UmbracoCms.Web.nuspec b/build/NuSpecs/UmbracoCms.Web.nuspec
index 47aab4cdb8..1aeead52a5 100644
--- a/build/NuSpecs/UmbracoCms.Web.nuspec
+++ b/build/NuSpecs/UmbracoCms.Web.nuspec
@@ -33,6 +33,7 @@
+
diff --git a/src/Umbraco.Configuration/Legacy/GlobalSettings.cs b/src/Umbraco.Configuration/Legacy/GlobalSettings.cs
index d93297ca90..fabe95f5bd 100644
--- a/src/Umbraco.Configuration/Legacy/GlobalSettings.cs
+++ b/src/Umbraco.Configuration/Legacy/GlobalSettings.cs
@@ -146,6 +146,9 @@ namespace Umbraco.Core.Configuration.Legacy
}
}
+
+
+
///
/// Gets or sets the configuration status. This will return the version number of the currently installed umbraco instance.
///
@@ -315,6 +318,15 @@ namespace Umbraco.Core.Configuration.Legacy
private string _databaseFactoryServerVersion;
public string DatabaseFactoryServerVersion => GetterWithDefaultValue(Constants.AppSettings.Debug.DatabaseFactoryServerVersion, string.Empty, ref _databaseFactoryServerVersion);
+
+
+ private string _iconsPath;
+ ///
+ /// Gets the path to folder containing the icons used in the umbraco backoffice (/umbraco/assets/icons by default).
+ ///
+ /// The icons path.
+ public string IconsPath => GetterWithDefaultValue(Constants.AppSettings.IconsPath, $"{UmbracoPath}/assets/icons", ref _iconsPath);
+
private string _mainDomLock;
public string MainDomLock => GetterWithDefaultValue(Constants.AppSettings.MainDomLock, string.Empty, ref _mainDomLock);
diff --git a/src/Umbraco.Configuration/Models/GlobalSettings.cs b/src/Umbraco.Configuration/Models/GlobalSettings.cs
index d1f3f12017..02b73d1196 100644
--- a/src/Umbraco.Configuration/Models/GlobalSettings.cs
+++ b/src/Umbraco.Configuration/Models/GlobalSettings.cs
@@ -47,6 +47,8 @@ namespace Umbraco.Configuration.Models
public bool UseHttps => _configuration.GetValue(Prefix + "UseHttps", false);
public int VersionCheckPeriod => _configuration.GetValue(Prefix + "VersionCheckPeriod", 7);
public string UmbracoPath => _configuration.GetValue(Prefix + "UmbracoPath", "~/umbraco");
+ public string IconsPath => _configuration.GetValue(Prefix + "IconsPath", $"{UmbracoPath}/assets/icons");
+
public string UmbracoCssPath => _configuration.GetValue(Prefix + "UmbracoCssPath", "~/css");
public string UmbracoScriptsPath =>
diff --git a/src/Umbraco.Core/Configuration/IGlobalSettings.cs b/src/Umbraco.Core/Configuration/IGlobalSettings.cs
index bf963bcec7..26d833613f 100644
--- a/src/Umbraco.Core/Configuration/IGlobalSettings.cs
+++ b/src/Umbraco.Core/Configuration/IGlobalSettings.cs
@@ -20,6 +20,16 @@
/// The reserved paths.
string ReservedPaths { get; }
+ ///
+ /// Gets the path to umbraco's icons directory (/umbraco/assets/icons by default).
+ ///
+ string IconsPath { get; }
+
+ ///
+ /// Gets or sets the configuration status. This will return the version number of the currently installed umbraco instance.
+ ///
+ string ConfigurationStatus { get; set; }
+
///
/// Gets the time out in minutes.
///
diff --git a/src/Umbraco.Core/Constants-AppSettings.cs b/src/Umbraco.Core/Constants-AppSettings.cs
index 94370930de..36d471b950 100644
--- a/src/Umbraco.Core/Constants-AppSettings.cs
+++ b/src/Umbraco.Core/Constants-AppSettings.cs
@@ -41,15 +41,20 @@ namespace Umbraco.Core
public const string ConfigurationStatus = "Umbraco.Core.ConfigurationStatus";
///
- /// Gets the path to umbraco's root directory (/umbraco by default).
+ /// The path to umbraco's root directory (/umbraco by default).
///
public const string UmbracoPath = "Umbraco.Core.Path";
+ ///
+ /// Gets the path to umbraco's icons directory (/umbraco/assets/icons by default).
+ ///
+ public const string IconsPath = "Umbraco.Icons.Path";
+
///
/// The reserved urls from web.config.
///
public const string ReservedUrls = "Umbraco.Core.ReservedUrls";
-
+
///
/// The path of the stylesheet folder.
///
diff --git a/src/Umbraco.Core/Constants-SvgSanitizer.cs b/src/Umbraco.Core/Constants-SvgSanitizer.cs
new file mode 100644
index 0000000000..447ea66668
--- /dev/null
+++ b/src/Umbraco.Core/Constants-SvgSanitizer.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+
+namespace Umbraco.Core
+{
+ public static partial class Constants
+ {
+ ///
+ /// Defines the alias identifiers for Umbraco's core application sections.
+ ///
+ public static class SvgSanitizer
+ {
+ ///
+ /// Allowlist for SVG attributes.
+ ///
+ public static readonly IList Attributes = new [] { "accent-height", "accumulate", "additive", "alignment-baseline", "allowReorder", "alphabetic", "amplitude", "arabic-form", "ascent", "attributeName", "attributeType", "autoReverse", "azimuth", "baseFrequency", "baseline-shift", "baseProfile", "bbox", "begin", "bias", "by", "calcMode", "cap-height", "class", "clip", "clipPathUnits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "contentScriptType", "contentStyleType", "cursor", "cx", "cy", "d", "decelerate", "descent", "diffuseConstant", "direction", "display", "divisor", "dominant-baseline", "dur", "dx", "dy", "edgeMode", "elevation", "enable-background", "end", "exponent", "externalResourcesRequired", "Section", "fill", "fill-opacity", "fill-rule", "filter", "filterRes", "filterUnits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "format", "from", "fr", "fx", "fy", "g1", "g2", "glyph-name", "glyph-orientation-horizontal", "glyph-orientation-vertical", "glyphRef", "gradientTransform", "gradientUnits", "hanging", "height", "href", "hreflang", "horiz-adv-x", "horiz-origin-x", "ISection", "id", "ideographic", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kernelMatrix", "kernelUnitLength", "kerning", "keyPoints", "keySplines", "keyTimes", "lang", "lengthAdjust", "letter-spacing", "lighting-color", "limitingConeAngle", "local", "MSection", "marker-end", "marker-mid", "marker-start", "markerHeight", "markerUnits", "markerWidth", "mask", "maskContentUnits", "maskUnits", "mathematical", "max", "media", "method", "min", "mode", "NSection", "name", "numOctaves", "offset", "opacity", "operator", "order", "orient", "orientation", "origin", "overflow", "overline-position", "overline-thickness", "panose-1", "paint-order", "path", "pathLength", "patternContentUnits", "patternTransform", "patternUnits", "ping", "pointer-events", "points", "pointsAtX", "pointsAtY", "pointsAtZ", "preserveAlpha", "preserveAspectRatio", "primitiveUnits", "r", "radius", "referrerPolicy", "refX", "refY", "rel", "rendering-intent", "repeatCount", "repeatDur", "requiredExtensions", "requiredFeatures", "restart", "result", "rotate", "rx", "ry", "scale", "seed", "shape-rendering", "slope", "spacing", "specularConstant", "specularExponent", "speed", "spreadMethod", "startOffset", "stdDeviation", "stemh", "stemv", "stitchTiles", "stop-color", "stop-opacity", "strikethrough-position", "strikethrough-thickness", "string", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "surfaceScale", "systemLanguage", "tabindex", "tableValues", "target", "targetX", "targetY", "text-anchor", "text-decoration", "text-rendering", "textLength", "to", "transform", "type", "u1", "u2", "underline-position", "underline-thickness", "unicode", "unicode-bidi", "unicode-range", "units-per-em", "v-alphabetic", "v-hanging", "v-ideographic", "v-mathematical", "values", "vector-effect", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "viewBox", "viewTarget", "visibility", "width", "widths", "word-spacing", "writing-mode", "x", "x-height", "x1", "x2", "xChannelSelector", "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "y", "y1", "y2", "yChannelSelector", "z", "zoomAndPan" };
+
+ ///
+ /// Allowlist for SVG tabs.
+ ///
+ public static readonly IList Tags = new [] { "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "discard", "ellipse", "feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignObject", "g", "glyph", "glyphRef", "hatch", "hatchpath", "hkern", "image", "line", "linearGradient", "marker", "mask", "mesh", "meshgradient", "meshpatch", "meshrow", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "set", "solidcolor", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "unknown", "use", "view", "vkern" };
+ }
+ }
+}
diff --git a/src/Umbraco.Core/Constants-SystemDirectories.cs b/src/Umbraco.Core/Constants-SystemDirectories.cs
index e33247be63..53e14bb6ec 100644
--- a/src/Umbraco.Core/Constants-SystemDirectories.cs
+++ b/src/Umbraco.Core/Constants-SystemDirectories.cs
@@ -31,6 +31,8 @@
public const string Packages = Data + "/packages";
public const string Preview = Data + "/preview";
+
+ public const string LogFiles= "~/Logs";
}
}
}
diff --git a/src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs b/src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs
index 5ff1744ea2..4252a29567 100644
--- a/src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs
+++ b/src/Umbraco.Core/Models/ContentEditing/PropertyTypeBasic.cs
@@ -48,6 +48,14 @@ namespace Umbraco.Web.Models.ContentEditing
[ReadOnly(true)]
public Guid DataTypeKey { get; set; }
+ [DataMember(Name = "dataTypeName")]
+ [ReadOnly(true)]
+ public string DataTypeName { get; set; }
+
+ [DataMember(Name = "dataTypeIcon")]
+ [ReadOnly(true)]
+ public string DataTypeIcon { get; set; }
+
//SD: Is this really needed ?
[DataMember(Name = "groupId")]
public int GroupId { get; set; }
diff --git a/src/Umbraco.Core/Models/IconModel.cs b/src/Umbraco.Core/Models/IconModel.cs
new file mode 100644
index 0000000000..5c79ad6219
--- /dev/null
+++ b/src/Umbraco.Core/Models/IconModel.cs
@@ -0,0 +1,8 @@
+namespace Umbraco.Web.Models
+{
+ public class IconModel
+ {
+ public string Name { get; set; }
+ public string SvgString { get; set; }
+ }
+}
diff --git a/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs
index 9c75c051bd..d63b1bb9db 100644
--- a/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs
+++ b/src/Umbraco.Core/Persistence/Repositories/IMemberGroupRepository.cs
@@ -1,10 +1,18 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using Umbraco.Core.Models;
namespace Umbraco.Core.Persistence.Repositories
{
public interface IMemberGroupRepository : IReadWriteQueryRepository
{
+ ///
+ /// Gets a member group by it's uniqueId
+ ///
+ ///
+ ///
+ IMemberGroup Get(Guid uniqueId);
+
///
/// Gets a member group by it's name
///
diff --git a/src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs b/src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs
index 4039a0e3a2..fa8eb830b0 100644
--- a/src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs
+++ b/src/Umbraco.Core/PropertyEditors/EmailAddressConfiguration.cs
@@ -1,4 +1,5 @@
-using Umbraco.Core.PropertyEditors;
+using System;
+using Umbraco.Core.PropertyEditors;
namespace Umbraco.Web.PropertyEditors
{
@@ -7,7 +8,8 @@ namespace Umbraco.Web.PropertyEditors
///
public class EmailAddressConfiguration
{
- [ConfigurationField("IsRequired", "Required?", "boolean")]
+ [ConfigurationField("IsRequired", "Required?", "hidden", Description = "Deprecated; Make this required by selecting mandatory when adding to the document type")]
+ [Obsolete("No longer used, use `Mandatory` for the property instead. Will be removed in the next major version")]
public bool IsRequired { get; set; }
}
}
diff --git a/src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs b/src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs
index a584ea2a9c..2ec0438328 100644
--- a/src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs
+++ b/src/Umbraco.Core/PropertyEditors/PropertyValueConverterBase.cs
@@ -4,35 +4,43 @@ using Umbraco.Core.Models.PublishedContent;
namespace Umbraco.Core.PropertyEditors
{
///
- /// Provides a default overridable implementation for that does nothing.
+ /// Provides a default implementation for .
///
+ ///
public abstract class PropertyValueConverterBase : IPropertyValueConverter
{
+ ///
public virtual bool IsConverter(IPublishedPropertyType propertyType)
=> false;
+ ///
public virtual bool? IsValue(object value, PropertyValueLevel level)
{
switch (level)
{
case PropertyValueLevel.Source:
- return value != null && (!(value is string) || string.IsNullOrWhiteSpace((string) value) == false);
+ // the default implementation uses the old magic null & string comparisons,
+ // other implementations may be more clever, and/or test the final converted object values
+ return value != null && (!(value is string stringValue) || !string.IsNullOrWhiteSpace(stringValue));
+ case PropertyValueLevel.Inter:
+ return null;
+ case PropertyValueLevel.Object:
+ return null;
default:
throw new NotSupportedException($"Invalid level: {level}.");
}
}
+ [Obsolete("This method is not part of the IPropertyValueConverter contract, therefore not used and will be removed in future versions; use IsValue instead.")]
public virtual bool HasValue(IPublishedProperty property, string culture, string segment)
{
- // the default implementation uses the old magic null & string comparisons,
- // other implementations may be more clever, and/or test the final converted object values
var value = property.GetSourceValue(culture, segment);
- return value != null && (!(value is string) || string.IsNullOrWhiteSpace((string) value) == false);
+ return value != null && (!(value is string stringValue) || !string.IsNullOrWhiteSpace(stringValue));
}
///
public virtual Type GetPropertyValueType(IPublishedPropertyType propertyType)
- => typeof (object);
+ => typeof(object);
///
public virtual PropertyCacheLevel GetPropertyCacheLevel(IPublishedPropertyType propertyType)
diff --git a/src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs b/src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs
index c6b3953e8c..03973cfc90 100644
--- a/src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs
+++ b/src/Umbraco.Core/PropertyEditors/TrueFalseConfiguration.cs
@@ -7,10 +7,16 @@ namespace Umbraco.Web.PropertyEditors
///
public class TrueFalseConfiguration
{
- [ConfigurationField("default", "Default Value", "boolean")]
- public string Default { get; set; } // TODO: well, true or false?!
+ [ConfigurationField("default", "Initial State", "boolean", Description = "The initial state for the toggle, when it is displayed for the first time in the backoffice, eg. for a new content item.")]
+ public bool Default { get; set; }
- [ConfigurationField("labelOn", "Write a label text", "textstring")]
- public string Label { get; set; }
+ [ConfigurationField("showLabels", "Show toggle labels", "boolean", Description = "Show labels next to toggle button.")]
+ public bool ShowLabels { get; set; }
+
+ [ConfigurationField("labelOn", "Label On", "textstring", Description = "Label text when enabled.")]
+ public string LabelOn { get; set; }
+
+ [ConfigurationField("labelOff", "Label Off", "textstring", Description = "Label text when disabled.")]
+ public string LabelOff { get; set; }
}
}
diff --git a/src/Umbraco.Core/Scheduling/TempFileCleanup.cs b/src/Umbraco.Core/Scheduling/TempFileCleanup.cs
index 90bf4ee9eb..6ac1ff61fe 100644
--- a/src/Umbraco.Core/Scheduling/TempFileCleanup.cs
+++ b/src/Umbraco.Core/Scheduling/TempFileCleanup.cs
@@ -51,6 +51,7 @@ namespace Umbraco.Web.Scheduling
if (!dir.Exists)
{
_logger.Debug("The cleanup folder doesn't exist {Folder}", dir.FullName);
+ return;
}
var files = dir.GetFiles("*.*", SearchOption.AllDirectories);
@@ -60,6 +61,7 @@ namespace Umbraco.Web.Scheduling
{
try
{
+ file.IsReadOnly = false;
file.Delete();
}
catch (Exception ex)
diff --git a/src/Umbraco.Core/Services/IMemberGroupService.cs b/src/Umbraco.Core/Services/IMemberGroupService.cs
index 6a554aad31..9261dcfdf6 100644
--- a/src/Umbraco.Core/Services/IMemberGroupService.cs
+++ b/src/Umbraco.Core/Services/IMemberGroupService.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using Umbraco.Core.Models;
namespace Umbraco.Core.Services
@@ -7,6 +8,7 @@ namespace Umbraco.Core.Services
{
IEnumerable GetAll();
IMemberGroup GetById(int id);
+ IMemberGroup GetById(Guid id);
IEnumerable GetByIds(IEnumerable ids);
IMemberGroup GetByName(string name);
void Save(IMemberGroup memberGroup, bool raiseEvents = true);
diff --git a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
index c4e7f264fb..24800fa98a 100644
--- a/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
+++ b/src/Umbraco.Examine.Lucene/BackOfficeExamineSearcher.cs
@@ -113,6 +113,9 @@ namespace Umbraco.Examine
var allLangs = _languageService.GetAllLanguages().Select(x => x.IsoCode.ToLowerInvariant()).ToList();
+ // the chars [*-_] in the query will mess everything up so let's remove those
+ query = Regex.Replace(query, "[\\*\\-_]", "");
+
//check if text is surrounded by single or double quotes, if so, then exact match
var surroundedByQuotes = Regex.IsMatch(query, "^\".*?\"$")
|| Regex.IsMatch(query, "^\'.*?\'$");
diff --git a/src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs b/src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs
index dfcc401ea3..f2e028e6de 100644
--- a/src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs
+++ b/src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs
@@ -7,6 +7,7 @@ using Serilog.Core;
using Serilog.Events;
using Serilog.Formatting;
using Serilog.Formatting.Compact;
+using Umbraco.Core.IO;
using Umbraco.Core.Hosting;
using Umbraco.Core.Logging.Serilog.Enrichers;
@@ -22,7 +23,7 @@ namespace Umbraco.Core.Logging.Serilog
/// It is highly recommended that you keep/use this default in your own logging config customizations
///
/// A Serilog LoggerConfiguration
- ///
+ ///
///
public static LoggerConfiguration MinimalConfiguration(
this LoggerConfiguration logConfig,
@@ -33,15 +34,15 @@ namespace Umbraco.Core.Logging.Serilog
//Set this environment variable - so that it can be used in external config file
//add key="serilog:write-to:RollingFile.pathFormat" value="%BASEDIR%\logs\log.txt" />
+ Environment.SetEnvironmentVariable("BASEDIR", hostingEnvironment.MapPathContentRoot("/").TrimEnd("\\"), EnvironmentVariableTarget.Process);
Environment.SetEnvironmentVariable("UMBLOGDIR", loggingConfiguration.LogDirectory, EnvironmentVariableTarget.Process);
- Environment.SetEnvironmentVariable("BASEDIR", hostingEnvironment.ApplicationPhysicalPath, EnvironmentVariableTarget.Process);
- Environment.SetEnvironmentVariable("MACHINENAME", Environment.MachineName, EnvironmentVariableTarget.Process);
+ Environment.SetEnvironmentVariable("MACHINENAME", Environment.MachineName, EnvironmentVariableTarget.Process);
logConfig.MinimumLevel.Verbose() //Set to highest level of logging (as any sinks may want to restrict it to Errors only)
.Enrich.WithProcessId()
.Enrich.WithProcessName()
.Enrich.WithThreadId()
- .Enrich.WithProperty(AppDomainId, AppDomain.CurrentDomain.Id)
+ .Enrich.WithProperty(AppDomainId, AppDomain.CurrentDomain.Id)
.Enrich.WithProperty("AppDomainAppId", hostingEnvironment.ApplicationId.ReplaceNonAlphanumericChars(string.Empty))
.Enrich.WithProperty("MachineName", Environment.MachineName)
.Enrich.With()
@@ -57,11 +58,14 @@ namespace Umbraco.Core.Logging.Serilog
///
/// The log level you wish the JSON file to collect - default is Verbose (highest)
/// The number of days to keep log files. Default is set to null which means all logs are kept
- public static LoggerConfiguration OutputDefaultTextFile(this LoggerConfiguration logConfig, ILoggingConfiguration loggingConfiguration, LogEventLevel minimumLevel = LogEventLevel.Verbose, int? retainedFileCount = null)
+ public static LoggerConfiguration OutputDefaultTextFile(
+ this LoggerConfiguration logConfig,
+ IHostingEnvironment hostingEnvironment,
+ ILoggingConfiguration loggingConfiguration, LogEventLevel minimumLevel = LogEventLevel.Verbose, int? retainedFileCount = null)
{
//Main .txt logfile - in similar format to older Log4Net output
//Ends with ..txt as Date is inserted before file extension substring
- logConfig.WriteTo.File(Path.Combine(loggingConfiguration.LogDirectory, $@"UmbracoTraceLog.{Environment.MachineName}..txt"),
+ logConfig.WriteTo.File(Path.Combine(hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.LogFiles), $"UmbracoTraceLog.{Environment.MachineName}..txt"),
shared: true,
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: minimumLevel,
@@ -115,11 +119,15 @@ namespace Umbraco.Core.Logging.Serilog
///
/// The log level you wish the JSON file to collect - default is Verbose (highest)
/// The number of days to keep log files. Default is set to null which means all logs are kept
- public static LoggerConfiguration OutputDefaultJsonFile(this LoggerConfiguration logConfig, ILoggingConfiguration loggingConfiguration, LogEventLevel minimumLevel = LogEventLevel.Verbose, int? retainedFileCount = null)
+ public static LoggerConfiguration OutputDefaultJsonFile(
+ this LoggerConfiguration logConfig,
+ IHostingEnvironment hostingEnvironment,
+ ILoggingConfiguration loggingConfiguration, LogEventLevel minimumLevel = LogEventLevel.Verbose, int? retainedFileCount = null)
{
//.clef format (Compact log event format, that can be imported into local SEQ & will make searching/filtering logs easier)
//Ends with ..txt as Date is inserted before file extension substring
- logConfig.WriteTo.File(new CompactJsonFormatter(), Path.Combine(loggingConfiguration.LogDirectory, $@"UmbracoTraceLog.{Environment.MachineName}..json"),
+ logConfig.WriteTo.File(new CompactJsonFormatter(),
+ Path.Combine(hostingEnvironment.MapPathContentRoot(Constants.SystemDirectories.LogFiles) ,$"UmbracoTraceLog.{Environment.MachineName}..json"),
shared: true,
rollingInterval: RollingInterval.Day, //Create a new JSON file every day
retainedFileCountLimit: retainedFileCount, //Setting to null means we keep all files - default is 31 days
diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/SerilogJsonLogViewer.cs b/src/Umbraco.Infrastructure/Logging/Viewer/SerilogJsonLogViewer.cs
index 366a0fb9de..5bf079c1b4 100644
--- a/src/Umbraco.Infrastructure/Logging/Viewer/SerilogJsonLogViewer.cs
+++ b/src/Umbraco.Infrastructure/Logging/Viewer/SerilogJsonLogViewer.cs
@@ -5,8 +5,6 @@ using System.Linq;
using Newtonsoft.Json;
using Serilog.Events;
using Serilog.Formatting.Compact.Reader;
-using Umbraco.Core.Hosting;
-using Umbraco.Core.IO;
namespace Umbraco.Core.Logging.Viewer
{
diff --git a/src/Umbraco.Infrastructure/Models/ContentEditing/EntityBasic.cs b/src/Umbraco.Infrastructure/Models/ContentEditing/EntityBasic.cs
index 512bc1517d..4776983687 100644
--- a/src/Umbraco.Infrastructure/Models/ContentEditing/EntityBasic.cs
+++ b/src/Umbraco.Infrastructure/Models/ContentEditing/EntityBasic.cs
@@ -61,8 +61,7 @@ namespace Umbraco.Web.Models.ContentEditing
/// The path of the entity
///
[DataMember(Name = "path")]
- public string Path { get; set; }
-
+ public string Path { get; set; }
///
/// A collection of extra data that is available for this specific entity/entity type
///
diff --git a/src/Umbraco.Infrastructure/Models/ContentEditing/MediaItemDisplay.cs b/src/Umbraco.Infrastructure/Models/ContentEditing/MediaItemDisplay.cs
index 0118645b60..a5d538c6ac 100644
--- a/src/Umbraco.Infrastructure/Models/ContentEditing/MediaItemDisplay.cs
+++ b/src/Umbraco.Infrastructure/Models/ContentEditing/MediaItemDisplay.cs
@@ -7,7 +7,7 @@ using Umbraco.Core.Models.ContentEditing;
namespace Umbraco.Web.Models.ContentEditing
{
///
- /// A model representing a content item to be displayed in the back office
+ /// A model representing a media item to be displayed in the back office
///
[DataContract(Name = "content", Namespace = "")]
public class MediaItemDisplay : ListViewAwareContentItemDisplayBase
diff --git a/src/Umbraco.Infrastructure/Models/ContentEditing/MemberDisplay.cs b/src/Umbraco.Infrastructure/Models/ContentEditing/MemberDisplay.cs
index 2f53f6f73b..8c97925403 100644
--- a/src/Umbraco.Infrastructure/Models/ContentEditing/MemberDisplay.cs
+++ b/src/Umbraco.Infrastructure/Models/ContentEditing/MemberDisplay.cs
@@ -18,6 +18,9 @@ namespace Umbraco.Web.Models.ContentEditing
ContentApps = new List();
}
+ [DataMember(Name = "contentType")]
+ public ContentTypeBasic ContentType { get; set; }
+
[DataMember(Name = "username")]
public string Username { get; set; }
diff --git a/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs
index 9341b2f756..75a64c7b1e 100644
--- a/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs
+++ b/src/Umbraco.Infrastructure/Models/Mapping/ContentTypeMapDefinition.cs
@@ -356,7 +356,7 @@ namespace Umbraco.Web.Models.Mapping
target.Properties = context.MapEnumerable(source.Properties);
}
- // Umbraco.Code.MapAll -Editor -View -Config -ContentTypeId -ContentTypeName -Locked
+ // Umbraco.Code.MapAll -Editor -View -Config -ContentTypeId -ContentTypeName -Locked -DataTypeIcon -DataTypeName
private static void Map(PropertyTypeBasic source, PropertyTypeDisplay target, MapperContext context)
{
target.Alias = source.Alias;
@@ -373,7 +373,7 @@ namespace Umbraco.Web.Models.Mapping
target.Validation = source.Validation;
}
- // Umbraco.Code.MapAll -Editor -View -Config -ContentTypeId -ContentTypeName -Locked
+ // Umbraco.Code.MapAll -Editor -View -Config -ContentTypeId -ContentTypeName -Locked -DataTypeIcon -DataTypeName
private static void Map(MemberPropertyTypeBasic source, MemberPropertyTypeDisplay target, MapperContext context)
{
target.Alias = source.Alias;
diff --git a/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs b/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs
index ba7b5cddf2..3663095739 100644
--- a/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs
+++ b/src/Umbraco.Infrastructure/Models/Mapping/EntityMapDefinition.cs
@@ -40,6 +40,7 @@ namespace Umbraco.Web.Models.Mapping
target.Trashed = source.Trashed;
target.Udi = Udi.Create(ObjectTypes.GetUdiType(source.NodeObjectType), source.Key);
+
if (source is IContentEntitySlim contentSlim)
{
source.AdditionalData["ContentTypeAlias"] = contentSlim.ContentTypeAlias;
@@ -52,6 +53,8 @@ namespace Umbraco.Web.Models.Mapping
if (source is IMediaEntitySlim mediaSlim)
{
+ //pass UpdateDate for MediaPicker ListView ordering
+ source.AdditionalData["UpdateDate"] = mediaSlim.UpdateDate;
source.AdditionalData["MediaPath"] = mediaSlim.MediaPath;
}
@@ -181,7 +184,8 @@ namespace Umbraco.Web.Models.Mapping
target.Name = source.Values.ContainsKey($"nodeName_{culture}") ? source.Values[$"nodeName_{culture}"] : target.Name;
}
- if (source.Values.TryGetValue(UmbracoExamineFieldNames.UmbracoFileFieldName, out var umbracoFile))
+ if (source.Values.TryGetValue(UmbracoExamineFieldNames.UmbracoFileFieldName, out var umbracoFile) &&
+ umbracoFile.IsNullOrWhiteSpace() == false)
{
if (umbracoFile != null)
{
diff --git a/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs b/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs
index 6cee1d9246..32ea6fce3f 100644
--- a/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs
+++ b/src/Umbraco.Infrastructure/Models/Mapping/PropertyTypeGroupMapper.cs
@@ -241,6 +241,8 @@ namespace Umbraco.Web.Models.Mapping
Inherited = inherited,
DataTypeId = p.DataTypeId,
DataTypeKey = p.DataTypeKey,
+ DataTypeName = dataType.Name,
+ DataTypeIcon = propertyEditor.Icon,
SortOrder = p.SortOrder,
ContentTypeId = contentType.Id,
ContentTypeName = contentType.Name,
diff --git a/src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs b/src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs
index ab4f59591f..91844430a9 100644
--- a/src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs
@@ -744,7 +744,9 @@ namespace Umbraco.Core.Persistence.Querying
var c = exp[0];
return (c == '"' || c == '`' || c == '\'') && exp[exp.Length - 1] == c
- ? exp.Substring(1, exp.Length - 2)
+ ? exp.Length == 1
+ ? string.Empty
+ : exp.Substring(1, exp.Length - 2)
: exp;
}
}
diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs
index 3d006914a2..61ced57149 100644
--- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepository.cs
@@ -368,7 +368,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (isContent || isMedia || isMember)
sql
- .AndSelect(x => Alias(x.Id, "versionId"))
+ .AndSelect(x => Alias(x.Id, "versionId"), x=>x.VersionDate)
.AndSelect(x => x.Alias, x => x.Icon, x => x.Thumbnail, x => x.IsContainer, x => x.Variations);
if (isContent)
@@ -489,7 +489,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
if (isContent || isMedia || isMember)
sql
- .AndBy(x => x.Id)
+ .AndBy(x => x.Id, x => x.VersionDate)
.AndBy(x => x.Alias, x => x.Icon, x => x.Thumbnail, x => x.IsContainer, x => x.Variations);
if (defaultSort)
@@ -593,6 +593,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
public string Text { get; set; }
public Guid NodeObjectType { get; set; }
public DateTime CreateDate { get; set; }
+ public DateTime VersionDate { get; set; }
public int Children { get; set; }
public int VersionId { get; set; }
public string Alias { get; set; }
@@ -626,6 +627,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
{
entity.Trashed = dto.Trashed;
entity.CreateDate = dto.CreateDate;
+ entity.UpdateDate = dto.VersionDate;
entity.CreatorId = dto.UserId ?? Constants.Security.UnknownUserId;
entity.Id = dto.NodeId;
entity.Key = dto.UniqueId;
diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs
index c138550de5..edd6dc0ebb 100644
--- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberGroupRepository.cs
@@ -69,7 +69,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
protected override string GetBaseWhereClause()
{
- return "umbracoNode.id = @id";
+ return $"{Constants.DatabaseSchema.Tables.Node}.id = @id";
}
protected override IEnumerable GetDeleteClauses()
@@ -115,6 +115,16 @@ namespace Umbraco.Core.Persistence.Repositories.Implement
entity.ResetDirtyProperties();
}
+ public IMemberGroup Get(Guid uniqueId)
+ {
+ var sql = GetBaseQuery(false);
+ sql.Where("umbracoNode.uniqueId = @uniqueId", new { uniqueId });
+
+ var dto = Database.Fetch(SqlSyntax.SelectTop(sql, 1)).FirstOrDefault();
+
+ return dto == null ? null : MemberGroupFactory.BuildEntity(dto);
+ }
+
public IMemberGroup GetByName(string name)
{
return IsolatedCache.GetCacheItem(
diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs
index e191ac08bf..5ba32a4d2f 100644
--- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs
+++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs
@@ -548,9 +548,9 @@ ORDER BY colName";
{
userDto.EmailConfirmedDate = null;
userDto.SecurityStampToken = entity.SecurityStamp = Guid.NewGuid().ToString();
-
+
changedCols.Add("emailConfirmedDate");
- changedCols.Add("securityStampToken");
+ changedCols.Add("securityStampToken");
}
//only update the changed cols
@@ -694,7 +694,13 @@ ORDER BY colName";
else
sql.WhereNotIn(x => x.Id, inSql);
- return ConvertFromDtos(Database.Fetch(sql));
+
+ var dtos = Database.Fetch(sql);
+
+ //adds missing bits like content and media start nodes
+ PerformGetReferencedDtos(dtos);
+
+ return ConvertFromDtos(dtos);
}
///
diff --git a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs
index 779e4362ae..ec4cfca498 100644
--- a/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs
+++ b/src/Umbraco.Infrastructure/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs
@@ -32,6 +32,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax
V2014 = 6,
V2016 = 7,
V2017 = 8,
+ V2019 = 9,
Other = 99
}
@@ -40,7 +41,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax
Unknown = 0,
Desktop = 1,
Standard = 2,
- Enterprise = 3,
+ Enterprise = 3,// Also developer edition
Express = 4,
Azure = 5
}
@@ -81,6 +82,8 @@ namespace Umbraco.Core.Persistence.SqlSyntax
{
case "??":
return VersionName.Invalid;
+ case "15":
+ return VersionName.V2019;
case "14":
return VersionName.V2017;
case "13":
diff --git a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs
index 837fe6cba3..e243ea45ef 100644
--- a/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs
+++ b/src/Umbraco.Infrastructure/Persistence/UmbracoDatabaseFactory.cs
@@ -182,6 +182,7 @@ namespace Umbraco.Core.Persistence
case SqlServerSyntaxProvider.VersionName.V2014:
case SqlServerSyntaxProvider.VersionName.V2016:
case SqlServerSyntaxProvider.VersionName.V2017:
+ case SqlServerSyntaxProvider.VersionName.V2019:
_databaseType = DatabaseType.SqlServer2012;
break;
// else leave unchanged
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/TrueFalsePropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/TrueFalsePropertyEditor.cs
index 3d82dc2809..0bfa5899c9 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/TrueFalsePropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/TrueFalsePropertyEditor.cs
@@ -13,7 +13,7 @@ namespace Umbraco.Web.PropertyEditors
[DataEditor(
Constants.PropertyEditors.Aliases.Boolean,
EditorType.PropertyValue | EditorType.MacroParameter,
- "Checkbox",
+ "Toggle",
"boolean",
ValueType = ValueTypes.Integer,
Group = Constants.PropertyEditors.Groups.Common,
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/UserPickerConfiguration.cs b/src/Umbraco.Infrastructure/PropertyEditors/UserPickerConfiguration.cs
index 4d497867a1..bf3cd197a3 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/UserPickerConfiguration.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/UserPickerConfiguration.cs
@@ -7,7 +7,8 @@ namespace Umbraco.Web.PropertyEditors
{
public override IDictionary DefaultConfiguration => new Dictionary
{
- {"entityType", "User"}
+ { "entityType", "User" },
+ { "multiPicker", "0" }
};
}
}
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/UserPickerPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/UserPickerPropertyEditor.cs
index 429527f3eb..194924adf1 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/UserPickerPropertyEditor.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/UserPickerPropertyEditor.cs
@@ -8,8 +8,8 @@ namespace Umbraco.Web.PropertyEditors
{
[DataEditor(
Constants.PropertyEditors.Aliases.UserPicker,
- "User picker",
- "entitypicker",
+ "User Picker",
+ "userpicker",
ValueType = ValueTypes.Integer,
Group = Constants.PropertyEditors.Groups.People,
Icon = Constants.Icons.User)]
diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
index 19cca866df..87e5ebec15 100644
--- a/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
+++ b/src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MemberPickerValueConverter.cs
@@ -31,6 +31,8 @@ namespace Umbraco.Web.PropertyEditors.ValueConverters
public override object ConvertSourceToIntermediate(IPublishedElement owner, IPublishedPropertyType propertyType, object source, bool preview)
{
+ if (source == null) return null;
+
var attemptConvertInt = source.TryConvertTo();
if (attemptConvertInt.Success)
return attemptConvertInt.Result;
diff --git a/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs b/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs
index 4585433be6..4cd85bc408 100644
--- a/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs
+++ b/src/Umbraco.Infrastructure/Services/Implement/ContentService.cs
@@ -3006,6 +3006,8 @@ namespace Umbraco.Core.Services.Implement
_documentBlueprintRepository.Save(content);
+ Audit(AuditType.Save, Constants.Security.SuperUserId, content.Id, $"Saved content template: {content.Name}");
+
scope.Events.Dispatch(SavedBlueprint, this, new SaveEventArgs(content), "SavedBlueprint");
scope.Complete();
diff --git a/src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs
index c879a00ccb..308080bbf4 100644
--- a/src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs
+++ b/src/Umbraco.Infrastructure/Services/Implement/MemberGroupService.cs
@@ -70,6 +70,14 @@ namespace Umbraco.Core.Services.Implement
}
}
+ public IMemberGroup GetById(Guid id)
+ {
+ using (var scope = ScopeProvider.CreateScope(autoComplete: true))
+ {
+ return _memberGroupRepository.Get(id);
+ }
+ }
+
public IMemberGroup GetByName(string name)
{
using (var scope = ScopeProvider.CreateScope(autoComplete: true))
diff --git a/src/Umbraco.Infrastructure/Services/Implement/RelationService.cs b/src/Umbraco.Infrastructure/Services/Implement/RelationService.cs
index 4b53709de9..c629466edf 100644
--- a/src/Umbraco.Infrastructure/Services/Implement/RelationService.cs
+++ b/src/Umbraco.Infrastructure/Services/Implement/RelationService.cs
@@ -15,13 +15,15 @@ namespace Umbraco.Core.Services.Implement
private readonly IEntityService _entityService;
private readonly IRelationRepository _relationRepository;
private readonly IRelationTypeRepository _relationTypeRepository;
+ private readonly IAuditRepository _auditRepository;
public RelationService(IScopeProvider uowProvider, ILogger logger, IEventMessagesFactory eventMessagesFactory, IEntityService entityService,
- IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository)
+ IRelationRepository relationRepository, IRelationTypeRepository relationTypeRepository, IAuditRepository auditRepository)
: base(uowProvider, logger, eventMessagesFactory)
{
_relationRepository = relationRepository;
_relationTypeRepository = relationTypeRepository;
+ _auditRepository = auditRepository;
_entityService = entityService ?? throw new ArgumentNullException(nameof(entityService));
}
@@ -476,6 +478,7 @@ namespace Umbraco.Core.Services.Implement
}
_relationTypeRepository.Save(relationType);
+ Audit(AuditType.Save, Constants.Security.SuperUserId, relationType.Id, $"Saved relation type: {relationType.Name}");
scope.Complete();
saveEventArgs.CanCancel = false;
scope.Events.Dispatch(SavedRelationType, this, saveEventArgs);
@@ -565,6 +568,11 @@ namespace Umbraco.Core.Services.Implement
}
return relations;
}
+
+ private void Audit(AuditType type, int userId, int objectId, string message = null)
+ {
+ _auditRepository.Save(new AuditItem(objectId, type, userId, ObjectTypes.GetName(UmbracoObjectTypes.RelationType), message));
+ }
#endregion
#region Events Handlers
diff --git a/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js b/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js
index 2ca6f66510..ea9e4620c8 100644
--- a/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js
+++ b/src/Umbraco.Infrastructure/WebAssets/JsInitialize.js
@@ -28,6 +28,7 @@
'lib/chart.js/Chart.min.js',
'lib/angular-chart.js/angular-chart.min.js',
+ 'lib/wicg-inert/dist/inert.min.js',
'lib/umbraco/Extensions.js',
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/documentTypes.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/documentTypes.ts
index e28c75e922..ba903d1c63 100644
--- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/documentTypes.ts
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/documentTypes.ts
@@ -10,6 +10,7 @@ context('Document Types', () => {
const name = "Test document type";
cy.umbracoEnsureDocumentTypeNameNotExists(name);
+ cy.umbracoEnsureTemplateNameNotExists(name);
cy.umbracoSection('settings');
cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
@@ -44,6 +45,7 @@ context('Document Types', () => {
//Assert
cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoEnsureTemplateNameNotExists(name);
//Clean up
cy.umbracoEnsureDocumentTypeNameNotExists(name);
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViewMacroFiles.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViewMacroFiles.ts
index f4c976de08..563ff77658 100644
--- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViewMacroFiles.ts
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViewMacroFiles.ts
@@ -1,23 +1,34 @@
///
+import { PartialViewMacroBuilder } from "umbraco-cypress-testhelpers";
+
context('Partial View Macro Files', () => {
beforeEach(() => {
cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
});
- it('Create new partial view macro', () => {
- const name = "TestPartialViewMacro";
- const fileName = name + ".cshtml";
-
- cy.umbracoEnsurePartialViewMacroFileNameNotExists(fileName);
- cy.umbracoEnsureMacroNameNotExists(name);
-
+ function openPartialViewMacroCreatePanel() {
cy.umbracoSection('settings');
cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
cy.umbracoTreeItem("settings", ["Partial View Macro Files"]).rightclick();
-
cy.umbracoContextMenuAction("action-create").click();
+ }
+
+ function cleanup(name, extension = ".cshtml") {
+ const fileName = name + extension;
+
+ cy.umbracoEnsureMacroNameNotExists(name);
+ cy.umbracoEnsurePartialViewMacroFileNameNotExists(fileName);
+ }
+
+ it('Create new partial view macro', () => {
+ const name = "TestPartialViewMacro";
+
+ cleanup(name);
+
+ openPartialViewMacroCreatePanel();
+
cy.get('.menu-label').first().click(); // TODO: Fucked we cant use something like cy.umbracoContextMenuAction("action-label").click();
//Type name
@@ -28,10 +39,117 @@ context('Partial View Macro Files', () => {
//Assert
cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoMacroExists(name).then(exists => { expect(exists).to.be.true; });
//Clean up
- cy.umbracoEnsurePartialViewMacroFileNameNotExists(fileName);
- cy.umbracoEnsureMacroNameNotExists(name);
- });
+ cleanup(name);
+ });
+
+ it('Create new partial view macro without macro', () => {
+ const name = "TestPartialMacrolessMacro";
+
+ cleanup(name);
+
+ openPartialViewMacroCreatePanel();
+
+ cy.get('.menu-label').eq(1).click();
+
+ // Type name
+ cy.umbracoEditorHeaderName(name);
+
+ // Save
+ cy.get('.btn-success').click();
+
+ // Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoMacroExists(name).then(exists => { expect(exists).to.be.false; });
+
+ // Clean
+ cleanup(name);
+ });
+
+ it('Create new partial view macro from snippet', () => {
+ const name = "TestPartialFromSnippet";
+
+ cleanup(name);
+
+ openPartialViewMacroCreatePanel();
+
+ cy.get('.menu-label').eq(2).click();
+
+ // Select snippet
+ cy.get('.menu-label').eq(1).click();
+
+ // Type name
+ cy.umbracoEditorHeaderName(name);
+
+ // Save
+ cy.get('.btn-success').click();
+
+ // Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoMacroExists(name).then(exists => { expect(exists).to.be.true; });
+
+ // Clean
+ cleanup(name);
+ });
+
+ it('Delete partial view macro', () => {
+ const name = "TestDeletePartialViewMacro";
+ const fullName = name + ".cshtml"
+
+ cleanup(name);
+
+ const partialViewMacro = new PartialViewMacroBuilder()
+ .withName(name)
+ .withContent("@inherits Umbraco.Web.Macros.PartialViewMacroPage")
+ .build();
+
+ cy.savePartialViewMacro(partialViewMacro);
+
+ // Navigate to settings
+ cy.umbracoSection('settings');
+ cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+
+ // Delete partialViewMacro
+ cy.umbracoTreeItem("settings", ["Partial View Macro Files", fullName]).rightclick();
+ cy.umbracoContextMenuAction("action-delete").click();
+ cy.umbracoButtonByLabelKey("general_ok").click();
+
+ // Assert
+ cy.contains(fullName).should('not.exist');
+
+ // Clean
+ cleanup(name);
+ });
+
+ it('Edit partial view macro', () => {
+ const name = "TestPartialViewMacroEditable";
+ const fullName = name + ".cshtml";
+
+ cleanup(name);
+
+ const partialViewMacro = new PartialViewMacroBuilder()
+ .withName(name)
+ .withContent("@inherits Umbraco.Web.Macros.PartialViewMacroPage")
+ .build();
+
+ cy.savePartialViewMacro(partialViewMacro);
+
+ // Navigate to settings
+ cy.umbracoSection('settings');
+ cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+ cy.umbracoTreeItem("settings", ["Partial View Macro Files", fullName]).click();
+
+ // Type an edit
+ cy.get('.ace_text-input').type(" // test", {force:true} );
+ // Save
+ cy.get('.btn-success').click();
+
+ // Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+
+ cleanup(name);
+ });
});
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViews.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViews.ts
index b644c6642b..068338f8fa 100644
--- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViews.ts
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/partialsViews.ts
@@ -1,35 +1,145 @@
///
+import { PartialViewBuilder } from "umbraco-cypress-testhelpers";
+
context('Partial Views', () => {
- beforeEach(() => {
- cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
- });
+ beforeEach(() => {
+ cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
+ });
- it('Create new empty partial view', () => {
- const name = "TestPartialView";
- const fileName = name + ".cshtml";
+ function navigateToSettings() {
+ cy.umbracoSection('settings');
+ cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+ }
- cy.umbracoEnsurePartialViewNameNotExists(fileName);
+ function openPartialViewsCreatePanel() {
+ navigateToSettings();
+ cy.umbracoTreeItem("settings", ["Partial Views"]).rightclick();
+ }
- cy.umbracoSection('settings');
- cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+ it('Create new empty partial view', () => {
+ const name = "TestPartialView";
+ const fileName = name + ".cshtml";
- cy.umbracoTreeItem("settings", ["Partial Views"]).rightclick();
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
- cy.umbracoContextMenuAction("action-create").click();
- cy.get('.menu-label').first().click(); // TODO: Fucked we cant use something like cy.umbracoContextMenuAction("action-mediaType").click();
+ openPartialViewsCreatePanel();
- //Type name
- cy.umbracoEditorHeaderName(name);
+ cy.umbracoContextMenuAction("action-create").click();
+ cy.get('.menu-label').first().click(); // TODO: Fucked we cant use something like cy.umbracoContextMenuAction("action-mediaType").click();
- //Save
- cy.get('.btn-success').click();
+ //Type name
+ cy.umbracoEditorHeaderName(name);
- //Assert
- cy.umbracoSuccessNotification().should('be.visible');
+ //Save
+ cy.get('.btn-success').click();
+
+ //Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoPartialViewExists(fileName).then(exists => { expect(exists).to.be.true; });
+
+ //Clean up
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+ });
+
+ it('Create partial view from snippet', () => {
+ const name = "TestPartialViewFromSnippet";
+ const fileName = name + ".cshtml";
+
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+
+ openPartialViewsCreatePanel();
+
+ cy.umbracoContextMenuAction("action-create").click();
+ cy.get('.menu-label').eq(1).click();
+ // Select snippet
+ cy.get('.menu-label').eq(2).click();
+
+ // Type name
+ cy.umbracoEditorHeaderName(name);
+
+ // Save
+ cy.get('.btn-success').click();
+
+ // Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+ cy.umbracoPartialViewExists(fileName).then(exists => { expect(exists).to.be.true; });
+
+ // Clean up
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+ });
+
+ it('Partial view with no name', () => {
+ openPartialViewsCreatePanel();
+
+ cy.umbracoContextMenuAction("action-create").click();
+ cy.get('.menu-label').first().click();
+
+ // The test would fail intermittently, most likely because the editor didn't have time to load
+ // This should ensure that the editor is loaded and the test should no longer fail unexpectedly.
+ cy.get('.ace_content', {timeout: 5000}).should('exist');
+
+ // Click save
+ cy.get('.btn-success').click();
+
+ // Asserts
+ cy.umbracoErrorNotification().should('be.visible');
+ });
+
+ it('Delete partial view', () => {
+ const name = "TestDeletePartialView";
+ const fileName = name + ".cshtml";
+
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+
+ // Build and save partial view
+ const partialView = new PartialViewBuilder()
+ .withName(name)
+ .withContent("@inherits Umbraco.Web.Mvc.UmbracoViewPage")
+ .build();
+
+ cy.savePartialView(partialView);
+
+ navigateToSettings();
+
+ // Delete partial view
+ cy.umbracoTreeItem("settings", ["Partial Views", fileName]).rightclick();
+ cy.umbracoContextMenuAction("action-delete").click();
+ cy.umbracoButtonByLabelKey("general_ok").click();
+
+ // Assert
+ cy.contains(fileName).should('not.exist');
+ cy.umbracoPartialViewExists(fileName).then(exists => { expect(exists).to.be.false; });
+
+ // Clean
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+ });
+
+ it('Edit partial view', () => {
+ const name = 'EditPartialView';
+ const fileName = name + ".cshtml";
+
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+
+ const partialView = new PartialViewBuilder()
+ .withName(name)
+ .withContent("@inherits Umbraco.Web.Mvc.UmbracoViewPage\n")
+ .build();
+
+ cy.savePartialView(partialView);
+
+ navigateToSettings();
+ // Open partial view
+ cy.umbracoTreeItem("settings", ["Partial Views", fileName]).click();
+ // Edit
+ cy.get('.ace_text-input').type("var num = 5;", {force:true} );
+ cy.get('.btn-success').click();
+
+ // Assert
+ cy.umbracoSuccessNotification().should('be.visible');
+ // Clean
+ cy.umbracoEnsurePartialViewNameNotExists(fileName);
+ });
- //Clean up
- cy.umbracoEnsurePartialViewNameNotExists(fileName);
- });
});
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/scripts.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/scripts.ts
index 8cffd3e59b..cce8a45da6 100644
--- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/scripts.ts
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/scripts.ts
@@ -14,7 +14,7 @@ context('Scripts', () => {
cy.umbracoSection('settings');
cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
- cy.umbracoTreeItem("settings", ["Stylesheets"]).rightclick();
+ cy.umbracoTreeItem("settings", ["Scripts"]).rightclick();
cy.umbracoContextMenuAction("action-create").click();
cy.get('.menu-label').first().click(); // TODO: Fucked we cant use something like cy.umbracoContextMenuAction("action-mediaType").click();
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/templates.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/templates.ts
index 6871db7ffe..aff1c38093 100644
--- a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/templates.ts
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Settings/templates.ts
@@ -1,57 +1,168 @@
///
-import {DocumentTypeBuilder, TemplateBuilder} from "umbraco-cypress-testhelpers";
+import { TemplateBuilder } from 'umbraco-cypress-testhelpers';
context('Templates', () => {
- beforeEach(() => {
- cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
- });
-
- it('Create template', () => {
- const name = "Test template";
-
- cy.umbracoEnsureTemplateNameNotExists(name);
+ beforeEach(() => {
+ cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
+ });
+ function navigateToSettings() {
cy.umbracoSection('settings');
cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+ }
+ function createTemplate() {
+ navigateToSettings();
cy.umbracoTreeItem("settings", ["Templates"]).rightclick();
-
cy.umbracoContextMenuAction("action-create").click();
+ }
+
+
+ it('Create template', () => {
+ const name = "Test template test";
+ cy.umbracoEnsureTemplateNameNotExists(name);
+
+ createTemplate();
//Type name
cy.umbracoEditorHeaderName(name);
+ /* Make an edit, if you don't the file will be create twice,
+ only happens in testing though, probably because the test is too fast
+ Certifiably mega wonk regardless */
+ cy.get('.ace_text-input').type("var num = 5;", {force:true} );
//Save
- cy.get("form[name='contentForm']").submit();
+ cy.get('.btn-success').click();
//Assert
cy.umbracoSuccessNotification().should('be.visible');
//Clean up
cy.umbracoEnsureTemplateNameNotExists(name);
- });
+ });
- it('Delete template', () => {
- const name = "Test template";
+ it('Unsaved changes stay', () => {
+ const name = "Templates Unsaved Changes Stay test";
+ const edit = "var num = 5;";
cy.umbracoEnsureTemplateNameNotExists(name);
const template = new TemplateBuilder()
.withName(name)
+ .withContent('@inherits Umbraco.Web.Mvc.UmbracoViewPage\n')
.build();
cy.saveTemplate(template);
- cy.umbracoSection('settings');
- cy.get('li .umb-tree-root:contains("Settings")').should("be.visible");
+ navigateToSettings();
- cy.umbracoTreeItem("settings", ["Templates", name]).rightclick();
- cy.umbracoContextMenuAction("action-delete").click();
+ // Open partial view
+ cy.umbracoTreeItem("settings", ["Templates", name]).click();
+ // Edit
+ cy.get('.ace_text-input').type(edit, {force:true} );
- cy.umbracoButtonByLabelKey("general_ok").click();
+ // Navigate away
+ cy.umbracoSection('content');
+ // Click stay button
+ cy.get('umb-button[label="Stay"] button:enabled').click();
- cy.contains(name).should('not.exist');
+ // Assert
+ // That the same document is open
+ cy.get('#headerName').should('have.value', name);
+ cy.get('.ace_content').contains(edit);
cy.umbracoEnsureTemplateNameNotExists(name);
});
+
+ it('Discard unsaved changes', () => {
+ const name = "Discard changes test";
+ const edit = "var num = 5;";
+
+ cy.umbracoEnsureTemplateNameNotExists(name);
+
+ const template = new TemplateBuilder()
+ .withName(name)
+ .withContent('@inherits Umbraco.Web.Mvc.UmbracoViewPage\n')
+ .build();
+
+ cy.saveTemplate(template);
+
+ navigateToSettings();
+
+ // Open partial view
+ cy.umbracoTreeItem("settings", ["Templates", name]).click();
+ // Edit
+ cy.get('.ace_text-input').type(edit, {force:true} );
+
+ // Navigate away
+ cy.umbracoSection('content');
+ // Click discard
+ cy.get('umb-button[label="Discard changes"] button:enabled').click();
+ // Navigate back
+ cy.umbracoSection('settings');
+
+ // Asserts
+ cy.get('.ace_content').should('not.contain', edit);
+ // cy.umbracoPartialViewExists(fileName).then(exists => { expect(exists).to.be.false; }); TODO: Switch to template
+ cy.umbracoEnsureTemplateNameNotExists(name);
+ });
+
+ it('Insert macro', () => {
+ const name = 'InsertMacroTest';
+
+ cy.umbracoEnsureTemplateNameNotExists(name);
+ cy.umbracoEnsureMacroNameNotExists(name);
+
+ const template = new TemplateBuilder()
+ .withName(name)
+ .withContent('')
+ .build();
+
+ cy.saveTemplate(template);
+
+ cy.saveMacro(name);
+
+ navigateToSettings();
+ cy.umbracoTreeItem("settings", ["Templates", name]).click();
+ // Insert macro
+ cy.umbracoButtonByLabelKey('general_insert').click();
+ cy.get('.umb-insert-code-box__title').contains('Macro').click();
+ cy.get('.umb-card-grid-item').contains(name).click();
+
+ // Assert
+ cy.get('.ace_content').contains('@Umbraco.RenderMacro("' + name + '")').should('exist');
+
+ // Clean
+ cy.umbracoEnsureTemplateNameNotExists(name);
+ cy.umbracoEnsureMacroNameNotExists(name);
+ });
+
+ it('Insert value', () => {
+ const name = 'Insert Value Test';
+
+ cy.umbracoEnsureTemplateNameNotExists(name);
+
+ const partialView = new TemplateBuilder()
+ .withName(name)
+ .withContent('')
+ .build();
+
+ cy.saveTemplate(partialView);
+
+ navigateToSettings();
+ cy.umbracoTreeItem("settings", ["Templates", name]).click();
+
+ // Insert value
+ cy.umbracoButtonByLabelKey('general_insert').click();
+ cy.get('.umb-insert-code-box__title').contains('Value').click();
+ cy.get('select').select('umbracoBytes');
+ cy.umbracoButtonByLabelKey('general_submit').click();
+
+ // assert
+ cy.get('.ace_content').contains('@Model.Value("umbracoBytes")').should('exist');
+
+ // Clean
+ cy.umbracoEnsureTemplateNameNotExists(name);
+ });
+
});
diff --git a/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Tour/backofficeTour.ts b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Tour/backofficeTour.ts
new file mode 100644
index 0000000000..ed891a2eea
--- /dev/null
+++ b/src/Umbraco.Tests.AcceptanceTest/cypress/integration/Tour/backofficeTour.ts
@@ -0,0 +1,49 @@
+///
+context('Backoffice Tour', () => {
+
+ beforeEach(() => {
+ cy.umbracoLogin(Cypress.env('username'), Cypress.env('password'));
+ });
+
+ it('Backoffice introduction tour should run', () => {
+ //arrange
+ cy.umbracoGlobalHelp().should("be.visible");
+
+ //act
+ cy.umbracoGlobalHelp().click()
+ //assert
+ cy.get('[data-element="help-tours"]').should("be.visible");
+ //act
+ cy.get('[data-element="help-tours"]').click();
+ //assert
+ cy.get('[data-element="tour-umbIntroIntroduction"] .umb-button').should("be.visible");
+ //act
+ cy.get('[data-element="tour-umbIntroIntroduction"] .umb-button').click();
+ //assert
+ cy.get('.umb-tour-step', { timeout: 60000 }).should('be.visible');
+ cy.get('.umb-tour-step__footer').should('be.visible');
+ cy.get('.umb-tour-step__counter').should('be.visible');
+
+ for(let i=1;i<7;i++){
+ cy.get('.umb-tour-step__counter').contains(i + '/12');
+ cy.get('.umb-tour-step__footer .umb-button').should('be.visible').click();
+ }
+ cy.umbracoGlobalUser().click()
+ cy.get('.umb-tour-step__counter').contains('8/12');
+ cy.get('.umb-tour-step__footer .umb-button').should('be.visible').click();
+ cy.get('.umb-tour-step__counter').contains('9/12');
+ cy.get('.umb-overlay-drawer__align-right .umb-button').should('be.visible').click();
+ cy.get('.umb-tour-step__counter').contains('10/12');
+ cy.umbracoGlobalHelp().click()
+
+ for(let i=11;i<13;i++){
+ cy.get('.umb-tour-step__counter').contains(i + '/12');
+ cy.get('.umb-tour-step__footer .umb-button').should('be.visible').click();
+ }
+ cy.get('.umb-tour-step__footer .umb-button').should('be.visible').click();
+
+ //assert
+ cy.umbracoGlobalHelp().should("be.visible");
+ cy.get('[data-element="help-tours"] .umb-progress-circle').contains('17%');
+ });
+});
diff --git a/src/Umbraco.Tests.AcceptanceTest/package.json b/src/Umbraco.Tests.AcceptanceTest/package.json
index 3b4177ce3f..867b7f5cf3 100644
--- a/src/Umbraco.Tests.AcceptanceTest/package.json
+++ b/src/Umbraco.Tests.AcceptanceTest/package.json
@@ -5,9 +5,9 @@
},
"devDependencies": {
"cross-env": "^7.0.2",
+ "cypress": "^4.12.1",
"ncp": "^2.0.0",
- "cypress": "^4.9.0",
- "umbraco-cypress-testhelpers": "1.0.0-beta-44"
+ "umbraco-cypress-testhelpers": "^1.0.0-beta-48"
},
"dependencies": {
"typescript": "^3.9.2"
diff --git a/src/Umbraco.Tests.Common/Builders/GlobalSettingsBuilder.cs b/src/Umbraco.Tests.Common/Builders/GlobalSettingsBuilder.cs
index 4a88d4a571..b1fe45f1f7 100644
--- a/src/Umbraco.Tests.Common/Builders/GlobalSettingsBuilder.cs
+++ b/src/Umbraco.Tests.Common/Builders/GlobalSettingsBuilder.cs
@@ -220,8 +220,12 @@ namespace Umbraco.Tests.Common.Builders
private class TestGlobalSettings : IGlobalSettings
{
+ private string _iconsPath;
public string ReservedUrls { get; set; }
public string ReservedPaths { get; set; }
+
+ public string IconsPath{ get; set; }
+
public string Path { get; set; }
public string ConfigurationStatus { get; set; }
public int TimeOutInMinutes { get; set; }
diff --git a/src/Umbraco.Tests/Services/UserServiceTests.cs b/src/Umbraco.Tests/Services/UserServiceTests.cs
index dbd71870d4..3c1b0bcc31 100644
--- a/src/Umbraco.Tests/Services/UserServiceTests.cs
+++ b/src/Umbraco.Tests/Services/UserServiceTests.cs
@@ -7,6 +7,7 @@ using System.Threading;
using NUnit.Framework;
using Umbraco.Core;
using Umbraco.Core.Exceptions;
+using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Persistence.DatabaseModelDefinitions;
using Umbraco.Tests.TestHelpers.Entities;
@@ -968,16 +969,72 @@ namespace Umbraco.Tests.Services
Assert.That(updatedItem.AllowedSections.Count(), Is.EqualTo(originalUser.AllowedSections.Count()));
}
+ [Test]
+ public void Can_Get_Assigned_StartNodes_For_User()
+ {
+ var startContentItems = BuildContentItems(3);
+
+ var testUserGroup = CreateTestUserGroup();
+
+ var userGroupId = testUserGroup.Id;
+
+ CreateTestUsers(startContentItems.Select(x => x.Id).ToArray(), testUserGroup, 3);
+
+ var usersInGroup = ServiceContext.UserService.GetAllInGroup(userGroupId);
+
+ foreach (var user in usersInGroup)
+ Assert.AreEqual(user.StartContentIds.Length, startContentItems.Length);
+ }
+
+ private Content[] BuildContentItems(int numberToCreate)
+ {
+ var contentType = MockedContentTypes.CreateSimpleContentType();
+
+ ServiceContext.ContentTypeService.Save(contentType);
+
+ var startContentItems = new List();
+
+ for (var i = 0; i < numberToCreate; i++)
+ startContentItems.Add(MockedContent.CreateSimpleContent(contentType));
+
+ ServiceContext.ContentService.Save(startContentItems);
+
+ return startContentItems.ToArray();
+ }
+
private IUser CreateTestUser(out IUserGroup userGroup)
{
userGroup = CreateTestUserGroup();
var user = ServiceContext.UserService.CreateUserWithIdentity("test1", "test1@test.com");
+
user.AddGroup(userGroup.ToReadOnlyGroup());
+
ServiceContext.UserService.Save(user);
+
return user;
}
+ private List CreateTestUsers(int[] startContentIds, IUserGroup userGroup, int numberToCreate)
+ {
+ var users = new List();
+
+ for (var i = 0; i < numberToCreate; i++)
+ {
+ var user = ServiceContext.UserService.CreateUserWithIdentity($"test{i}", $"test{i}@test.com");
+ user.AddGroup(userGroup.ToReadOnlyGroup());
+
+ var updateable = (User)user;
+ updateable.StartContentIds = startContentIds;
+
+ ServiceContext.UserService.Save(user);
+
+ users.Add(user);
+ }
+
+ return users;
+ }
+
private UserGroup CreateTestUserGroup(string alias = "testGroup", string name = "Test Group")
{
var userGroup = new UserGroup(ShortStringHelper)
diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs
index 44f6be8e7d..7356018c58 100644
--- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs
+++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs
@@ -190,7 +190,7 @@ namespace Umbraco.Tests.TestHelpers
Mock.Of(x => x.ApplicationPhysicalPath == ioHelper.MapPath("~"))),
ioHelper);
});
- var relationService = GetLazyService(factory, c => new RelationService(scopeProvider, logger, eventMessagesFactory, entityService.Value, GetRepo(c), GetRepo(c)));
+ var relationService = GetLazyService(factory, c => new RelationService(scopeProvider, logger, eventMessagesFactory, entityService.Value, GetRepo(c), GetRepo(c), GetRepo(c)));
var tagService = GetLazyService(factory, c => new TagService(scopeProvider, logger, eventMessagesFactory, GetRepo(c)));
var redirectUrlService = GetLazyService(factory, c => new RedirectUrlService(scopeProvider, logger, eventMessagesFactory, GetRepo(c)));
var consentService = GetLazyService(factory, c => new ConsentService(scopeProvider, logger, eventMessagesFactory, GetRepo(c)));
diff --git a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs
index f3d11dea78..34494e1492 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/BackOfficeServerVariables.cs
@@ -180,6 +180,10 @@ namespace Umbraco.Web.BackOffice.Controllers
"mediaApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl(
controller => controller.GetRootMedia())
},
+ {
+ "iconApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl(
+ controller => controller.GetIcon(""))
+ },
{
"imagesApiBaseUrl", _linkGenerator.GetUmbracoApiServiceBaseUrl(
controller => controller.GetBigThumbnail(""))
diff --git a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs
index 444667b591..146f2c32b7 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/ContentTypeController.cs
@@ -3,8 +3,6 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
-using System.Net.Http;
-using System.Net.Http.Headers;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
@@ -13,30 +11,25 @@ using System.Xml.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Core;
-using Umbraco.Core.Cache;
using Umbraco.Core.Configuration;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Hosting;
using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
-using Umbraco.Core.Models.Editors;
using Umbraco.Core.Packaging;
-using Umbraco.Core.Persistence;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.Scoping;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Web.Models;
using Umbraco.Web.Models.ContentEditing;
-using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
using Umbraco.Core.Mapping;
using Umbraco.Web.BackOffice.Filters;
using Umbraco.Web.Common.Attributes;
using Umbraco.Web.Common.Exceptions;
using Umbraco.Web.Editors;
-using Umbraco.Web.Routing;
using Umbraco.Web.Security;
using ContentType = Umbraco.Core.Models.ContentType;
@@ -140,6 +133,12 @@ namespace Umbraco.Web.BackOffice.Controllers
return _contentTypeService.HasContentNodes(id);
}
+ ///
+ /// Gets the document type a given id
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
public DocumentTypeDisplay GetById(int id)
{
var ct = _contentTypeService.Get(id);
@@ -152,6 +151,46 @@ namespace Umbraco.Web.BackOffice.Controllers
return dto;
}
+ ///
+ /// Gets the document type a given guid
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public DocumentTypeDisplay GetById(Guid id)
+ {
+ var contentType = _contentTypeService.Get(id);
+ if (contentType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(contentType);
+ return dto;
+ }
+
+ ///
+ /// Gets the document type a given udi
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public DocumentTypeDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var contentType = _contentTypeService.Get(guidUdi.Guid);
+ if (contentType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(contentType);
+ return dto;
+ }
+
///
/// Deletes a document type with a given ID
///
diff --git a/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs b/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs
index 7d362e52b6..26cccb9141 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/DictionaryController.cs
@@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
-using System.Net;
using System.Linq;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
+using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Logging;
using Umbraco.Core.Mapping;
@@ -129,7 +129,7 @@ namespace Umbraco.Web.BackOffice.Controllers
}
}
- ///
+ ///
/// Gets a dictionary item by id
///
///
@@ -141,10 +141,58 @@ namespace Umbraco.Web.BackOffice.Controllers
///
/// Returns a not found response when dictionary item does not exist
///
+ [DetermineAmbiguousActionByPassingParameters]
public ActionResult GetById(int id)
{
var dictionary = _localizationService.GetDictionaryItemById(id);
+ if (dictionary == null)
+ return NotFound();
+ return _umbracoMapper.Map(dictionary);
+ }
+
+ ///
+ /// Gets a dictionary item by guid
+ ///
+ ///
+ /// The id.
+ ///
+ ///
+ /// The .
+ ///
+ ///
+ /// Returns a not found response when dictionary item does not exist
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public ActionResult GetById(Guid id)
+ {
+ var dictionary = _localizationService.GetDictionaryItemById(id);
+ if (dictionary == null)
+ return NotFound();
+
+ return _umbracoMapper.Map(dictionary);
+ }
+
+ ///
+ /// Gets a dictionary item by udi
+ ///
+ ///
+ /// The id.
+ ///
+ ///
+ /// The .
+ ///
+ ///
+ /// Returns a not found response when dictionary item does not exist
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public ActionResult GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ return NotFound();
+
+ var dictionary = _localizationService.GetDictionaryItemById(guidUdi.Guid);
if (dictionary == null)
return NotFound();
@@ -222,19 +270,30 @@ namespace Umbraco.Web.BackOffice.Controllers
///
public IEnumerable GetList()
{
- var list = new List();
+ var items = _localizationService.GetDictionaryItemDescendants(null).ToArray();
+ var list = new List(items.Length);
- const int level = 0;
-
- foreach (var dictionaryItem in _localizationService.GetRootDictionaryItems().OrderBy(ItemSort()))
+ // recursive method to build a tree structure from the flat structure returned above
+ void BuildTree(int level = 0, Guid? parentId = null)
{
- var item = _umbracoMapper.Map(dictionaryItem);
- item.Level = 0;
- list.Add(item);
+ var children = items.Where(t => t.ParentId == parentId).ToArray();
+ if(children.Any() == false)
+ {
+ return;
+ }
- GetChildItemsForList(dictionaryItem, level + 1, list);
+ foreach(var child in children.OrderBy(ItemSort()))
+ {
+ var display = _umbracoMapper.Map(child);
+ display.Level = level;
+ list.Add(display);
+
+ BuildTree(level + 1, child.Key);
+ }
}
+ BuildTree();
+
return list;
}
diff --git a/src/Umbraco.Web.BackOffice/Controllers/IconController.cs b/src/Umbraco.Web.BackOffice/Controllers/IconController.cs
new file mode 100644
index 0000000000..2aa2761134
--- /dev/null
+++ b/src/Umbraco.Web.BackOffice/Controllers/IconController.cs
@@ -0,0 +1,108 @@
+using System.Collections.Generic;
+using System.Linq;
+using Umbraco.Web.Models;
+using System.IO;
+using Umbraco.Core;
+using Ganss.XSS;
+using Umbraco.Core.Configuration;
+using Umbraco.Core.Hosting;
+using Umbraco.Web.BackOffice.Controllers;
+using Umbraco.Web.Common.Attributes;
+
+namespace Umbraco.Web.Editors
+{
+ [PluginController("UmbracoApi")]
+ public class IconController : UmbracoAuthorizedApiController
+ {
+ private readonly IHostingEnvironment _hostingEnvironment;
+ private readonly IGlobalSettings _globalSettings;
+
+ public IconController(
+ IHostingEnvironment hostingEnvironment,
+ IGlobalSettings globalSettings)
+ {
+ _hostingEnvironment = hostingEnvironment;
+ _globalSettings = globalSettings;
+ }
+
+ ///
+ /// Gets an IconModel containing the icon name and SvgString according to an icon name found at the global icons path
+ ///
+ ///
+ ///
+ public IconModel GetIcon(string iconName)
+ {
+ return string.IsNullOrWhiteSpace(iconName)
+ ? null
+ : CreateIconModel(iconName.StripFileExtension(),
+ _hostingEnvironment.MapPathWebRoot($"{_globalSettings.IconsPath}/{iconName}.svg"));
+ }
+
+ ///
+ /// Gets an IconModel using values from a FileInfo model
+ ///
+ ///
+ ///
+ public IconModel GetIcon(FileInfo fileInfo)
+ {
+ return fileInfo == null || string.IsNullOrWhiteSpace(fileInfo.Name)
+ ? null
+ : CreateIconModel(fileInfo.Name.StripFileExtension(), fileInfo.FullName);
+ }
+
+ ///
+ /// Gets a list of all svg icons found at at the global icons path.
+ ///
+ ///
+ public List GetAllIcons()
+ {
+ var icons = new List();
+ var directory = new DirectoryInfo(_hostingEnvironment.MapPathWebRoot($"{_globalSettings.IconsPath}/"));
+ var iconNames = directory.GetFiles("*.svg");
+
+ iconNames.OrderBy(f => f.Name).ToList().ForEach(iconInfo =>
+ {
+ var icon = GetIcon(iconInfo);
+
+ if (icon != null)
+ {
+ icons.Add(icon);
+ }
+ });
+
+ return icons;
+ }
+
+ ///
+ /// Gets an IconModel containing the icon name and SvgString
+ ///
+ ///
+ ///
+ ///
+ private IconModel CreateIconModel(string iconName, string iconPath)
+ {
+ var sanitizer = new HtmlSanitizer();
+ sanitizer.AllowedAttributes.UnionWith(Core.Constants.SvgSanitizer.Attributes);
+ sanitizer.AllowedCssProperties.UnionWith(Core.Constants.SvgSanitizer.Attributes);
+ sanitizer.AllowedTags.UnionWith(Core.Constants.SvgSanitizer.Tags);
+
+ try
+ {
+ var svgContent = System.IO.File.ReadAllText(iconPath);
+ var sanitizedString = sanitizer.Sanitize(svgContent);
+
+ var svg = new IconModel
+ {
+ Name = iconName,
+ SvgString = sanitizedString
+ };
+
+ return svg;
+ }
+ catch
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/src/Umbraco.Web.BackOffice/Controllers/ImagesController.cs b/src/Umbraco.Web.BackOffice/Controllers/ImagesController.cs
index 6ce6d3a1c6..b264fd987b 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/ImagesController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/ImagesController.cs
@@ -21,7 +21,8 @@ namespace Umbraco.Web.BackOffice.Controllers
private readonly IContentSettings _contentSettings;
private readonly IImageUrlGenerator _imageUrlGenerator;
- public ImagesController(IMediaFileSystem mediaFileSystem, IContentSettings contentSettings, IImageUrlGenerator imageUrlGenerator)
+ public ImagesController(IMediaFileSystem mediaFileSystem, IContentSettings contentSettings,
+ IImageUrlGenerator imageUrlGenerator)
{
_mediaFileSystem = mediaFileSystem;
_contentSettings = contentSettings;
@@ -65,7 +66,6 @@ namespace Umbraco.Web.BackOffice.Controllers
try
{
imageLastModified = _mediaFileSystem.GetLastModified(imagePath);
-
}
catch (Exception)
{
@@ -76,7 +76,14 @@ namespace Umbraco.Web.BackOffice.Controllers
}
var rnd = imageLastModified.HasValue ? $"&rnd={imageLastModified:yyyyMMddHHmmss}" : null;
- var imageUrl = _imageUrlGenerator.GetImageUrl(new ImageUrlGenerationOptions(imagePath) { UpScale = false, Width = width, AnimationProcessMode = "first", ImageCropMode = ImageCropMode.Max, CacheBusterValue = rnd });
+ var imageUrl = _imageUrlGenerator.GetImageUrl(new ImageUrlGenerationOptions(imagePath)
+ {
+ UpScale = false,
+ Width = width,
+ AnimationProcessMode = "first",
+ ImageCropMode = ImageCropMode.Max,
+ CacheBusterValue = rnd
+ });
return new RedirectResult(imageUrl, false);
}
@@ -92,20 +99,30 @@ namespace Umbraco.Web.BackOffice.Controllers
///
///
///
+ ///
+ ///
+ ///
///
///
/// If there is no media, image property or image file is found then this will return not found.
///
public string GetProcessedImageUrl(string imagePath,
- int? width = null,
- int? height = null,
- int? focalPointLeft = null,
- int? focalPointTop = null,
- string animationProcessMode = "first",
+ int? width = null,
+ int? height = null,
+ decimal? focalPointLeft = null,
+ decimal? focalPointTop = null,
+ string animationProcessMode = "first",
ImageCropMode mode = ImageCropMode.Max,
- bool upscale = false,
- string cacheBusterValue = "")
-{
+ bool upscale = false,
+ string cacheBusterValue = "",
+ decimal? cropX1 = null,
+ decimal? cropX2 = null,
+ decimal? cropY1 = null,
+ decimal? cropY2 = null
+ )
+ {
+
+
var options = new ImageUrlGenerationOptions(imagePath)
{
AnimationProcessMode = animationProcessMode,
@@ -114,13 +131,35 @@ namespace Umbraco.Web.BackOffice.Controllers
ImageCropMode = mode,
UpScale = upscale,
Width = width,
+ Crop = (cropX1.HasValue && cropX2.HasValue && cropY1.HasValue && cropY2.HasValue) ? new ImageUrlGenerationOptions.CropCoordinates(cropX1.Value, cropY1.Value, cropX2.Value, cropY2.Value) : null,
+ FocalPoint = new ImageUrlGenerationOptions.FocalPointPosition(focalPointTop.GetValueOrDefault(0.5m), focalPointLeft.GetValueOrDefault(0.5m)),
};
if (focalPointLeft.HasValue && focalPointTop.HasValue)
{
- options.FocalPoint = new ImageUrlGenerationOptions.FocalPointPosition(focalPointTop.Value, focalPointLeft.Value);
+ options.FocalPoint =
+ new ImageUrlGenerationOptions.FocalPointPosition(focalPointTop.Value, focalPointLeft.Value);
}
return _imageUrlGenerator.GetImageUrl(options);
}
+
+ public class FocalPointPositionModel
+ {
+ public decimal Left { get; set; }
+ public decimal Top { get; set; }
+ }
+
+ ///
+ /// The bounds of the crop within the original image, in whatever units the registered
+ /// IImageUrlGenerator uses, typically a percentage between 0 and 100.
+ ///
+ public class CropCoordinatesModel
+ {
+
+ public decimal X1 { get; set; }
+ public decimal Y1 { get; set; }
+ public decimal X2 { get; set;}
+ public decimal Y2 { get; set;}
+ }
}
}
diff --git a/src/Umbraco.Web.BackOffice/Controllers/LogController.cs b/src/Umbraco.Web.BackOffice/Controllers/LogController.cs
index 297c39a450..e99ea890d7 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/LogController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/LogController.cs
@@ -98,6 +98,13 @@ namespace Umbraco.Web.BackOffice.Controllers
};
}
+ public IEnumerable GetLog(AuditType logType, DateTime? sinceDate = null)
+ {
+ var result = _auditService.GetLogs(Enum.Parse(logType.ToString()), sinceDate);
+ var mapped = _umbracoMapper.MapEnumerable(result);
+ return mapped;
+ }
+
private IEnumerable MapAvatarsAndNames(IEnumerable items)
{
var mappedItems = items.ToList();
diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
index 6bb68248b1..ba19f7c2b4 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
@@ -160,15 +160,15 @@ namespace Umbraco.Web.BackOffice.Controllers
[DetermineAmbiguousActionByPassingParameters]
public MediaItemDisplay GetById(int id)
{
- var foundContent = GetObjectFromRequest(() => _mediaService.GetById(id));
+ var foundMedia = GetObjectFromRequest(() => _mediaService.GetById(id));
- if (foundContent == null)
+ if (foundMedia == null)
{
HandleContentNotFound(id);
//HandleContentNotFound will throw an exception
return null;
}
- return _umbracoMapper.Map(foundContent);
+ return _umbracoMapper.Map(foundMedia);
}
///
@@ -181,15 +181,15 @@ namespace Umbraco.Web.BackOffice.Controllers
[DetermineAmbiguousActionByPassingParameters]
public MediaItemDisplay GetById(Guid id)
{
- var foundContent = GetObjectFromRequest(() => _mediaService.GetById(id));
+ var foundMedia = GetObjectFromRequest(() => _mediaService.GetById(id));
- if (foundContent == null)
+ if (foundMedia == null)
{
HandleContentNotFound(id);
//HandleContentNotFound will throw an exception
return null;
}
- return _umbracoMapper.Map(foundContent);
+ return _umbracoMapper.Map(foundMedia);
}
///
@@ -800,10 +800,13 @@ namespace Umbraco.Web.BackOffice.Controllers
var total = long.MaxValue;
while (page * pageSize < total)
{
- var children = _mediaService.GetPagedChildren(mediaId, page, pageSize, out total,
+ var children = _mediaService.GetPagedChildren(mediaId, page++, pageSize, out total,
_sqlContext.Query().Where(x => x.Name == nameToFind));
- foreach (var c in children)
- return c; //return first one if any are found
+ var match = children.FirstOrDefault(c => c.ContentType.Alias == contentTypeAlias);
+ if (match != null)
+ {
+ return match;
+ }
}
return null;
}
diff --git a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs
index d030d03cf9..617d3f1538 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/MediaTypeController.cs
@@ -71,6 +71,12 @@ namespace Umbraco.Web.BackOffice.Controllers
public int GetCount() => _contentTypeService.Count();
+ ///
+ /// Gets the media type a given id
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
[UmbracoTreeAuthorize(Constants.Trees.MediaTypes, Constants.Trees.Media)]
public MediaTypeDisplay GetById(int id)
{
@@ -84,6 +90,48 @@ namespace Umbraco.Web.BackOffice.Controllers
return dto;
}
+ ///
+ /// Gets the media type a given guid
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ [UmbracoTreeAuthorize(Constants.Trees.MediaTypes, Constants.Trees.Media)]
+ public MediaTypeDisplay GetById(Guid id)
+ {
+ var mediaType = _mediaTypeService.Get(id);
+ if (mediaType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(mediaType);
+ return dto;
+ }
+
+ ///
+ /// Gets the media type a given udi
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ [UmbracoTreeAuthorize(Constants.Trees.MediaTypes, Constants.Trees.Media)]
+ public MediaTypeDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var mediaType = _mediaTypeService.Get(guidUdi.Guid);
+ if (mediaType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(mediaType);
+ return dto;
+ }
+
///
/// Deletes a media type with a given ID
///
diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs
index 153990937d..d3d06132d3 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/MemberGroupController.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Mvc;
+using Umbraco.Core;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
using Umbraco.Core.Services;
@@ -37,6 +38,12 @@ namespace Umbraco.Web.BackOffice.Controllers
localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService));
}
+ ///
+ /// Gets the member group json for the member group id
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
public MemberGroupDisplay GetById(int id)
{
var memberGroup = _memberGroupService.GetById(id);
@@ -49,6 +56,45 @@ namespace Umbraco.Web.BackOffice.Controllers
return dto;
}
+
+ ///
+ /// Gets the member group json for the member group guid
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public MemberGroupDisplay GetById(Guid id)
+ {
+ var memberGroup = _memberGroupService.GetById(id);
+ if (memberGroup == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ return _umbracoMapper.Map(memberGroup);
+ }
+
+ ///
+ /// Gets the member group json for the member group udi
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public MemberGroupDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var memberGroup = _memberGroupService.GetById(guidUdi.Guid);
+ if (memberGroup == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ return _umbracoMapper.Map(memberGroup);
+ }
+
public IEnumerable GetByIds([FromQuery]int[] ids)
{
return _memberGroupService.GetByIds(ids)
diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs
index 240a2e0f5b..8ef8749c2d 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/MemberTypeController.cs
@@ -64,7 +64,13 @@ namespace Umbraco.Web.Editors
localizedTextService ?? throw new ArgumentNullException(nameof(localizedTextService));
}
+ ///
+ /// Gets the member type a given id
+ ///
+ ///
+ ///
[UmbracoTreeAuthorize(Constants.Trees.MemberTypes)]
+ [DetermineAmbiguousActionByPassingParameters]
public MemberTypeDisplay GetById(int id)
{
var ct = _memberTypeService.Get(id);
@@ -78,7 +84,49 @@ namespace Umbraco.Web.Editors
}
///
- /// Deletes a document type with a given ID
+ /// Gets the member type a given guid
+ ///
+ ///
+ ///
+ [UmbracoTreeAuthorize(Constants.Trees.MemberTypes)]
+ [DetermineAmbiguousActionByPassingParameters]
+ public MemberTypeDisplay GetById(Guid id)
+ {
+ var memberType = _memberTypeService.Get(id);
+ if (memberType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(memberType);
+ return dto;
+ }
+
+ ///
+ /// Gets the member type a given udi
+ ///
+ ///
+ ///
+ [UmbracoTreeAuthorize(Constants.Trees.MemberTypes)]
+ [DetermineAmbiguousActionByPassingParameters]
+ public MemberTypeDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var memberType = _memberTypeService.Get(guidUdi.Guid);
+ if (memberType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = _umbracoMapper.Map(memberType);
+ return dto;
+ }
+
+ ///
+ /// Deletes a document type with a given id
///
///
///
diff --git a/src/Umbraco.Web.BackOffice/Controllers/RelationTypeController.cs b/src/Umbraco.Web.BackOffice/Controllers/RelationTypeController.cs
index ef7fe94e77..0991dca09f 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/RelationTypeController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/RelationTypeController.cs
@@ -49,6 +49,7 @@ namespace Umbraco.Web.BackOffice.Controllers
///
/// The relation type ID.
/// Returns the .
+ [DetermineAmbiguousActionByPassingParameters]
public RelationTypeDisplay GetById(int id)
{
var relationType = _relationService.GetRelationTypeById(id);
@@ -63,6 +64,42 @@ namespace Umbraco.Web.BackOffice.Controllers
return display;
}
+ ///
+ /// Gets a relation type by guid
+ ///
+ /// The relation type ID.
+ /// Returns the .
+ [DetermineAmbiguousActionByPassingParameters]
+ public RelationTypeDisplay GetById(Guid id)
+ {
+ var relationType = _relationService.GetRelationTypeById(id);
+ if (relationType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+ return _umbracoMapper.Map(relationType);
+ }
+
+ ///
+ /// Gets a relation type by udi
+ ///
+ /// The relation type ID.
+ /// Returns the .
+ [DetermineAmbiguousActionByPassingParameters]
+ public RelationTypeDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var relationType = _relationService.GetRelationTypeById(guidUdi.Guid);
+ if (relationType == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+ return _umbracoMapper.Map(relationType);
+ }
+
public PagedResult GetPagedResults(int id, int pageNumber = 1, int pageSize = 100)
{
diff --git a/src/Umbraco.Web.BackOffice/Controllers/TemplateController.cs b/src/Umbraco.Web.BackOffice/Controllers/TemplateController.cs
index b99ebce7a7..f80c3015e9 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/TemplateController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/TemplateController.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Mvc;
+using Umbraco.Core;
using Umbraco.Core.IO;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
@@ -55,10 +56,11 @@ namespace Umbraco.Web.BackOffice.Controllers
}
///
- /// Gets the content json for the content id
+ /// Gets the template json for the template id
///
///
///
+ [DetermineAmbiguousActionByPassingParameters]
public TemplateDisplay GetById(int id)
{
var template = _fileService.GetTemplate(id);
@@ -68,6 +70,43 @@ namespace Umbraco.Web.BackOffice.Controllers
return _umbracoMapper.Map(template);
}
+
+ ///
+ /// Gets the template json for the template guid
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public TemplateDisplay GetById(Guid id)
+ {
+ var template = _fileService.GetTemplate(id);
+ if (template == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ return _umbracoMapper.Map(template);
+ }
+
+ ///
+ /// Gets the template json for the template udi
+ ///
+ ///
+ ///
+ [DetermineAmbiguousActionByPassingParameters]
+ public TemplateDisplay GetById(Udi id)
+ {
+ var guidUdi = id as GuidUdi;
+ if (guidUdi == null)
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+
+ var template = _fileService.GetTemplate(guidUdi.Guid);
+ if (template == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ return _umbracoMapper.Map(template);
+ }
+
///
/// Deletes a template with a given ID
///
diff --git a/src/Umbraco.Web.BackOffice/Controllers/TemplateQueryController.cs b/src/Umbraco.Web.BackOffice/Controllers/TemplateQueryController.cs
index e0808682d5..b1dd2e94e5 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/TemplateQueryController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/TemplateQueryController.cs
@@ -95,7 +95,11 @@ namespace Umbraco.Web.BackOffice.Controllers
QueryExpression = queryExpression.ToString(),
ResultCount = results.Count,
ExecutionTime = timer.ElapsedMilliseconds,
- SampleResults = results.Take(20).Select(x => new TemplateQueryResult { Icon = "icon-file", Name = x.Name })
+ SampleResults = results.Take(20).Select(x => new TemplateQueryResult
+ {
+ Icon = "icon-document",
+ Name = x.Name
+ })
};
}
diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs
index fff609322c..75f7a6e512 100644
--- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs
+++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs
@@ -34,6 +34,7 @@ using Umbraco.Core.Hosting;
using Umbraco.Core.Media;
using Umbraco.Extensions;
using Umbraco.Web.BackOffice.Filters;
+using Umbraco.Web.BackOffice.ModelBinders;
using Umbraco.Web.BackOffice.Security;
using Umbraco.Web.Common.ActionResults;
using Umbraco.Web.Common.Attributes;
@@ -235,6 +236,33 @@ namespace Umbraco.Web.BackOffice.Controllers
return result;
}
+ ///
+ /// Get users by integer ids
+ ///
+ ///
+ ///
+ [TypeFilter(typeof(OutgoingEditorModelEventAttribute))]
+ [AdminUsersAuthorize]
+ public IEnumerable GetByIds([FromJsonPath]int[] ids)
+ {
+ if (ids == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ if (ids.Length == 0)
+ return Enumerable.Empty();
+
+ var users = _userService.GetUsersById(ids);
+ if (users == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var result = _umbracoMapper.MapEnumerable(users);
+ return result;
+ }
+
///
/// Returns a paged users collection
///
diff --git a/src/Umbraco.Web.BackOffice/Mapping/MemberMapDefinition.cs b/src/Umbraco.Web.BackOffice/Mapping/MemberMapDefinition.cs
index cf001b17db..aba2d4a12c 100644
--- a/src/Umbraco.Web.BackOffice/Mapping/MemberMapDefinition.cs
+++ b/src/Umbraco.Web.BackOffice/Mapping/MemberMapDefinition.cs
@@ -39,6 +39,7 @@ namespace Umbraco.Web.Models.Mapping
private void Map(IMember source, MemberDisplay target, MapperContext context)
{
target.ContentApps = _commonMapper.GetContentApps(source);
+ target.ContentType = _commonMapper.GetContentType(source, context);
target.ContentTypeId = source.ContentType.Id;
target.ContentTypeAlias = source.ContentType.Alias;
target.ContentTypeName = source.ContentType.Name;
diff --git a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj
index 0e98bc8cd7..2547117531 100644
--- a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj
+++ b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj
@@ -15,6 +15,7 @@
+
diff --git a/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js b/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js
index dbc0b7fc57..fb03cbd1b1 100644
--- a/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js
+++ b/src/Umbraco.Web.UI.Client/gulp/tasks/dependencies.js
@@ -29,12 +29,15 @@ function dependencies() {
"./node_modules/ace-builds/src-min-noconflict/snippets/text.js",
"./node_modules/ace-builds/src-min-noconflict/snippets/javascript.js",
"./node_modules/ace-builds/src-min-noconflict/snippets/css.js",
+ "./node_modules/ace-builds/src-min-noconflict/snippets/json.js",
"./node_modules/ace-builds/src-min-noconflict/theme-chrome.js",
"./node_modules/ace-builds/src-min-noconflict/mode-razor.js",
"./node_modules/ace-builds/src-min-noconflict/mode-javascript.js",
"./node_modules/ace-builds/src-min-noconflict/mode-css.js",
"./node_modules/ace-builds/src-min-noconflict/worker-javascript.js",
- "./node_modules/ace-builds/src-min-noconflict/worker-css.js"
+ "./node_modules/ace-builds/src-min-noconflict/worker-css.js",
+ "./node_modules/ace-builds/src-min-noconflict/mode-json.js",
+ "./node_modules/ace-builds/src-min-noconflict/worker-json.js"
],
"base": "./node_modules/ace-builds"
},
@@ -45,7 +48,8 @@ function dependencies() {
},
{
"name": "angular-aria",
- "src": ["./node_modules/angular-aria/angular-aria.min.js"],
+ "src": ["./node_modules/angular-aria/angular-aria.min.js",
+ "./node_modules/angular-aria/angular-aria.min.js.map"],
"base": "./node_modules/angular-aria"
},
{
@@ -238,6 +242,14 @@ function dependencies() {
"name": "underscore",
"src": ["node_modules/underscore/underscore-min.js"],
"base": "./node_modules/underscore"
+ },
+ {
+ "name": "wicg-inert",
+ "src": [
+ "./node_modules/wicg-inert/dist/inert.min.js",
+ "./node_modules/wicg-inert/dist/inert.min.js.map"
+ ],
+ "base": "./node_modules/wicg-inert"
}
];
diff --git a/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pager.less b/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pager.less
index 1476188297..718ade757e 100644
--- a/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pager.less
+++ b/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pager.less
@@ -13,6 +13,7 @@
display: inline;
}
.pager li > a,
+.pager li > button,
.pager li > span {
display: inline-block;
padding: 5px 14px;
@@ -21,23 +22,30 @@
.border-radius(15px);
}
.pager li > a:hover,
-.pager li > a:focus {
- text-decoration: none;
- background-color: #f5f5f5;
+.pager li > a:focus,
+.pager li > button:hover,
+.pager li > button:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
}
.pager .next > a,
+.pager .next > button,
.pager .next > span {
float: right;
}
.pager .previous > a,
+.pager .previous > button,
.pager .previous > span {
- float: left;
+ float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
+.pager .disabled > button,
+.pager .disabled > button:hover,
+.pager .disabled > button:focus
.pager .disabled > span {
- color: @grayLight;
- background-color: #fff;
- cursor: default;
-}
\ No newline at end of file
+ color: @grayLight;
+ background-color: #fff;
+ cursor: default;
+}
diff --git a/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pagination.less b/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pagination.less
index 6f6e6ac7de..ae10700eb3 100644
--- a/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pagination.less
+++ b/src/Umbraco.Web.UI.Client/lib/bootstrap/less/pagination.less
@@ -21,6 +21,7 @@
display: inline; // Remove list-style and block-level defaults
}
.pagination ul > li > a,
+.pagination ul > li > button,
.pagination ul > li > span {
float: left; // Collapse white-space
padding: 4px 12px;
@@ -32,29 +33,38 @@
}
.pagination ul > li > a:hover,
.pagination ul > li > a:focus,
+.pagination ul > li > button:hover,
+.pagination ul > li > button:focus,
.pagination ul > .active > a,
+.pagination ul > .active > button,
.pagination ul > .active > span {
- background-color: @paginationActiveBackground;
+ background-color: @paginationActiveBackground;
}
.pagination ul > .active > a,
+.pagination ul > .active > button,
.pagination ul > .active > span {
- color: @grayLight;
- cursor: default;
+ color: @grayLight;
+ cursor: default;
}
.pagination ul > .disabled > span,
.pagination ul > .disabled > a,
.pagination ul > .disabled > a:hover,
-.pagination ul > .disabled > a:focus {
- color: @grayLight;
- background-color: transparent;
- cursor: default;
+.pagination ul > .disabled > a:focus,
+.pagination ul > .disabled > button,
+.pagination ul > .disabled > button:hover,
+.pagination ul > .disabled > button:focus {
+ color: @grayLight;
+ background-color: transparent;
+ cursor: default;
}
.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > button,
.pagination ul > li:first-child > span {
border-left-width: 1px;
.border-left-radius(@baseBorderRadius);
}
.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > button,
.pagination ul > li:last-child > span {
.border-right-radius(@baseBorderRadius);
}
@@ -77,15 +87,18 @@
// Large
.pagination-large {
ul > li > a,
+ ul > li > button,
ul > li > span {
padding: @paddingLarge;
font-size: @fontSizeLarge;
}
ul > li:first-child > a,
+ ul > li:first-child > button,
ul > li:first-child > span {
.border-left-radius(@borderRadiusLarge);
}
ul > li:last-child > a,
+ ul > li:last-child > button,
ul > li:last-child > span {
.border-right-radius(@borderRadiusLarge);
}
@@ -95,10 +108,12 @@
.pagination-mini,
.pagination-small {
ul > li:first-child > a,
+ ul > li:first-child > button,
ul > li:first-child > span {
.border-left-radius(@borderRadiusSmall);
}
ul > li:last-child > a,
+ ul > li:last-child > button,
ul > li:last-child > span {
.border-right-radius(@borderRadiusSmall);
}
@@ -107,6 +122,7 @@
// Small
.pagination-small {
ul > li > a,
+ ul > li > button,
ul > li > span {
padding: @paddingSmall;
font-size: @fontSizeSmall;
@@ -115,6 +131,7 @@
// Mini
.pagination-mini {
ul > li > a,
+ ul > li > button,
ul > li > span {
padding: @paddingMini;
font-size: @fontSizeMini;
diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json
index 454d081fe7..100774f385 100644
--- a/src/Umbraco.Web.UI.Client/package.json
+++ b/src/Umbraco.Web.UI.Client/package.json
@@ -44,7 +44,8 @@
"spectrum-colorpicker": "1.8.0",
"tinymce": "4.9.11",
"typeahead.js": "0.11.1",
- "underscore": "1.9.1"
+ "underscore": "1.9.1",
+ "wicg-inert": "^3.0.2"
},
"devDependencies": {
"@babel/core": "7.6.4",
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-activity.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-activity.svg
new file mode 100644
index 0000000000..84c1202f04
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-activity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-add.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-add.svg
new file mode 100644
index 0000000000..9abe4f9085
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-adressbook.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-adressbook.svg
new file mode 100644
index 0000000000..1c6676a711
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-adressbook.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alarm-clock.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alarm-clock.svg
new file mode 100644
index 0000000000..4aa9ce1485
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alarm-clock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert-alt.svg
new file mode 100644
index 0000000000..dbb78a2188
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert.svg
new file mode 100644
index 0000000000..3a75464feb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alert.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alt.svg
new file mode 100644
index 0000000000..1d4c0eb3e6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-anchor.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-anchor.svg
new file mode 100644
index 0000000000..033467b283
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-anchor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-app.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-app.svg
new file mode 100644
index 0000000000..02b19fe989
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-app.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-error.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-error.svg
new file mode 100644
index 0000000000..cd57ff336f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window-alt.svg
new file mode 100644
index 0000000000..e87dae6ec8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window.svg
new file mode 100644
index 0000000000..f99af0f195
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-application-window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrivals.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrivals.svg
new file mode 100644
index 0000000000..bfbe503d6b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrivals.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-down.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-down.svg
new file mode 100644
index 0000000000..fcdf4548ec
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-left.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-left.svg
new file mode 100644
index 0000000000..2cf42ff7d6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-right.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-right.svg
new file mode 100644
index 0000000000..d1349b3b23
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-up.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-up.svg
new file mode 100644
index 0000000000..f7ca5f8249
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-arrow-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-art-easel.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-art-easel.svg
new file mode 100644
index 0000000000..c4df06598b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-art-easel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-article.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-article.svg
new file mode 100644
index 0000000000..28b2e35c71
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-article.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-attachment.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-attachment.svg
new file mode 100644
index 0000000000..a3c4f466c3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-attachment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-auction-hammer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-auction-hammer.svg
new file mode 100644
index 0000000000..50f8b8ef26
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-auction-hammer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-autofill.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-autofill.svg
new file mode 100644
index 0000000000..15cbe9fc35
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-autofill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-award.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-award.svg
new file mode 100644
index 0000000000..18a82455f8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-award.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-2.svg
new file mode 100644
index 0000000000..d8ef136b72
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-3.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-3.svg
new file mode 100644
index 0000000000..77a56e9984
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation-3.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation.svg
new file mode 100644
index 0000000000..5f56a648d1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-axis-rotation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-baby-stroller.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-baby-stroller.svg
new file mode 100644
index 0000000000..d8edc730c1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-baby-stroller.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-backspace.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-backspace.svg
new file mode 100644
index 0000000000..6c84aa5cbc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-backspace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-add.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-add.svg
new file mode 100644
index 0000000000..0c6be8a34b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-count.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-count.svg
new file mode 100644
index 0000000000..e309c884f9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-count.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-remove.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-remove.svg
new file mode 100644
index 0000000000..a6317092b8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-restricted.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-restricted.svg
new file mode 100644
index 0000000000..c7ad647e22
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-badge-restricted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ball.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ball.svg
new file mode 100644
index 0000000000..5416815534
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ball.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-band-aid.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-band-aid.svg
new file mode 100644
index 0000000000..8232ea9b23
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-band-aid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bar-chart.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bar-chart.svg
new file mode 100644
index 0000000000..c2fc1a2e2f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bar-chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-barcode.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-barcode.svg
new file mode 100644
index 0000000000..7b7e4e151e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-barcode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bars.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bars.svg
new file mode 100644
index 0000000000..2199f4fb11
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bars.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-full.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-full.svg
new file mode 100644
index 0000000000..5aff9d10df
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-full.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-low.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-low.svg
new file mode 100644
index 0000000000..72909d1d84
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-battery-low.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-beer-glass.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-beer-glass.svg
new file mode 100644
index 0000000000..dc9e44cff7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-beer-glass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell-off.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell-off.svg
new file mode 100644
index 0000000000..d7c9422857
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell.svg
new file mode 100644
index 0000000000..6843f8dbc7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bell.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-dollar.svg
new file mode 100644
index 0000000000..7ed749b1c8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-euro.svg
new file mode 100644
index 0000000000..c526f106a0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-pound.svg
new file mode 100644
index 0000000000..339006dc08
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-yen.svg
new file mode 100644
index 0000000000..76b9a1d318
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill.svg
new file mode 100644
index 0000000000..ad75b69591
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-billboard.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-billboard.svg
new file mode 100644
index 0000000000..468e0dc8bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-billboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-dollar.svg
new file mode 100644
index 0000000000..dcd3a8f227
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-euro.svg
new file mode 100644
index 0000000000..3f2fbc38ef
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-pound.svg
new file mode 100644
index 0000000000..32a30de1c6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-yen.svg
new file mode 100644
index 0000000000..ea352b33d5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills.svg
new file mode 100644
index 0000000000..a6d9b7a76e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bills.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binarycode.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binarycode.svg
new file mode 100644
index 0000000000..5a7e9ee9d2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binarycode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binoculars.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binoculars.svg
new file mode 100644
index 0000000000..407a88c58d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-binoculars.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bird.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bird.svg
new file mode 100644
index 0000000000..182a02be79
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bird.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-birthday-cake.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-birthday-cake.svg
new file mode 100644
index 0000000000..205a06715a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-birthday-cake.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-block.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-block.svg
new file mode 100644
index 0000000000..ed19756dd9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-block.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-blueprint.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-blueprint.svg
new file mode 100644
index 0000000000..4382644745
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-blueprint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bluetooth.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bluetooth.svg
new file mode 100644
index 0000000000..2c73fb77a7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bluetooth.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-boat-shipping.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-boat-shipping.svg
new file mode 100644
index 0000000000..15a8d6f9ff
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-boat-shipping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bomb.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bomb.svg
new file mode 100644
index 0000000000..b39d18938c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bomb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bones.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bones.svg
new file mode 100644
index 0000000000..f956d77bf3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bones.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt-2.svg
new file mode 100644
index 0000000000..2003b3d233
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt.svg
new file mode 100644
index 0000000000..c959cdea3a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book.svg
new file mode 100644
index 0000000000..2516a55f83
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-book.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bookmark.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bookmark.svg
new file mode 100644
index 0000000000..a3268596ac
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bookmark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-books.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-books.svg
new file mode 100644
index 0000000000..ddb9162770
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-books.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-alt.svg
new file mode 100644
index 0000000000..0189daab6d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-open.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-open.svg
new file mode 100644
index 0000000000..b2ec5d8bd3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box.svg
new file mode 100644
index 0000000000..84fa9ca794
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-box.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brackets.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brackets.svg
new file mode 100644
index 0000000000..142eb9f746
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brackets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brick.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brick.svg
new file mode 100644
index 0000000000..e06862f8aa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brick.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-briefcase.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-briefcase.svg
new file mode 100644
index 0000000000..e6e0705ecf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-briefcase.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-browser-window.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-browser-window.svg
new file mode 100644
index 0000000000..8279fb9198
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-browser-window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt-2.svg
new file mode 100644
index 0000000000..3599902e1f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt.svg
new file mode 100644
index 0000000000..65849ec18e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush.svg
new file mode 100644
index 0000000000..a5b889c60d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-brush.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bug.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bug.svg
new file mode 100644
index 0000000000..9b5b667387
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bulleted-list.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bulleted-list.svg
new file mode 100644
index 0000000000..72bdf63388
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bulleted-list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-burn.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-burn.svg
new file mode 100644
index 0000000000..4f6ebe6865
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-burn.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bus.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bus.svg
new file mode 100644
index 0000000000..95e728138e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-bus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calculator.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calculator.svg
new file mode 100644
index 0000000000..3dcce7ec35
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calculator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar-alt.svg
new file mode 100644
index 0000000000..fb485f5a83
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar.svg
new file mode 100644
index 0000000000..b405db5525
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-calendar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camcorder.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camcorder.svg
new file mode 100644
index 0000000000..de0b071abb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camcorder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camera-roll.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camera-roll.svg
new file mode 100644
index 0000000000..172e0d92b0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-camera-roll.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-candy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-candy.svg
new file mode 100644
index 0000000000..1da869963f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-candy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-caps-lock.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-caps-lock.svg
new file mode 100644
index 0000000000..1a466182c9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-caps-lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-car.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-car.svg
new file mode 100644
index 0000000000..9c72758d41
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-car.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cash-register.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cash-register.svg
new file mode 100644
index 0000000000..f4f1779b86
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cash-register.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-categories.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-categories.svg
new file mode 100644
index 0000000000..2bd633a8f1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-categories.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-certificate.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-certificate.svg
new file mode 100644
index 0000000000..e3e16b5054
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-certificate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart-curve.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart-curve.svg
new file mode 100644
index 0000000000..219d05a1f8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart-curve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart.svg
new file mode 100644
index 0000000000..72c6534c38
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat-active.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat-active.svg
new file mode 100644
index 0000000000..b899dfc3fe
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat.svg
new file mode 100644
index 0000000000..21abb255ef
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-check.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-check.svg
new file mode 100644
index 0000000000..5bd7161118
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-check.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted-active.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted-active.svg
new file mode 100644
index 0000000000..f717f8063b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted.svg
new file mode 100644
index 0000000000..cf650c0085
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-dotted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-empty.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-empty.svg
new file mode 100644
index 0000000000..9a3edf8a28
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox-empty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox.svg
new file mode 100644
index 0000000000..748b269cd2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chess.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chess.svg
new file mode 100644
index 0000000000..8cb5685672
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chess.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip-alt.svg
new file mode 100644
index 0000000000..5d459f13b1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip.svg
new file mode 100644
index 0000000000..0d622b2506
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-chip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cinema.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cinema.svg
new file mode 100644
index 0000000000..f3bc729bf1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cinema.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted-active.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted-active.svg
new file mode 100644
index 0000000000..f9c60410cb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted.svg
new file mode 100644
index 0000000000..9cd9fd9252
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circle-dotted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circuits.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circuits.svg
new file mode 100644
index 0000000000..4feb78fa69
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circuits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circus.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circus.svg
new file mode 100644
index 0000000000..ff712b18ed
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-circus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-client.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-client.svg
new file mode 100644
index 0000000000..23e23117e9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-client.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clothes-hanger.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clothes-hanger.svg
new file mode 100644
index 0000000000..f17c449cb0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clothes-hanger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-drive.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-drive.svg
new file mode 100644
index 0000000000..df5fcf03d7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-drive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-upload.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-upload.svg
new file mode 100644
index 0000000000..41e015fa89
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud-upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud.svg
new file mode 100644
index 0000000000..10a95d9562
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloudy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloudy.svg
new file mode 100644
index 0000000000..75aad3d4d2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cloudy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clubs.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clubs.svg
new file mode 100644
index 0000000000..68617041d5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-clubs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cocktail.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cocktail.svg
new file mode 100644
index 0000000000..cc13e78a6f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cocktail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-code.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-code.svg
new file mode 100644
index 0000000000..2615644cea
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coffee.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coffee.svg
new file mode 100644
index 0000000000..d9e23e1259
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coffee.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-dollar.svg
new file mode 100644
index 0000000000..6f3e0659da
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-euro.svg
new file mode 100644
index 0000000000..20527e3526
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-pound.svg
new file mode 100644
index 0000000000..9ba0de073b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-yen.svg
new file mode 100644
index 0000000000..2d7f31caf1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin.svg
new file mode 100644
index 0000000000..ec3b147525
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-alt.svg
new file mode 100644
index 0000000000..a2349aaa12
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar-alt.svg
new file mode 100644
index 0000000000..8f283ea006
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar.svg
new file mode 100644
index 0000000000..0b2b7a2ea6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro-alt.svg
new file mode 100644
index 0000000000..c8bbff6628
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro.svg
new file mode 100644
index 0000000000..e1b77f5941
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound-alt.svg
new file mode 100644
index 0000000000..e91acce12c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound.svg
new file mode 100644
index 0000000000..6d1443a6c9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen-alt.svg
new file mode 100644
index 0000000000..d477b86158
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen.svg
new file mode 100644
index 0000000000..63aa1da6b2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins.svg
new file mode 100644
index 0000000000..6af11e0945
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coins.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-color-bucket.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-color-bucket.svg
new file mode 100644
index 0000000000..08fcb021d9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-color-bucket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-colorpicker.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-colorpicker.svg
new file mode 100644
index 0000000000..69d0362805
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-colorpicker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-columns.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-columns.svg
new file mode 100644
index 0000000000..913a681162
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-columns.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-comb.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-comb.svg
new file mode 100644
index 0000000000..d15c099fbe
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-comb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock-open.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock-open.svg
new file mode 100644
index 0000000000..3cdba5cf20
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock.svg
new file mode 100644
index 0000000000..10332f449f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-combination-lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-command.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-command.svg
new file mode 100644
index 0000000000..7a4b9094f9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-command.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-company.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-company.svg
new file mode 100644
index 0000000000..b22bdb63ad
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-company.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-compress.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-compress.svg
new file mode 100644
index 0000000000..48664d5a36
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-compress.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-connection.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-connection.svg
new file mode 100644
index 0000000000..0619278e2a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-connection.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-console.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-console.svg
new file mode 100644
index 0000000000..8599aeb13a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-console.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-contrast.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-contrast.svg
new file mode 100644
index 0000000000..8dbd2d9e74
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-contrast.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation-alt.svg
new file mode 100644
index 0000000000..111b651f89
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation.svg
new file mode 100644
index 0000000000..d16115fdb0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-conversation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coverflow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coverflow.svg
new file mode 100644
index 0000000000..72a230d15d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-coverflow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card-alt.svg
new file mode 100644
index 0000000000..c113197cf5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card.svg
new file mode 100644
index 0000000000..af896af5f9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-credit-card.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crop.svg
new file mode 100644
index 0000000000..570c261e8a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crosshair.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crosshair.svg
new file mode 100644
index 0000000000..802be32987
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crosshair.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown-alt.svg
new file mode 100644
index 0000000000..20bbacb2eb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown.svg
new file mode 100644
index 0000000000..8ad5f1464a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-crown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cupcake.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cupcake.svg
new file mode 100644
index 0000000000..de3a7c7c81
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cupcake.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-curve.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-curve.svg
new file mode 100644
index 0000000000..ac749474d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-curve.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cut.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cut.svg
new file mode 100644
index 0000000000..63d892780c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-cut.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dashboard.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dashboard.svg
new file mode 100644
index 0000000000..13cd3bfa96
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-defrag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-defrag.svg
new file mode 100644
index 0000000000..e26de351e9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-defrag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete-key.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete-key.svg
new file mode 100644
index 0000000000..c738e7c8cf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete-key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete.svg
new file mode 100644
index 0000000000..1d931cc09b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-delete.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-departure.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-departure.svg
new file mode 100644
index 0000000000..243f789b80
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-departure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desk.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desk.svg
new file mode 100644
index 0000000000..270e0f1dff
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desktop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desktop.svg
new file mode 100644
index 0000000000..de5366b44b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-desktop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagnostics.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagnostics.svg
new file mode 100644
index 0000000000..66e2b4c653
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagnostics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow-alt.svg
new file mode 100644
index 0000000000..fb4970d319
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow.svg
new file mode 100644
index 0000000000..c10853ffcc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diagonal-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamond.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamond.svg
new file mode 100644
index 0000000000..e831ae1172
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamond.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamonds.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamonds.svg
new file mode 100644
index 0000000000..bf1cd0b8a4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diamonds.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dice.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dice.svg
new file mode 100644
index 0000000000..bbb86cf68d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dice.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma-alt.svg
new file mode 100644
index 0000000000..b4a5fcfeb9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma.svg
new file mode 100644
index 0000000000..31b542d112
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-diploma.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions-alt.svg
new file mode 100644
index 0000000000..4a07354199
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions.svg
new file mode 100644
index 0000000000..a56100bb2a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-directions.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disc.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disc.svg
new file mode 100644
index 0000000000..8f694bc43f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disk-image.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disk-image.svg
new file mode 100644
index 0000000000..80a69f30d0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-disk-image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-display.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-display.svg
new file mode 100644
index 0000000000..22cf1ef0eb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-display.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dna.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dna.svg
new file mode 100644
index 0000000000..a4cc100411
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dna.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dock-connector.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dock-connector.svg
new file mode 100644
index 0000000000..82480deaa1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dock-connector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document-dashed-line.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document-dashed-line.svg
new file mode 100644
index 0000000000..6117d4c7f4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document-dashed-line.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document.svg
new file mode 100644
index 0000000000..d2da15ad9e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-document.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-documents.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-documents.svg
new file mode 100644
index 0000000000..4e56ca7b49
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-documents.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dollar-bag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dollar-bag.svg
new file mode 100644
index 0000000000..bc9dcb83cf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-dollar-bag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-donate.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-donate.svg
new file mode 100644
index 0000000000..c2669c3a5c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-donate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open-alt.svg
new file mode 100644
index 0000000000..57552cc455
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open.svg
new file mode 100644
index 0000000000..02339e4b8b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-door-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download-alt.svg
new file mode 100644
index 0000000000..3b788ff610
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download.svg
new file mode 100644
index 0000000000..a328fe65f7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-drop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-drop.svg
new file mode 100644
index 0000000000..7523004cad
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-drop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eco.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eco.svg
new file mode 100644
index 0000000000..dad4c564c0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eco.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-economy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-economy.svg
new file mode 100644
index 0000000000..4e710b572a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-economy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-edit.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-edit.svg
new file mode 100644
index 0000000000..2faeea0891
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eject.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eject.svg
new file mode 100644
index 0000000000..5f74a4ccc1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eject.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-employee.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-employee.svg
new file mode 100644
index 0000000000..b1c4877b2b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-employee.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-energy-saving-bulb.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-energy-saving-bulb.svg
new file mode 100644
index 0000000000..a45bbf5f4f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-energy-saving-bulb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-enter.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-enter.svg
new file mode 100644
index 0000000000..4dc8c5af3d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-enter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-equalizer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-equalizer.svg
new file mode 100644
index 0000000000..64b43e8537
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-equalizer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-escape.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-escape.svg
new file mode 100644
index 0000000000..edb544f9d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-escape.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ethernet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ethernet.svg
new file mode 100644
index 0000000000..2b16efe994
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ethernet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-euro-bag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-euro-bag.svg
new file mode 100644
index 0000000000..cb19eafeb9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-euro-bag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-exit-fullscreen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-exit-fullscreen.svg
new file mode 100644
index 0000000000..820c79522d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eye.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eye.svg
new file mode 100644
index 0000000000..8ea896a1f4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-facebook-like.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-facebook-like.svg
new file mode 100644
index 0000000000..0f27d54a06
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-facebook-like.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-factory.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-factory.svg
new file mode 100644
index 0000000000..855727aad5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-factory.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-favorite.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-favorite.svg
new file mode 100644
index 0000000000..5fee2201b0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-favorite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-female-symbol.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-female-symbol.svg
new file mode 100644
index 0000000000..9e003e51e5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-female-symbol.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-file-cabinet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-file-cabinet.svg
new file mode 100644
index 0000000000..8d34dc684f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-file-cabinet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-files.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-files.svg
new file mode 100644
index 0000000000..228b54980d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-files.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter-arrows.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter-arrows.svg
new file mode 100644
index 0000000000..2f17186e0c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter-arrows.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter.svg
new file mode 100644
index 0000000000..41a89b3eb0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-filter.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fingerprint.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fingerprint.svg
new file mode 100644
index 0000000000..b80eebd81c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fingerprint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fire.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fire.svg
new file mode 100644
index 0000000000..b0811f59f0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fire.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewall.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewall.svg
new file mode 100644
index 0000000000..b857e4349e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewall.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewire.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewire.svg
new file mode 100644
index 0000000000..64807e9110
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-firewire.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag-alt.svg
new file mode 100644
index 0000000000..16d5b65bb6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag.svg
new file mode 100644
index 0000000000..3665770b99
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flash.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flash.svg
new file mode 100644
index 0000000000..f37a9e3483
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flashlight.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flashlight.svg
new file mode 100644
index 0000000000..4610c03a5b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flashlight.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flowerpot.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flowerpot.svg
new file mode 100644
index 0000000000..0524daab90
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-flowerpot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-open.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-open.svg
new file mode 100644
index 0000000000..44de932cfd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-outline.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-outline.svg
new file mode 100644
index 0000000000..77059225c7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder-outline.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder.svg
new file mode 100644
index 0000000000..ce20ed705e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folders.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folders.svg
new file mode 100644
index 0000000000..08875280e9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-folders.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-font.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-font.svg
new file mode 100644
index 0000000000..91689c5b49
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-font.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-food.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-food.svg
new file mode 100644
index 0000000000..d39b58346a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-food.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-footprints.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-footprints.svg
new file mode 100644
index 0000000000..118b8dc44f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-footprints.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-forking.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-forking.svg
new file mode 100644
index 0000000000..441dead254
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-forking.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame-alt.svg
new file mode 100644
index 0000000000..24c8834c55
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame.svg
new file mode 100644
index 0000000000..6d48f3165d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-frame.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen-alt.svg
new file mode 100644
index 0000000000..c2145c8171
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen.svg
new file mode 100644
index 0000000000..a63101cfe0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-game.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-game.svg
new file mode 100644
index 0000000000..78797b5601
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-game.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-geometry.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-geometry.svg
new file mode 100644
index 0000000000..c7ed79e0a1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-geometry.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gift.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gift.svg
new file mode 100644
index 0000000000..4e2030a6f1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gift.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-glasses.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-glasses.svg
new file mode 100644
index 0000000000..72b7c8b05b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-glasses.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-alt.svg
new file mode 100644
index 0000000000..b02f41ad97
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-asia.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-asia.svg
new file mode 100644
index 0000000000..6a7334d5e8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-asia.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-europe-africa.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-europe-africa.svg
new file mode 100644
index 0000000000..4c9b6fac01
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-europe-africa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-america.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-america.svg
new file mode 100644
index 0000000000..a95c1a1975
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-america.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-asia.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-asia.svg
new file mode 100644
index 0000000000..c62b1e835a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-asia.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-europe-africa.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-europe-africa.svg
new file mode 100644
index 0000000000..af162e7949
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe-inverted-europe-africa.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe.svg
new file mode 100644
index 0000000000..28e4b649be
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gps.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gps.svg
new file mode 100644
index 0000000000..90572f37f6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-gps.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-graduate.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-graduate.svg
new file mode 100644
index 0000000000..81067c4cdb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-graduate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-grid.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-grid.svg
new file mode 100644
index 0000000000..2e363c0c47
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-grid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hammer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hammer.svg
new file mode 100644
index 0000000000..dfafc27d3c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hammer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active-alt.svg
new file mode 100644
index 0000000000..102ae217cf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active.svg
new file mode 100644
index 0000000000..49612abea3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer-alt.svg
new file mode 100644
index 0000000000..3e1185fe73
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer.svg
new file mode 100644
index 0000000000..a002ace0f3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hand-pointer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handprint.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handprint.svg
new file mode 100644
index 0000000000..c9c254204b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handprint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handshake.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handshake.svg
new file mode 100644
index 0000000000..b83e3bf315
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handshake.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool-alt.svg
new file mode 100644
index 0000000000..1464083b74
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool.svg
new file mode 100644
index 0000000000..2202ced6d6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-handtool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive-alt.svg
new file mode 100644
index 0000000000..89ce2fea0e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive.svg
new file mode 100644
index 0000000000..98a2a993d4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hard-drive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hat.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hat.svg
new file mode 100644
index 0000000000..c8a1106446
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hd.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hd.svg
new file mode 100644
index 0000000000..77bf64d4fa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headphones.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headphones.svg
new file mode 100644
index 0000000000..811c656c7e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headphones.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headset.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headset.svg
new file mode 100644
index 0000000000..98db2e30db
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-headset.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hearts.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hearts.svg
new file mode 100644
index 0000000000..c2edaafe03
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hearts.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-height.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-height.svg
new file mode 100644
index 0000000000..bf6a75975b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-height.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help-alt.svg
new file mode 100644
index 0000000000..101c65318d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help.svg
new file mode 100644
index 0000000000..a1c5fdc7c1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-help.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-home.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-home.svg
new file mode 100644
index 0000000000..ebb93f4056
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-home.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hourglass.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hourglass.svg
new file mode 100644
index 0000000000..c918b5407b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-hourglass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-imac.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-imac.svg
new file mode 100644
index 0000000000..76a01b97b8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-imac.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inactive-line.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inactive-line.svg
new file mode 100644
index 0000000000..60a16437c2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inactive-line.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox-full.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox-full.svg
new file mode 100644
index 0000000000..c0beabfa29
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox-full.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox.svg
new file mode 100644
index 0000000000..0fd7c71b22
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-inbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-indent.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-indent.svg
new file mode 100644
index 0000000000..329b0f413e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-indent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-infinity.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-infinity.svg
new file mode 100644
index 0000000000..c42e3bd49e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-infinity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-info.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-info.svg
new file mode 100644
index 0000000000..f07ac8e7d1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-invoice.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-invoice.svg
new file mode 100644
index 0000000000..dd8457a63a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-invoice.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ipad.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ipad.svg
new file mode 100644
index 0000000000..e79195e670
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ipad.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-iphone.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-iphone.svg
new file mode 100644
index 0000000000..b235644b03
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-iphone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-item-arrangement.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-item-arrangement.svg
new file mode 100644
index 0000000000..fd9939dba3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-item-arrangement.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-junk.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-junk.svg
new file mode 100644
index 0000000000..a8f48754d4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-junk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-key.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-key.svg
new file mode 100644
index 0000000000..4a32d0004e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyboard.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyboard.svg
new file mode 100644
index 0000000000..c08d8d9e93
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keychain.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keychain.svg
new file mode 100644
index 0000000000..e206a9150e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keychain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyhole.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyhole.svg
new file mode 100644
index 0000000000..b97b156002
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-keyhole.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lab.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lab.svg
new file mode 100644
index 0000000000..b750677812
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-laptop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-laptop.svg
new file mode 100644
index 0000000000..dc120cca29
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-laptop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers-alt.svg
new file mode 100644
index 0000000000..e02a1cadbf
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers.svg
new file mode 100644
index 0000000000..c6965e3e95
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layout.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layout.svg
new file mode 100644
index 0000000000..355f314f0f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-layout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-left-double-arrow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-left-double-arrow.svg
new file mode 100644
index 0000000000..0958c291da
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-left-double-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-legal.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-legal.svg
new file mode 100644
index 0000000000..e4ea59375e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-legal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lense.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lense.svg
new file mode 100644
index 0000000000..229a7749bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lense.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-library.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-library.svg
new file mode 100644
index 0000000000..1551dec3c9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-library.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-down.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-down.svg
new file mode 100644
index 0000000000..c214226f59
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-up.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-up.svg
new file mode 100644
index 0000000000..dbac39d507
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-light-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb-active.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb-active.svg
new file mode 100644
index 0000000000..522460a54c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb-active.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb.svg
new file mode 100644
index 0000000000..2d67f238ee
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightbulb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightning.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightning.svg
new file mode 100644
index 0000000000..4f8b5a1146
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lightning.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-link.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-link.svg
new file mode 100644
index 0000000000..2bb9b95c01
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-linux-tux.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-linux-tux.svg
new file mode 100644
index 0000000000..cd90e979cd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-linux-tux.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-list.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-list.svg
new file mode 100644
index 0000000000..78a748f1a1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-load.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-load.svg
new file mode 100644
index 0000000000..6f4ac6197c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-load.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loading.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loading.svg
new file mode 100644
index 0000000000..91372f4e34
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loading.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-locate.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-locate.svg
new file mode 100644
index 0000000000..b6d715d2f0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-locate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-near-me.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-near-me.svg
new file mode 100644
index 0000000000..69028bf985
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-near-me.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-nearby.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-nearby.svg
new file mode 100644
index 0000000000..884edb711b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-location-nearby.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lock.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lock.svg
new file mode 100644
index 0000000000..8f94c7cb96
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-log-out.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-log-out.svg
new file mode 100644
index 0000000000..07c4ae9856
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-log-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-logout.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-logout.svg
new file mode 100644
index 0000000000..e3eb856a9a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-logout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loupe.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loupe.svg
new file mode 100644
index 0000000000..ab5137dc24
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-loupe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-magnet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-magnet.svg
new file mode 100644
index 0000000000..b7c9ed6ab1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-magnet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mailbox.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mailbox.svg
new file mode 100644
index 0000000000..e55cdc452c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mailbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-and-female.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-and-female.svg
new file mode 100644
index 0000000000..5ddf3b95e1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-and-female.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-symbol.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-symbol.svg
new file mode 100644
index 0000000000..eb91f509f5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-male-symbol.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-alt.svg
new file mode 100644
index 0000000000..fcc39f5bb0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-location.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-location.svg
new file mode 100644
index 0000000000..ad9efb05ed
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-location.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-marker.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-marker.svg
new file mode 100644
index 0000000000..a4f71dc084
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map-marker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map.svg
new file mode 100644
index 0000000000..2c9ae42407
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-map.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medal.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medal.svg
new file mode 100644
index 0000000000..c97ccf0f32
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medical-emergency.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medical-emergency.svg
new file mode 100644
index 0000000000..0265c28988
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medical-emergency.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medicine.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medicine.svg
new file mode 100644
index 0000000000..1e2cb6aeef
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-medicine.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-meeting.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-meeting.svg
new file mode 100644
index 0000000000..09af0d97c2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-meeting.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-megaphone.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-megaphone.svg
new file mode 100644
index 0000000000..25387c9357
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-megaphone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-merge.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-merge.svg
new file mode 100644
index 0000000000..57ac52511a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-merge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-open.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-open.svg
new file mode 100644
index 0000000000..98aaeeeb64
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-unopened.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-unopened.svg
new file mode 100644
index 0000000000..e29ecbf60d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message-unopened.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message.svg
new file mode 100644
index 0000000000..75785c1896
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-microscope.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-microscope.svg
new file mode 100644
index 0000000000..9985552be3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-microscope.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mindmap.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mindmap.svg
new file mode 100644
index 0000000000..043927014b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mindmap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mobile.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mobile.svg
new file mode 100644
index 0000000000..92532b8005
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mobile.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular-network.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular-network.svg
new file mode 100644
index 0000000000..20d87126aa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular-network.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular.svg
new file mode 100644
index 0000000000..904e0976c3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-molecular.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mountain.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mountain.svg
new file mode 100644
index 0000000000..a21324f819
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mountain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse-cursor.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse-cursor.svg
new file mode 100644
index 0000000000..b64dd7f88b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse-cursor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse.svg
new file mode 100644
index 0000000000..f063df5259
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-mouse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie-alt.svg
new file mode 100644
index 0000000000..1878dc9ec0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie.svg
new file mode 100644
index 0000000000..d5b3481a83
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-movie.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-credit-cards.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-credit-cards.svg
new file mode 100644
index 0000000000..1330826784
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-credit-cards.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-windows.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-windows.svg
new file mode 100644
index 0000000000..c8b3ac5669
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-multiple-windows.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-music.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-music.svg
new file mode 100644
index 0000000000..87f4ba36a6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-music.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-name-badge.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-name-badge.svg
new file mode 100644
index 0000000000..22f66c9234
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-name-badge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-bottom.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-bottom.svg
new file mode 100644
index 0000000000..eeb3e79bdc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-bottom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-down.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-down.svg
new file mode 100644
index 0000000000..007e8dd8ff
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-first.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-first.svg
new file mode 100644
index 0000000000..85d44722ee
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-first.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-horizontal.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-horizontal.svg
new file mode 100644
index 0000000000..4988e723eb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-horizontal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-last.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-last.svg
new file mode 100644
index 0000000000..53f70d36fd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-last.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-left.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-left.svg
new file mode 100644
index 0000000000..56cdecce10
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-right.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-right.svg
new file mode 100644
index 0000000000..251b6934d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-road.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-road.svg
new file mode 100644
index 0000000000..f05567099f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-road.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-top.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-top.svg
new file mode 100644
index 0000000000..c932714737
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-top.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-up.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-up.svg
new file mode 100644
index 0000000000..612ec9193e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-vertical.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-vertical.svg
new file mode 100644
index 0000000000..fbe3906472
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation-vertical.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation.svg
new file mode 100644
index 0000000000..67d9c2a0c2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigational-arrow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigational-arrow.svg
new file mode 100644
index 0000000000..bf60bde293
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-navigational-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-network-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-network-alt.svg
new file mode 100644
index 0000000000..e6b2c25036
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-network-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper-alt.svg
new file mode 100644
index 0000000000..1bcf422c64
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper.svg
new file mode 100644
index 0000000000..d585513f28
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-newspaper.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next-media.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next-media.svg
new file mode 100644
index 0000000000..57d4c8e0e3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next-media.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next.svg
new file mode 100644
index 0000000000..b00b37dd17
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-next.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-nodes.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-nodes.svg
new file mode 100644
index 0000000000..e912e52d15
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-nodes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad-alt.svg
new file mode 100644
index 0000000000..bca4d0c462
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad.svg
new file mode 100644
index 0000000000..5fc428082e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-notepad.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-key.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-key.svg
new file mode 100644
index 0000000000..a4003027a4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-phone.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-phone.svg
new file mode 100644
index 0000000000..8eb7804e74
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-old-phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-operator.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-operator.svg
new file mode 100644
index 0000000000..ad78b8602f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-operator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ordered-list.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ordered-list.svg
new file mode 100644
index 0000000000..de140283b8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ordered-list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-os-x.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-os-x.svg
new file mode 100644
index 0000000000..170f3aad47
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-os-x.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-out.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-out.svg
new file mode 100644
index 0000000000..73d2cfe147
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outbox.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outbox.svg
new file mode 100644
index 0000000000..3b59c93933
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outdent.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outdent.svg
new file mode 100644
index 0000000000..85ff01f440
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-outdent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-add.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-add.svg
new file mode 100644
index 0000000000..538defed20
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-down.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-down.svg
new file mode 100644
index 0000000000..2fae28dfd9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-remove.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-remove.svg
new file mode 100644
index 0000000000..c5009604d4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-restricted.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-restricted.svg
new file mode 100644
index 0000000000..4a7c8696e2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-restricted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-up.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-up.svg
new file mode 100644
index 0000000000..db6ad88927
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-page-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paint-roller.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paint-roller.svg
new file mode 100644
index 0000000000..59665d6232
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paint-roller.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-palette.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-palette.svg
new file mode 100644
index 0000000000..26c9f7f6b2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-palette.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-panel-show.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-panel-show.svg
new file mode 100644
index 0000000000..91c3e9f0ca
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-panel-show.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pannel-close.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pannel-close.svg
new file mode 100644
index 0000000000..8006a60541
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pannel-close.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pants.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pants.svg
new file mode 100644
index 0000000000..9604660ce0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pants.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-bag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-bag.svg
new file mode 100644
index 0000000000..e7435caf75
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-bag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane-alt.svg
new file mode 100644
index 0000000000..2c4259e954
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane.svg
new file mode 100644
index 0000000000..fe60af779b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paper-plane.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parachute-drop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parachute-drop.svg
new file mode 100644
index 0000000000..cdd4a501d7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parachute-drop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parental-control.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parental-control.svg
new file mode 100644
index 0000000000..3a19170b80
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-parental-control.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-partly-cloudy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-partly-cloudy.svg
new file mode 100644
index 0000000000..57af81127e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-partly-cloudy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paste-in.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paste-in.svg
new file mode 100644
index 0000000000..eae1a1bd12
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-paste-in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-path.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-path.svg
new file mode 100644
index 0000000000..a8f5df6e4c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-path.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pause.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pause.svg
new file mode 100644
index 0000000000..7d9dce3838
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pause.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pc.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pc.svg
new file mode 100644
index 0000000000..a8c8196797
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt-2.svg
new file mode 100644
index 0000000000..4aa84eae75
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt.svg
new file mode 100644
index 0000000000..7f129069c7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-female.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-female.svg
new file mode 100644
index 0000000000..0cf6088418
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people-female.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people.svg
new file mode 100644
index 0000000000..ab861f8814
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone-ring.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone-ring.svg
new file mode 100644
index 0000000000..1797603bbc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone-ring.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone.svg
new file mode 100644
index 0000000000..085e41600e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-photo-album.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-photo-album.svg
new file mode 100644
index 0000000000..532615bf2a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-photo-album.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-picture.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-picture.svg
new file mode 100644
index 0000000000..9250074063
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-picture.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt-2.svg
new file mode 100644
index 0000000000..4bc1120750
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt.svg
new file mode 100644
index 0000000000..eee91913ed
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures.svg
new file mode 100644
index 0000000000..8844e068b2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pictures.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pie-chart.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pie-chart.svg
new file mode 100644
index 0000000000..1db73f63d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pie-chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piggy-bank.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piggy-bank.svg
new file mode 100644
index 0000000000..45c74819f8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piggy-bank.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pin-location.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pin-location.svg
new file mode 100644
index 0000000000..5907d6e541
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pin-location.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piracy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piracy.svg
new file mode 100644
index 0000000000..577d04e517
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-piracy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plane.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plane.svg
new file mode 100644
index 0000000000..c09d4522e2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plane.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-planet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-planet.svg
new file mode 100644
index 0000000000..455ce2da3a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-planet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-play.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-play.svg
new file mode 100644
index 0000000000..3a041b7e2b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-play.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playing-cards.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playing-cards.svg
new file mode 100644
index 0000000000..132d264d5b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playing-cards.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playlist.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playlist.svg
new file mode 100644
index 0000000000..0492601307
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-playlist.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plugin.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plugin.svg
new file mode 100644
index 0000000000..c88e396dfa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-plugin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-podcast.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-podcast.svg
new file mode 100644
index 0000000000..796c263f0a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-podcast.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poker-chip.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poker-chip.svg
new file mode 100644
index 0000000000..6f3698bd66
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poker-chip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poll.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poll.svg
new file mode 100644
index 0000000000..089fa647d1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-poll.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-post-it.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-post-it.svg
new file mode 100644
index 0000000000..61a2787df8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-post-it.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pound-bag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pound-bag.svg
new file mode 100644
index 0000000000..dfb460d22a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pound-bag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power-outlet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power-outlet.svg
new file mode 100644
index 0000000000..41e3e51e20
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power-outlet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power.svg
new file mode 100644
index 0000000000..9c4fb4b087
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-power.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-presentation.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-presentation.svg
new file mode 100644
index 0000000000..59e720c81e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-presentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous-media.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous-media.svg
new file mode 100644
index 0000000000..656c29d14c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous-media.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous.svg
new file mode 100644
index 0000000000..f858829633
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-previous.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-dollar.svg
new file mode 100644
index 0000000000..72d42718a9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-euro.svg
new file mode 100644
index 0000000000..0c437bc769
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-pound.svg
new file mode 100644
index 0000000000..0858462da8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-yen.svg
new file mode 100644
index 0000000000..96c3917842
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-price-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-print.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-print.svg
new file mode 100644
index 0000000000..3bce86bedd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-print.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-printer-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-printer-alt.svg
new file mode 100644
index 0000000000..050ec1d81c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-printer-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-projector.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-projector.svg
new file mode 100644
index 0000000000..afc95283c3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-projector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pulse.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pulse.svg
new file mode 100644
index 0000000000..8a655631af
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pulse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pushpin.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pushpin.svg
new file mode 100644
index 0000000000..586bf4fdc0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-pushpin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg
new file mode 100644
index 0000000000..bdbf3d64fb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-qr-code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-quote.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-quote.svg
new file mode 100644
index 0000000000..16746643b6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-quote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-alt.svg
new file mode 100644
index 0000000000..c7dcf65677
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-receiver.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-receiver.svg
new file mode 100644
index 0000000000..a3bea41462
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio-receiver.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio.svg
new file mode 100644
index 0000000000..2cf8718a2e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rain.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rain.svg
new file mode 100644
index 0000000000..0007d98d6c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rate.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rate.svg
new file mode 100644
index 0000000000..aac2ba0481
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-re-post.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-re-post.svg
new file mode 100644
index 0000000000..80b7a9673d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-re-post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-readonly.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-readonly.svg
new file mode 100644
index 0000000000..b0840b5171
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-readonly.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-alt.svg
new file mode 100644
index 0000000000..d7b6f5e860
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-dollar.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-dollar.svg
new file mode 100644
index 0000000000..6784c6e8df
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-euro.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-euro.svg
new file mode 100644
index 0000000000..82e99b2eec
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-pound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-pound.svg
new file mode 100644
index 0000000000..b28cf9e00d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-yen.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-yen.svg
new file mode 100644
index 0000000000..529fd87d4e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-receipt-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reception.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reception.svg
new file mode 100644
index 0000000000..01a61f4ae9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reception.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-record.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-record.svg
new file mode 100644
index 0000000000..5a928928d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-record.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-redo.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-redo.svg
new file mode 100644
index 0000000000..b1fcfc01d6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-redo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-refresh.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-refresh.svg
new file mode 100644
index 0000000000..b3c932583f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-refresh.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remote.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remote.svg
new file mode 100644
index 0000000000..ff3d1de672
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remote.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remove.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remove.svg
new file mode 100644
index 0000000000..97bff0169f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat-one.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat-one.svg
new file mode 100644
index 0000000000..054185177f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat-one.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat.svg
new file mode 100644
index 0000000000..68e7b30f8a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-repeat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reply-arrow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reply-arrow.svg
new file mode 100644
index 0000000000..fd708c5173
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-reply-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-resize.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-resize.svg
new file mode 100644
index 0000000000..e26e9fb196
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-resize.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-return-to-top.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-return-to-top.svg
new file mode 100644
index 0000000000..15e5d82289
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-return-to-top.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-right-double-arrow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-right-double-arrow.svg
new file mode 100644
index 0000000000..a8f4a03cb7
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-right-double-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-road.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-road.svg
new file mode 100644
index 0000000000..e9dedee5bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-road.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-roadsign.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-roadsign.svg
new file mode 100644
index 0000000000..4115c305c4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-roadsign.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rocket.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rocket.svg
new file mode 100644
index 0000000000..5fab3cf1ba
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rocket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rss.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rss.svg
new file mode 100644
index 0000000000..96a210c20c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-rss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler-alt.svg
new file mode 100644
index 0000000000..695d110031
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler.svg
new file mode 100644
index 0000000000..15eff181d8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ruler.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safe.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safe.svg
new file mode 100644
index 0000000000..9bdce49ca5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safedial.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safedial.svg
new file mode 100644
index 0000000000..da9a6a6275
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-safedial.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sandbox-toys.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sandbox-toys.svg
new file mode 100644
index 0000000000..727e62cc18
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sandbox-toys.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-satellite-dish.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-satellite-dish.svg
new file mode 100644
index 0000000000..235d67c316
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-satellite-dish.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-save.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-save.svg
new file mode 100644
index 0000000000..c4a56c7268
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-save.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scan.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scan.svg
new file mode 100644
index 0000000000..de0a84c4b6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-school.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-school.svg
new file mode 100644
index 0000000000..216a3ff764
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-school.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-screensharing.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-screensharing.svg
new file mode 100644
index 0000000000..065d04c278
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-screensharing.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script-alt.svg
new file mode 100644
index 0000000000..4efc77d194
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script.svg
new file mode 100644
index 0000000000..224b12e0a4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-script.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scull.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scull.svg
new file mode 100644
index 0000000000..fc2d5cc4b2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-scull.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-search.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-search.svg
new file mode 100644
index 0000000000..1e0715b800
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-security-camera.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-security-camera.svg
new file mode 100644
index 0000000000..09bb6613aa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-security-camera.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sensor.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sensor.svg
new file mode 100644
index 0000000000..a73de18bb1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sensor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server-alt.svg
new file mode 100644
index 0000000000..e1d6a449a5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server.svg
new file mode 100644
index 0000000000..04636e254a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt-2.svg
new file mode 100644
index 0000000000..da84deb9e5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt.svg
new file mode 100644
index 0000000000..ab9eb44951
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings.svg
new file mode 100644
index 0000000000..6311ad6122
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt-2.svg
new file mode 100644
index 0000000000..6f220aaa6d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt.svg
new file mode 100644
index 0000000000..7cff7b3840
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share.svg
new file mode 100644
index 0000000000..2e4584a775
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-share.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sharing-iphone.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sharing-iphone.svg
new file mode 100644
index 0000000000..04d34e0fe3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sharing-iphone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shield.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shield.svg
new file mode 100644
index 0000000000..f34195c7d4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shield.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shift.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shift.svg
new file mode 100644
index 0000000000..3d6f9aea9d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shift.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping-box.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping-box.svg
new file mode 100644
index 0000000000..66e12cea40
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping-box.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping.svg
new file mode 100644
index 0000000000..102cb0be70
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shipping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shoe.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shoe.svg
new file mode 100644
index 0000000000..f784c832a6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shoe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt-2.svg
new file mode 100644
index 0000000000..06beb2dc40
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt.svg
new file mode 100644
index 0000000000..5cdd20bf19
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket.svg
new file mode 100644
index 0000000000..71cdd1de20
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shopping-basket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shorts.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shorts.svg
new file mode 100644
index 0000000000..e3f8ab2625
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shorts.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shuffle.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shuffle.svg
new file mode 100644
index 0000000000..546f0a2965
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-shuffle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sience.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sience.svg
new file mode 100644
index 0000000000..e692a2ec0c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sience.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-simcard.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-simcard.svg
new file mode 100644
index 0000000000..a65fc9ffb5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-simcard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-single-note.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-single-note.svg
new file mode 100644
index 0000000000..f98a14c285
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-single-note.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sitemap.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sitemap.svg
new file mode 100644
index 0000000000..0cbd6659a4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sitemap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sleep.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sleep.svg
new file mode 100644
index 0000000000..c85ac0dc8a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sleep.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-slideshow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-slideshow.svg
new file mode 100644
index 0000000000..484e86cd28
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-slideshow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley-inverted.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley-inverted.svg
new file mode 100644
index 0000000000..8c2bc19928
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley-inverted.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley.svg
new file mode 100644
index 0000000000..5504a545cd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-smiley.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-snow.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-snow.svg
new file mode 100644
index 0000000000..2ba7134a91
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-snow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-low.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-low.svg
new file mode 100644
index 0000000000..1a5abc0193
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-low.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-medium.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-medium.svg
new file mode 100644
index 0000000000..d6497c7c88
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-medium.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-off.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-off.svg
new file mode 100644
index 0000000000..173ea47692
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-off.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-waves.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-waves.svg
new file mode 100644
index 0000000000..cf21b5606b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound-waves.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound.svg
new file mode 100644
index 0000000000..ff3ba17166
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-spades.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-spades.svg
new file mode 100644
index 0000000000..f97a5457f8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-spades.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speaker.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speaker.svg
new file mode 100644
index 0000000000..dc922a00d3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speaker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speed-gauge.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speed-gauge.svg
new file mode 100644
index 0000000000..ce52283ddb
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-speed-gauge.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split-alt.svg
new file mode 100644
index 0000000000..a5ad049940
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split.svg
new file mode 100644
index 0000000000..1bdfd8a66b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-split.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sprout.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sprout.svg
new file mode 100644
index 0000000000..1d139dd355
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sprout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-squiggly-line.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-squiggly-line.svg
new file mode 100644
index 0000000000..2c88881018
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-squiggly-line.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ssd.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ssd.svg
new file mode 100644
index 0000000000..483398df2d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ssd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stacked-disks.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stacked-disks.svg
new file mode 100644
index 0000000000..0c6fb6e8d1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stacked-disks.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stamp.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stamp.svg
new file mode 100644
index 0000000000..2468ef2c74
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stamp.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-alt.svg
new file mode 100644
index 0000000000..ed61a5b6cc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-hand.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-hand.svg
new file mode 100644
index 0000000000..3742256b80
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop-hand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop.svg
new file mode 100644
index 0000000000..6b61d9904b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-store.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-store.svg
new file mode 100644
index 0000000000..3a9618fef2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-store.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stream.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stream.svg
new file mode 100644
index 0000000000..97ea6bed56
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-stream.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sunny.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sunny.svg
new file mode 100644
index 0000000000..07391fec24
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sunny.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sweatshirt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sweatshirt.svg
new file mode 100644
index 0000000000..3b33e88738
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sweatshirt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sync.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sync.svg
new file mode 100644
index 0000000000..b3e8e396bc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-sync.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-t-shirt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-t-shirt.svg
new file mode 100644
index 0000000000..860762bf35
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-t-shirt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab-key.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab-key.svg
new file mode 100644
index 0000000000..dcd4d918c8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab-key.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab.svg
new file mode 100644
index 0000000000..a03fd4e379
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tactics.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tactics.svg
new file mode 100644
index 0000000000..ba1a383471
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tactics.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tag.svg
new file mode 100644
index 0000000000..ffeadcc433
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tags.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tags.svg
new file mode 100644
index 0000000000..681f38712d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tags.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-takeaway-cup.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-takeaway-cup.svg
new file mode 100644
index 0000000000..5360908485
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-takeaway-cup.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-target.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-target.svg
new file mode 100644
index 0000000000..f61b84adc6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-target.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperatrure-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperatrure-alt.svg
new file mode 100644
index 0000000000..235b8a1eb9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperatrure-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperature.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperature.svg
new file mode 100644
index 0000000000..fa6c7859fa
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-temperature.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-terminal.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-terminal.svg
new file mode 100644
index 0000000000..edb6b159e0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-terminal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theater.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theater.svg
new file mode 100644
index 0000000000..b3a293ab48
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theater.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theif.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theif.svg
new file mode 100644
index 0000000000..f3b3ec69ad
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-theif.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thought-bubble.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thought-bubble.svg
new file mode 100644
index 0000000000..59b9b71150
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thought-bubble.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-down.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-down.svg
new file mode 100644
index 0000000000..933450deab
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-down.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-up.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-up.svg
new file mode 100644
index 0000000000..1068c845bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumb-up.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnail-list.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnail-list.svg
new file mode 100644
index 0000000000..c6ddb31ec2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnail-list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails-small.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails-small.svg
new file mode 100644
index 0000000000..ced7db6e71
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails-small.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails.svg
new file mode 100644
index 0000000000..b8800a7000
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-thumbnails.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ticket.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ticket.svg
new file mode 100644
index 0000000000..b69e61beec
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-ticket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-time.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-time.svg
new file mode 100644
index 0000000000..cd65d62e2e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-timer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-timer.svg
new file mode 100644
index 0000000000..f93538095b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-timer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tools.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tools.svg
new file mode 100644
index 0000000000..a8a1aec10f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-top.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-top.svg
new file mode 100644
index 0000000000..2bea18be1e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-top.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-traffic-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-traffic-alt.svg
new file mode 100644
index 0000000000..9cb29dfaa0
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-traffic-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trafic.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trafic.svg
new file mode 100644
index 0000000000..420832c521
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trafic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-train.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-train.svg
new file mode 100644
index 0000000000..b1de2d26e1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-train.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt-2.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt-2.svg
new file mode 100644
index 0000000000..8bb390a394
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt-2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt.svg
new file mode 100644
index 0000000000..5fba12abc3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash.svg
new file mode 100644
index 0000000000..abae234837
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tree.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tree.svg
new file mode 100644
index 0000000000..8da9048412
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trophy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trophy.svg
new file mode 100644
index 0000000000..75229f89a8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-trophy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-truck.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-truck.svg
new file mode 100644
index 0000000000..112c57941f
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-truck.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv-old.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv-old.svg
new file mode 100644
index 0000000000..6bde7d04ac
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv-old.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv.svg
new file mode 100644
index 0000000000..d3fc2d2cd9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-tv.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-content.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-content.svg
new file mode 100644
index 0000000000..3ee9892c48
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-content.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-contour.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-contour.svg
new file mode 100644
index 0000000000..2590acf88d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-contour.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-deploy.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-deploy.svg
new file mode 100644
index 0000000000..37c500ddd3
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-deploy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-developer.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-developer.svg
new file mode 100644
index 0000000000..f99365c4b4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-developer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-media.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-media.svg
new file mode 100644
index 0000000000..9230e040bd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-media.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-members.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-members.svg
new file mode 100644
index 0000000000..9193b6baa6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-members.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-settings.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-settings.svg
new file mode 100644
index 0000000000..554ecdef32
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-users.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-users.svg
new file mode 100644
index 0000000000..f8ef77731c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umb-users.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umbrella.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umbrella.svg
new file mode 100644
index 0000000000..620eac158a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-umbrella.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-undo.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-undo.svg
new file mode 100644
index 0000000000..ca5152f6da
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-undo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-universal.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-universal.svg
new file mode 100644
index 0000000000..49118f2935
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-universal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-unlocked.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-unlocked.svg
new file mode 100644
index 0000000000..2254dfc910
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-unlocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-untitled.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-untitled.svg
new file mode 100644
index 0000000000..4e621d71c1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-untitled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb-connector.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb-connector.svg
new file mode 100644
index 0000000000..0d97d4094d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb-connector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb.svg
new file mode 100644
index 0000000000..7478d50f9e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-usb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-female.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-female.svg
new file mode 100644
index 0000000000..61b554428b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-female.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females-alt.svg
new file mode 100644
index 0000000000..e4813ece0b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females.svg
new file mode 100644
index 0000000000..b4f9776fa5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-females.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-glasses.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-glasses.svg
new file mode 100644
index 0000000000..3816df4ce6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user-glasses.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user.svg
new file mode 100644
index 0000000000..9f46a9853d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users-alt.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users-alt.svg
new file mode 100644
index 0000000000..6d87232e4d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users-alt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users.svg
new file mode 100644
index 0000000000..65f0703bcc
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-users.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-utilities.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-utilities.svg
new file mode 100644
index 0000000000..5181d06074
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-utilities.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-vcard.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-vcard.svg
new file mode 100644
index 0000000000..485275849a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-vcard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-video.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-video.svg
new file mode 100644
index 0000000000..48cb996cae
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-video.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-voice.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-voice.svg
new file mode 100644
index 0000000000..786dc7572c
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-voice.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wall-plug.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wall-plug.svg
new file mode 100644
index 0000000000..d7d6d12e26
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wall-plug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wallet.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wallet.svg
new file mode 100644
index 0000000000..36506ede4a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wallet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wand.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wand.svg
new file mode 100644
index 0000000000..beeffe5d4e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wand.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-war.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-war.svg
new file mode 100644
index 0000000000..ae01d407d2
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-war.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-weight.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-weight.svg
new file mode 100644
index 0000000000..cd5f49fbb8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-weight.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-width.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-width.svg
new file mode 100644
index 0000000000..77864d37b5
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-width.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wifi.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wifi.svg
new file mode 100644
index 0000000000..0118ed13b1
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wifi.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-popin.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-popin.svg
new file mode 100644
index 0000000000..aec2173f09
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-popin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-sizes.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-sizes.svg
new file mode 100644
index 0000000000..26af884833
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-window-sizes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-windows.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-windows.svg
new file mode 100644
index 0000000000..3e00719e9e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-windows.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wine-glass.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wine-glass.svg
new file mode 100644
index 0000000000..abb0115e23
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wine-glass.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrench.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrench.svg
new file mode 100644
index 0000000000..96040a486e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrench.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrong.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrong.svg
new file mode 100644
index 0000000000..09f0a7376d
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-wrong.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-yen-bag.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-yen-bag.svg
new file mode 100644
index 0000000000..2680a40cca
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-yen-bag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zip.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zip.svg
new file mode 100644
index 0000000000..2691f1c586
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zom-out.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zom-out.svg
new file mode 100644
index 0000000000..8afc74de61
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zom-out.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zoom-in.svg b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zoom-in.svg
new file mode 100644
index 0000000000..df7748938e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/assets/icons/icon-zoom-in.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbappheader.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbappheader.directive.js
index 8efaf0c024..b52b0a5763 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbappheader.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbappheader.directive.js
@@ -1,7 +1,7 @@
(function () {
"use strict";
- function AppHeaderDirective(eventsService, appState, userService, focusService, backdropService) {
+ function AppHeaderDirective(eventsService, appState, userService, focusService, backdropService, overlayService) {
function link(scope, el, attr, ctrl) {
@@ -71,21 +71,17 @@
};
scope.avatarClick = function () {
- if (!scope.userDialog) {
- backdropService.open();
- scope.userDialog = {
- view: "user",
- show: true,
- close: function (oldModel) {
- scope.userDialog.show = false;
- scope.userDialog = null;
- backdropService.close();
- }
- };
- } else {
- scope.userDialog.show = false;
- scope.userDialog = null;
- }
+
+ const dialog = {
+ view: "user",
+ position: "right",
+ name: "overlay-user",
+ close: function () {
+ overlayService.close();
+ }
+ };
+
+ overlayService.open(dialog);
};
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsearch.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsearch.directive.js
index e03e63b68f..42daf1dd75 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsearch.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbsearch.directive.js
@@ -160,7 +160,8 @@
searchService.searchAll(search).then(function (result) {
//result is a dictionary of group Title and it's results
var filtered = {};
- _.each(result, function (value, key) {
+ Object.keys(result).forEach(key => {
+ let value = result[key];
if (value.results.length > 0) {
filtered[key] = value;
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbutton.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbutton.directive.js
index dc012945dd..5e007a7ff4 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbutton.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbutton.directive.js
@@ -55,8 +55,8 @@ Use this directive to render an umbraco button. The directive can be used to gen
@param {callback} action The button action which should be performed when the button is clicked.
-@param {string=} href Url/Path to navigato to.
-@param {string=} type Set the button type ("button" or "submit").
+@param {string=} href Url/Path to navigato to. (requires "type" to be set to "link")
+@param {string=} type Set the button type ("button", "link", "submit").
@param {string=} buttonStyle Set the style of the button. The directive uses the default bootstrap styles ("primary", "info", "success", "warning", "danger", "inverse", "link", "block"). Pass in array to add multple styles [success,block].
@param {string=} state Set a progress state on the button ("init", "busy", "success", "error").
@param {string=} shortcut Set a keyboard shortcut for the button ("ctrl+c").
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbuttonellipsis.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbuttonellipsis.directive.js
new file mode 100644
index 0000000000..67b85c13b9
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbuttonellipsis.directive.js
@@ -0,0 +1,93 @@
+/**
+@ngdoc directive
+@name umbraco.directives.directive:umbButtonEllipsis
+@restrict E
+@scope
+
+@description
+Added in Umbraco version 8.7.0 Use this directive to render an umbraco ellipsis.
+
+
Markup example
+
+
+
+
+
+
+
+
+
+@param {string} text Set the text for the checkbox label.
+@param {string} labelKey Set a dictinary/localization string for the checkbox label
+@param {callback} action Callback when the value of the checkbox change by interaction.
+@param {string} cssClass Set a css class modifier
+@param {string} color Set a hex code like #f5c1bc
+@param {boolean} showText Set to true to show the text. false by default
+@param {domElement} element Highlights a DOM-element (HTML-selector)
+@param {string} state Set the initial state of the component. To have it hidden use hidden
+@param {string} mode Set the mode, which decides how to style the component. "small" and "tab" are currently supported
+**/
+
+(function () {
+ 'use strict';
+
+ function UmbButtonEllipsis($timeout, localizationService) {
+
+ var vm = this;
+
+ vm.$onInit = onInit;
+ vm.clickButton = clickButton;
+
+ function onInit() {
+ setText();
+
+ setColor();
+ }
+
+ function clickButton(event) {
+ if(vm.action) {
+ vm.action({$event: event});
+ }
+ }
+
+ function setText() {
+ if (vm.labelKey) {
+ localizationService.localize(vm.labelKey).then(function (data) {
+ // If a labelKey is passed let's update the returned text if it's does not contain an opening square bracket [
+ if(data.indexOf('[') === -1){
+ vm.text = data;
+ }
+ });
+ }
+ }
+
+ function setColor() {
+ vm.color = vm.color ? vm.color : '#000000';
+ }
+ }
+
+ var component = {
+ templateUrl: 'views/components/buttons/umb-button-ellipsis.html',
+ controller: UmbButtonEllipsis,
+ controllerAs: 'vm',
+ transclude: true,
+ bindings: {
+ text: "@",
+ labelKey: "@?",
+ action: "&",
+ cssClass: "@?",
+ color: "@?",
+ showText: "",
+ element: "@?",
+ state: "@?",
+ mode: "@?"
+ }
+ };
+
+ angular.module('umbraco.directives').component('umbButtonEllipsis', component);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js
index 79cb99cf07..bbda02806e 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbtoggle.directive.js
@@ -78,7 +78,8 @@
scope.inputId = scope.inputId || "umb-toggle_" + String.CreateGuid();
setLabelText();
- // must wait until the current digest cycle is finished before we emit this event on init,
+
+ // Must wait until the current digest cycle is finished before we emit this event on init,
// otherwise other property editors might not yet be ready to receive the event
$timeout(function () {
eventsService.emit("toggleValue", { value: scope.checked });
@@ -86,22 +87,28 @@
}
function setLabelText() {
-
- // set default label for "on"
+
if (scope.labelOn) {
scope.displayLabelOn = scope.labelOn;
- } else {
- localizationService.localize("general_on").then(function (value) {
- scope.displayLabelOn = value;
- });
}
-
- // set default label for "Off"
+
if (scope.labelOff) {
scope.displayLabelOff = scope.labelOff;
- } else {
- localizationService.localize("general_off").then(function (value) {
- scope.displayLabelOff = value;
+ }
+
+ if (scope.displayLabelOn.length === 0 && scope.displayLabelOff.length === 0)
+ {
+ var labelKeys = [
+ "general_on",
+ "general_off"
+ ];
+
+ localizationService.localizeMany(labelKeys).then(function (data) {
+ // Set default label for "On"
+ scope.displayLabelOn = data[0];
+
+ // Set default label for "Off"
+ scope.displayLabelOff = data[1];
});
}
@@ -115,7 +122,6 @@
};
onInit();
-
}
var directive = {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
index 9e51c2565b..826d6b87fc 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
@@ -271,9 +271,15 @@
* @param {any} app the active content app
*/
function createButtons(content) {
+
+ var isBlueprint = content.isBlueprint;
+
+ if ($scope.page.isNew && $location.path().search(/contentBlueprints/i) !== -1) {
+ isBlueprint = true;
+ }
// for trashed and element type items, the save button is the primary action - otherwise it's a secondary action
- $scope.page.saveButtonStyle = content.trashed || content.isElement || content.isBlueprint ? "primary" : "info";
+ $scope.page.saveButtonStyle = content.trashed || content.isElement || isBlueprint ? "primary" : "info";
// only create the save/publish/preview buttons if the
// content app is "Conent"
if ($scope.activeApp && $scope.activeApp.alias !== "umbContent" && $scope.activeApp.alias !== "umbInfo" && $scope.activeApp.alias !== "umbListView") {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
index 25e51bb5f1..c3fd0dc9c4 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbvariantcontenteditors.directive.js
@@ -20,7 +20,7 @@
controller: umbVariantContentEditorsController
};
- function umbVariantContentEditorsController($scope, $location, contentEditingHelper) {
+ function umbVariantContentEditorsController($scope, $location, eventsService) {
var prevContentDateUpdated = null;
@@ -36,6 +36,7 @@
vm.selectVariant = selectVariant;
vm.selectApp = selectApp;
vm.selectAppAnchor = selectAppAnchor;
+ vm.requestSplitView = requestSplitView;
vm.getScope = getScope;// used by property editors to get a scope that is the root of split view, content apps etc.
@@ -68,7 +69,7 @@
/** Allows us to deep watch whatever we want - executes on every digest cycle */
function doCheck() {
- if (!angular.equals(vm.content.updateDate, prevContentDateUpdated)) {
+ if (!Utilities.equals(vm.content.updateDate, prevContentDateUpdated)) {
setActiveVariant();
prevContentDateUpdated = Utilities.copy(vm.content.updateDate);
}
@@ -86,11 +87,12 @@
function setActiveVariant() {
// set the active variant
var activeVariant = null;
- _.each(vm.content.variants, function (v) {
+ vm.content.variants.forEach(v => {
if ((vm.culture === "invariant" || v.language && v.language.culture === vm.culture) && v.segment === vm.segment) {
activeVariant = v;
}
});
+
if (!activeVariant) {
// Set the first variant to active if we can't find it.
// If the content item is invariant, then only one item exists in the array.
@@ -103,13 +105,16 @@
//now re-sync any other editor content (i.e. if split view is open)
for (var s = 1; s < vm.editors.length; s++) {
//get the variant from the scope model
- var variant = _.find(vm.content.variants, function (v) {
- return (!v.language || v.language.culture === vm.editors[s].content.language.culture) && v.segment === vm.editors[s].content.segment;
- });
+ var variant = vm.content.variants.find(v =>
+ (!v.language || v.language.culture === vm.editors[s].content.language.culture) && v.segment === vm.editors[s].content.segment);
+
vm.editors[s].content = variant;
}
}
-
+
+ if (vm.content.variants.length > 1) {
+ eventsService.emit('editors.content.cultureChanged', activeVariant.language);
+ }
}
/**
@@ -160,32 +165,30 @@
*/
function openSplitView(selectedVariant) {
// enforce content contentApp in splitview.
- var contentApp = vm.content.apps.find((app) => app.alias === "umbContent");
+ var contentApp = vm.content.apps.find(app => app.alias === "umbContent");
if(contentApp) {
selectApp(contentApp);
}
insertVariantEditor(vm.editors.length, selectedVariant);
- splitViewChanged();
-
+ splitViewChanged();
}
-
- $scope.$on("editors.content.splitViewRequest", function(event, args) {requestSplitView(args);});
- vm.requestSplitView = requestSplitView;
+
function requestSplitView(args) {
var culture = args.culture;
var segment = args.segment;
- var variant = _.find(vm.content.variants, function (v) {
- return (!v.language || v.language.culture === culture) && v.segment === segment;
- });
+ var variant = vm.content.variants.find(v =>
+ (!v.language || v.language.culture === culture) && v.segment === segment);
if (variant != null) {
openSplitView(variant);
}
}
+ eventsService.on("editors.content.splitViewRequest", (_, args) => requestSplitView(args));
+
/** Closes the split view */
function closeSplitView(editorIndex) {
// TODO: hacking animation states - these should hopefully be easier to do when we upgrade angular
@@ -194,8 +197,9 @@
editor.content.active = false;
//update the current culture to reflect the last open variant (closing the split view corresponds to selecting the other variant)
-
- $location.search({"cculture": vm.editors[0].content.language ? vm.editors[0].content.language.culture : null, "csegment": vm.editors[0].content.segment});
+ const culture = vm.editors[0].content.language ? vm.editors[0].content.language.culture : null;
+
+ $location.search({"cculture": culture, "csegment": vm.editors[0].content.segment});
splitViewChanged();
}
@@ -222,11 +226,9 @@
$location.search("cculture", variantCulture).search("csegment", variantSegment);
}
else {
-
//update the editors collection
- insertVariantEditor(editorIndex, variant);
-
- }
+ insertVariantEditor(editorIndex, variant);
+ }
}
/**
@@ -244,7 +246,6 @@
vm.onSelectAppAnchor({"app": app, "anchor": anchor});
}
}
-
function getScope() {
return $scope;
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js
index 389aec2044..717cefbb0a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbcheckbox.directive.js
@@ -31,8 +31,10 @@
@param {boolean} disabled Set the checkbox to be disabled.
@param {boolean} required Set the checkbox to be required.
@param {callback} onChange Callback when the value of the checkbox change by interaction.
-@param {string} cssClass Set a css class modifier
-@param {boolean} disableDirtyCheck Disable checking if the model is dirty
+@param {string} cssClass Set a css class modifier.
+@deprecated @param {string} iconClass Set an icon next to checkbox. Use "icon" parameter instead.
+@param {string} icon Set an icon next to checkbox.
+@param {boolean} disableDirtyCheck Disable checking if the model is dirty.
**/
@@ -49,6 +51,8 @@
function onInit() {
vm.inputId = vm.inputId || "umb-check_" + String.CreateGuid();
+ vm.icon = vm.icon || vm.iconClass || null;
+
// If a labelKey is passed let's update the returned text if it's does not contain an opening square bracket [
if (vm.labelKey) {
localizationService.localize(vm.labelKey).then(function (data) {
@@ -85,7 +89,8 @@
required: "<",
onChange: "&?",
cssClass: "@?",
- iconClass: "@?",
+ iconClass: "@?", // deprecated
+ icon: "@?",
disableDirtyCheck: "=?"
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbfocuslock.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbfocuslock.directive.js
new file mode 100644
index 0000000000..569f49b88a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbfocuslock.directive.js
@@ -0,0 +1,82 @@
+(function() {
+ 'use strict';
+
+ function FocusLock($timeout) {
+
+ function getAutoFocusElement (elements) {
+ var elmentWithAutoFocus = null;
+
+ elements.forEach((element) => {
+ if(element.getAttribute('umb-auto-focus') === 'true') {
+ elmentWithAutoFocus = element;
+ }
+ });
+
+ return elmentWithAutoFocus;
+ }
+
+ function link(scope, element) {
+
+ function onInit() {
+ // List of elements that can be focusable within the focus lock
+ var focusableElementsSelector = 'a[href]:not([disabled]), button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled])';
+ var bodyElement = document.querySelector('body');
+
+ $timeout(function() {
+ var target = element[0];
+
+ var focusableElements = target.querySelectorAll(focusableElementsSelector);
+ var defaultFocusedElement = getAutoFocusElement(focusableElements);
+ var firstFocusableElement = focusableElements[0];
+ var lastFocusableElement = focusableElements[focusableElements.length -1];
+
+ // We need to add the tabbing-active class in order to highlight the focused button since the default style is
+ // outline: none; set in the stylesheet specifically
+ bodyElement.classList.add('tabbing-active');
+
+ // If there is no default focused element put focus on the first focusable element in the nodelist
+ if(defaultFocusedElement === null ){
+ firstFocusableElement.focus();
+ }
+
+ target.addEventListener('keydown', function(event){
+ var isTabPressed = (event.key === 'Tab' || event.keyCode === 9);
+
+ if (!isTabPressed){
+ return;
+ }
+
+ // If shift + tab key
+ if(event.shiftKey){
+ // Set focus on the last focusable element if shift+tab are pressed meaning we go backwards
+ if(document.activeElement === firstFocusableElement){
+ lastFocusableElement.focus();
+ event.preventDefault();
+ }
+ }
+ // Else only the tab key is pressed
+ else{
+ // Using only the tab key we set focus on the first focusable element mening we go forward
+ if (document.activeElement === lastFocusableElement) {
+ firstFocusableElement.focus();
+ event.preventDefault();
+ }
+ }
+ });
+ }, 250);
+ }
+
+ onInit();
+ }
+
+ var directive = {
+ restrict: 'A',
+ link: link
+ };
+
+ return directive;
+ }
+
+ angular.module('umbraco.directives').directive('umbFocusLock', FocusLock);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js
index d79140f947..3232ed7f34 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbradiobutton.directive.js
@@ -26,10 +26,14 @@
@param {string} value Set the value of the radiobutton.
@param {string} name Set the name of the radiobutton.
@param {string} text Set the text for the radiobutton label.
-@param {string} labelKey Set a dictinary/localization string for the checkbox label
+@param {string} labelKey Set a dictinary/localization string for the checkbox label.
+@param {string} serverValidationField Set the val-server-field of the radiobutton.
@param {boolean} disabled Set the radiobutton to be disabled.
@param {boolean} required Set the radiobutton to be required.
@param {callback} onChange Callback when the value of the radiobutton change by interaction.
+@param {string} cssClass Set a css class modifier.
+@param {string} iconClass Set an icon next to radiobutton.
+@param {boolean} disableDirtyCheck Disable checking if the model is dirty.
**/
@@ -46,6 +50,8 @@
function onInit() {
vm.inputId = vm.inputId || "umb-radio_" + String.CreateGuid();
+ vm.icon = vm.icon || vm.iconClass || null;
+
// If a labelKey is passed let's update the returned text if it's does not contain an opening square bracket [
if (vm.labelKey) {
localizationService.localize(vm.labelKey).then(function (data) {
@@ -77,9 +83,14 @@
name: "@",
text: "@",
labelKey: "@?",
+ serverValidationField: "@",
disabled: "<",
required: "<",
- onChange: "&?"
+ onChange: "&?",
+ cssClass: "@?",
+ iconClass: "@?", // deprecated
+ icon: "@?",
+ disableDirtyCheck: "=?"
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbsearchfilter.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbsearchfilter.directive.js
new file mode 100644
index 0000000000..7929316275
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/forms/umbsearchfilter.directive.js
@@ -0,0 +1,84 @@
+/**
+@ngdoc directive
+@name umbraco.directives.directive:umbSearchFilter
+@restrict E
+@scope
+
+@description
+Added in Umbraco version 8.7.0 Use this directive to render an umbraco search filter.
+
+
Markup example
+
+
+
+
+
+
+
+
+
+@param {boolean} model Set to true or false to set the checkbox to checked or unchecked.
+@param {string} inputId Set the id of the checkbox.
+@param {string} text Set the text for the checkbox label.
+@param {string} labelKey Set a dictinary/localization string for the checkbox label
+@param {callback} onChange Callback when the value of the checkbox change by interaction.
+@param {boolean} autoFocus Add autofocus to the input field
+@param {boolean} preventSubmitOnEnter Set the enter prevent directive or not
+
+**/
+
+(function () {
+ 'use strict';
+
+ function UmbSearchFilterController($timeout, localizationService) {
+
+ var vm = this;
+
+ vm.$onInit = onInit;
+ vm.change = change;
+
+ function onInit() {
+ vm.inputId = vm.inputId || "umb-check_" + String.CreateGuid();
+
+ // If a labelKey is passed let's update the returned text if it's does not contain an opening square bracket [
+ if (vm.labelKey) {
+ localizationService.localize(vm.labelKey).then(function (data) {
+ if(data.indexOf('[') === -1){
+ vm.text = data;
+ }
+ });
+ }
+ }
+
+ function change() {
+ if (vm.onChange) {
+ $timeout(function () {
+ vm.onChange({ model: vm.model, value: vm.value });
+ }, 0);
+ }
+ }
+ }
+
+ var component = {
+ templateUrl: 'views/components/forms/umb-search-filter.html',
+ controller: UmbSearchFilterController,
+ controllerAs: 'vm',
+ transclude: true,
+ bindings: {
+ model: "=",
+ inputId: "@",
+ text: "@",
+ labelKey: "@?",
+ onChange: "&?",
+ autoFocus: "",
+ preventSubmitOnEnter: ""
+ }
+ };
+
+ angular.module('umbraco.directives').component('umbSearchFilter', component);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/grid/grid.rte.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/grid/grid.rte.directive.js
index 3578624b50..e2b2e2c3df 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/grid/grid.rte.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/grid/grid.rte.directive.js
@@ -1,5 +1,5 @@
angular.module("umbraco.directives")
- .directive('gridRte', function (tinyMceService, angularHelper, assetsService, $q, $timeout, eventsService) {
+ .directive('gridRte', function (tinyMceService, angularHelper, assetsService, $q, $timeout, eventsService, tinyMceAssets) {
return {
scope: {
uniqueId: '=',
@@ -22,11 +22,6 @@ angular.module("umbraco.directives")
// because now we have to support having 2x (maybe more at some stage) content editors being displayed at once. This is because
// we have this mini content editor panel that can be launched with MNTP.
scope.textAreaHtmlId = scope.uniqueId + "_" + String.CreateGuid();
-
- //queue file loading
- if (typeof (tinymce) === "undefined") {
- promises.push(assetsService.loadJs("lib/tinymce/tinymce.min.js", scope));
- }
var editorConfig = scope.configuration ? scope.configuration : null;
if (!editorConfig || Utilities.isString(editorConfig)) {
@@ -50,6 +45,10 @@ angular.module("umbraco.directives")
//stores a reference to the editor
var tinyMceEditor = null;
+ //queue file loading
+ tinyMceAssets.forEach(function (tinyJsAsset) {
+ promises.push(assetsService.loadJs(tinyJsAsset, scope));
+ });
promises.push(tinyMceService.getTinyMceEditorConfig({
htmlId: scope.textAreaHtmlId,
stylesheets: editorConfig.stylesheets,
@@ -87,7 +86,9 @@ angular.module("umbraco.directives")
tinyMceService.initializeEditor({
editor: editor,
model: scope,
- currentForm: angularHelper.getCurrentForm(scope)
+ // Form is found in the scope of the grid controller above us, not in our isolated scope
+ // https://github.com/umbraco/Umbraco-CMS/issues/7461
+ currentForm: angularHelper.getCurrentForm(scope.$parent)
});
//custom initialization for this editor within the grid
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js
index 1625986751..f1f2cb38e8 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/imaging/umbimagecrop.directive.js
@@ -5,38 +5,38 @@
* @function
**/
angular.module("umbraco.directives")
- .directive('umbImageCrop',
- function ($timeout, cropperHelper) {
- return {
- restrict: 'E',
- replace: true,
- templateUrl: 'views/components/imaging/umb-image-crop.html',
- scope: {
- src: '=',
- width: '@',
- height: '@',
- crop: "=",
- center: "=",
- maxSize: '@'
- },
+ .directive('umbImageCrop',
+ function ($timeout, cropperHelper) {
+ return {
+ restrict: 'E',
+ replace: true,
+ templateUrl: 'views/components/imaging/umb-image-crop.html',
+ scope: {
+ src: '=',
+ width: '@',
+ height: '@',
+ crop: "=",
+ center: "=",
+ maxSize: '@'
+ },
- link: function(scope, element, attrs) {
+ link: function (scope, element, attrs) {
let sliderRef = null;
- scope.width = 400;
- scope.height = 320;
+ scope.width = 400;
+ scope.height = 320;
- scope.dimensions = {
- image: {},
- cropper:{},
- viewport:{},
- margin: 20,
- scale: {
- min: 0,
- max: 3,
- current: 1
- }
+ scope.dimensions = {
+ image: {},
+ cropper: {},
+ viewport: {},
+ margin: 20,
+ scale: {
+ min: 0,
+ max: 3,
+ current: 1
+ }
};
scope.sliderOptions = {
@@ -84,211 +84,232 @@ angular.module("umbraco.directives")
}
};
- //live rendering of viewport and image styles
- scope.style = function () {
- return {
- 'height': (parseInt(scope.dimensions.viewport.height, 10)) + 'px',
- 'width': (parseInt(scope.dimensions.viewport.width, 10)) + 'px'
- };
- };
+ //live rendering of viewport and image styles
+ scope.style = function () {
+ return {
+ 'height': (parseInt(scope.dimensions.viewport.height, 10)) + 'px',
+ 'width': (parseInt(scope.dimensions.viewport.width, 10)) + 'px'
+ };
+ };
- //elements
- var $viewport = element.find(".viewport");
- var $image = element.find("img");
- var $overlay = element.find(".overlay");
- var $container = element.find(".crop-container");
+ //elements
+ var $viewport = element.find(".viewport");
+ var $image = element.find("img");
+ var $overlay = element.find(".overlay");
+ var $container = element.find(".crop-container");
- //default constraints for drag n drop
- var constraints = {left: {max: scope.dimensions.margin, min: scope.dimensions.margin}, top: {max: scope.dimensions.margin, min: scope.dimensions.margin} };
- scope.constraints = constraints;
+ //default constraints for drag n drop
+ var constraints = { left: { max: scope.dimensions.margin, min: scope.dimensions.margin }, top: { max: scope.dimensions.margin, min: scope.dimensions.margin } };
+ scope.constraints = constraints;
- //set constaints for cropping drag and drop
- var setConstraints = function(){
- constraints.left.min = scope.dimensions.margin + scope.dimensions.cropper.width - scope.dimensions.image.width;
- constraints.top.min = scope.dimensions.margin + scope.dimensions.cropper.height - scope.dimensions.image.height;
- };
+ //set constaints for cropping drag and drop
+ var setConstraints = function () {
+ constraints.left.min = scope.dimensions.margin + scope.dimensions.cropper.width - scope.dimensions.image.width;
+ constraints.top.min = scope.dimensions.margin + scope.dimensions.cropper.height - scope.dimensions.image.height;
+ };
- var setDimensions = function(originalImage){
- originalImage.width("auto");
- originalImage.height("auto");
+ var setDimensions = function (originalImage) {
+ originalImage.width("auto");
+ originalImage.height("auto");
- var image = {};
- image.originalWidth = originalImage.width();
- image.originalHeight = originalImage.height();
+ var image = {};
+ image.originalWidth = originalImage.width();
+ image.originalHeight = originalImage.height();
- image.width = image.originalWidth;
- image.height = image.originalHeight;
- image.left = originalImage[0].offsetLeft;
- image.top = originalImage[0].offsetTop;
+ image.width = image.originalWidth;
+ image.height = image.originalHeight;
+ image.left = originalImage[0].offsetLeft;
+ image.top = originalImage[0].offsetTop;
- scope.dimensions.image = image;
+ scope.dimensions.image = image;
- //unscaled editor size
- //var viewPortW = $viewport.width();
- //var viewPortH = $viewport.height();
- var _viewPortW = parseInt(scope.width, 10);
- var _viewPortH = parseInt(scope.height, 10);
+ //unscaled editor size
+ //var viewPortW = $viewport.width();
+ //var viewPortH = $viewport.height();
+ var _viewPortW = parseInt(scope.width, 10);
+ var _viewPortH = parseInt(scope.height, 10);
- //if we set a constraint we will scale it down if needed
- if(scope.maxSize){
- var ratioCalculation = cropperHelper.scaleToMaxSize(
- _viewPortW,
- _viewPortH,
- scope.maxSize);
+ //if we set a constraint we will scale it down if needed
+ if (scope.maxSize) {
+ var ratioCalculation = cropperHelper.scaleToMaxSize(
+ _viewPortW,
+ _viewPortH,
+ scope.maxSize);
- //so if we have a max size, override the thumb sizes
- _viewPortW = ratioCalculation.width;
- _viewPortH = ratioCalculation.height;
- }
+ //so if we have a max size, override the thumb sizes
+ _viewPortW = ratioCalculation.width;
+ _viewPortH = ratioCalculation.height;
+ }
- scope.dimensions.viewport.width = _viewPortW + 2 * scope.dimensions.margin;
- scope.dimensions.viewport.height = _viewPortH + 2 * scope.dimensions.margin;
- scope.dimensions.cropper.width = _viewPortW; // scope.dimensions.viewport.width - 2 * scope.dimensions.margin;
- scope.dimensions.cropper.height = _viewPortH; // scope.dimensions.viewport.height - 2 * scope.dimensions.margin;
- };
+ scope.dimensions.viewport.width = _viewPortW + 2 * scope.dimensions.margin;
+ scope.dimensions.viewport.height = _viewPortH + 2 * scope.dimensions.margin;
+ scope.dimensions.cropper.width = _viewPortW; // scope.dimensions.viewport.width - 2 * scope.dimensions.margin;
+ scope.dimensions.cropper.height = _viewPortH; // scope.dimensions.viewport.height - 2 * scope.dimensions.margin;
+ };
- //resize to a given ratio
- var resizeImageToScale = function(ratio){
- //do stuff
- var size = cropperHelper.calculateSizeToRatio(scope.dimensions.image.originalWidth, scope.dimensions.image.originalHeight, ratio);
- scope.dimensions.image.width = size.width;
- scope.dimensions.image.height = size.height;
+ //resize to a given ratio
+ var resizeImageToScale = function (ratio) {
+ //do stuff
+ var size = cropperHelper.calculateSizeToRatio(scope.dimensions.image.originalWidth, scope.dimensions.image.originalHeight, ratio);
+ scope.dimensions.image.width = size.width;
+ scope.dimensions.image.height = size.height;
- setConstraints();
- validatePosition(scope.dimensions.image.left, scope.dimensions.image.top);
- };
+ setConstraints();
+ validatePosition(scope.dimensions.image.left, scope.dimensions.image.top);
+ };
- //resize the image to a predefined crop coordinate
- var resizeImageToCrop = function(){
- scope.dimensions.image = cropperHelper.convertToStyle(
- scope.crop,
- {width: scope.dimensions.image.originalWidth, height: scope.dimensions.image.originalHeight},
- scope.dimensions.cropper,
- scope.dimensions.margin);
+ //resize the image to a predefined crop coordinate
+ var resizeImageToCrop = function () {
+ scope.dimensions.image = cropperHelper.convertToStyle(
+ scope.crop,
+ { width: scope.dimensions.image.originalWidth, height: scope.dimensions.image.originalHeight },
+ scope.dimensions.cropper,
+ scope.dimensions.margin);
- var ratioCalculation = cropperHelper.calculateAspectRatioFit(
- scope.dimensions.image.originalWidth,
- scope.dimensions.image.originalHeight,
- scope.dimensions.cropper.width,
- scope.dimensions.cropper.height,
- true);
+ var ratioCalculation = cropperHelper.calculateAspectRatioFit(
+ scope.dimensions.image.originalWidth,
+ scope.dimensions.image.originalHeight,
+ scope.dimensions.cropper.width,
+ scope.dimensions.cropper.height,
+ true);
- scope.dimensions.scale.current = scope.dimensions.image.ratio;
+ scope.dimensions.scale.current = scope.dimensions.image.ratio;
- // Update min and max based on original width/height
- scope.dimensions.scale.min = ratioCalculation.ratio;
+ // Update min and max based on original width/height
+ scope.dimensions.scale.min = ratioCalculation.ratio;
scope.dimensions.scale.max = 2;
- };
+ };
- var validatePosition = function(left, top){
- if(left > constraints.left.max)
- {
- left = constraints.left.max;
- }
+ var validatePosition = function (left, top) {
+ if (left > constraints.left.max) {
+ left = constraints.left.max;
+ }
- if(left <= constraints.left.min){
- left = constraints.left.min;
- }
+ if (left <= constraints.left.min) {
+ left = constraints.left.min;
+ }
- if(top > constraints.top.max)
- {
- top = constraints.top.max;
- }
- if(top <= constraints.top.min){
- top = constraints.top.min;
- }
+ if (top > constraints.top.max) {
+ top = constraints.top.max;
+ }
+ if (top <= constraints.top.min) {
+ top = constraints.top.min;
+ }
- if(scope.dimensions.image.left !== left){
- scope.dimensions.image.left = left;
- }
+ if (scope.dimensions.image.left !== left) {
+ scope.dimensions.image.left = left;
+ }
- if(scope.dimensions.image.top !== top){
- scope.dimensions.image.top = top;
- }
- };
+ if (scope.dimensions.image.top !== top) {
+ scope.dimensions.image.top = top;
+ }
+ };
- //sets scope.crop to the recalculated % based crop
- var calculateCropBox = function(){
- scope.crop = cropperHelper.pixelsToCoordinates(scope.dimensions.image, scope.dimensions.cropper.width, scope.dimensions.cropper.height, scope.dimensions.margin);
- };
+ //sets scope.crop to the recalculated % based crop
+ var calculateCropBox = function () {
+ scope.crop = cropperHelper.pixelsToCoordinates(scope.dimensions.image, scope.dimensions.cropper.width, scope.dimensions.cropper.height, scope.dimensions.margin);
+ };
- //Drag and drop positioning, using jquery ui draggable
- var onStartDragPosition, top, left;
- $overlay.draggable({
- drag: function(event, ui) {
- scope.$apply(function(){
- validatePosition(ui.position.left, ui.position.top);
- });
- },
- stop: function(event, ui){
- scope.$apply(function(){
- //make sure that every validates one more time...
- validatePosition(ui.position.left, ui.position.top);
+ //Drag and drop positioning, using jquery ui draggable
+ var onStartDragPosition, top, left;
+ $overlay.draggable({
+ drag: function (event, ui) {
+ scope.$apply(function () {
+ validatePosition(ui.position.left, ui.position.top);
+ });
+ },
+ stop: function (event, ui) {
+ scope.$apply(function () {
+ //make sure that every validates one more time...
+ validatePosition(ui.position.left, ui.position.top);
- calculateCropBox();
- scope.dimensions.image.rnd = Math.random();
- });
- }
- });
+ calculateCropBox();
+ scope.dimensions.image.rnd = Math.random();
+ });
+ }
+ });
- var init = function(image){
- scope.loaded = false;
+ var init = function (image) {
+ scope.loaded = false;
- //set dimensions on image, viewport, cropper etc
- setDimensions(image);
+ //set dimensions on image, viewport, cropper etc
+ setDimensions(image);
- //create a default crop if we haven't got one already
+ //create a default crop if we haven't got one already
var createDefaultCrop = !scope.crop;
if (createDefaultCrop) {
calculateCropBox();
}
- resizeImageToCrop();
+ resizeImageToCrop();
//if we're creating a new crop, make sure to zoom out fully
if (createDefaultCrop) {
scope.dimensions.scale.current = scope.dimensions.scale.min;
- resizeImageToScale(scope.dimensions.scale.min);
+ resizeImageToScale(scope.dimensions.scale.min);
+
+ if (scope.center) {
+ // Move image to focal point if set
+ // Repeating a few calls here, but logic is too difficult to follow elsewhere
+ var x1 = Math.min(
+ Math.max(
+ scope.center.left * scope.dimensions.image.width - scope.dimensions.cropper.width / 2,
+ 0
+ ),
+ scope.dimensions.image.width - scope.dimensions.cropper.width
+ );
+ var y1 = Math.min(
+ Math.max(
+ scope.center.top * scope.dimensions.image.height - scope.dimensions.cropper.height / 2,
+ 0
+ ),
+ scope.dimensions.image.height - scope.dimensions.cropper.height
+ );
+ scope.dimensions.image.left = x1;
+ scope.dimensions.image.top = y1;
+ calculateCropBox();
+ resizeImageToCrop();
+ }
}
- //sets constaints for the cropper
- setConstraints();
- scope.loaded = true;
- };
+ //sets constaints for the cropper
+ setConstraints();
+ scope.loaded = true;
+ };
- // Watchers
- scope.$watchCollection('[width, height]', function(newValues, oldValues){
- // We have to reinit the whole thing if
- // one of the external params changes
- if(newValues !== oldValues){
- setDimensions($image);
- setConstraints();
- }
- });
+ // Watchers
+ scope.$watchCollection('[width, height]', function (newValues, oldValues) {
+ // We have to reinit the whole thing if
+ // one of the external params changes
+ if (newValues !== oldValues) {
+ setDimensions($image);
+ setConstraints();
+ }
+ });
- var throttledResizing = _.throttle(function(){
+ var throttledResizing = _.throttle(function () {
resizeImageToScale(scope.dimensions.scale.current);
- calculateCropBox();
- }, 15);
+ calculateCropBox();
+ }, 15);
- // Happens when we change the scale
+ // Happens when we change the scale
scope.$watch("dimensions.scale.current", function (newValue, oldValue) {
- if (scope.loaded) {
- throttledResizing();
- }
- });
+ if (scope.loaded) {
+ throttledResizing();
+ }
+ });
- // Init
- $image.on("load", function(){
- $timeout(function(){
- init($image);
- });
- });
- }
- };
- });
+ // Init
+ $image.on("load", function () {
+ $timeout(function () {
+ init($image);
+ });
+ });
+ }
+ };
+ });
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js
index dfa1afc247..6f34cfc0a1 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js
@@ -1,7 +1,7 @@
(function () {
'use strict';
- function MediaNodeInfoDirective($timeout, $location, eventsService, userService, dateHelper, editorService, mediaHelper, mediaResource, $q) {
+ function MediaNodeInfoDirective($timeout, $location, $q, eventsService, userService, dateHelper, editorService, mediaHelper, mediaResource) {
function link(scope, element, attrs, ctrl) {
@@ -37,7 +37,7 @@
});
});
- // get document type details
+ // get media type details
scope.mediaType = scope.node.contentType;
// set the media link initially
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/member/umbmembernodeinfo.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/member/umbmembernodeinfo.directive.js
index 3b6a2c069a..8dd6d56139 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/member/umbmembernodeinfo.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/member/umbmembernodeinfo.directive.js
@@ -11,6 +11,19 @@
scope.allowChangeMemberType = false;
function onInit() {
+
+ userService.getCurrentUser().then(function (user) {
+ // only allow change of member type if user has access to the settings sections
+ Utilities.forEach(user.sections, function (section) {
+ if (section.alias === "settings") {
+ scope.allowChangeMemberType = true;
+ }
+ });
+ });
+
+ // get member type details
+ scope.memberType = scope.node.contentType;
+
// make sure dates are formatted to the user's locale
formatDatesToLocal();
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlay.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlay.directive.js
index d1bdf6f42f..f7ba043ef1 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlay.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/overlays/umboverlay.directive.js
@@ -221,6 +221,10 @@ Opens an overlay to show a custom YSOD.
$timeout(function () {
+ if (!scope.name) {
+ scope.name = 'overlay';
+ }
+
if (scope.position === "target" && scope.model.event) {
setTargetPosition();
@@ -403,11 +407,15 @@ Opens an overlay to show a custom YSOD.
function setTargetPosition() {
- var container = $("#contentwrapper");
- var containerLeft = container[0].offsetLeft;
- var containerRight = containerLeft + container[0].offsetWidth;
- var containerTop = container[0].offsetTop;
- var containerBottom = containerTop + container[0].offsetHeight;
+ var overlay = $(scope.model.event.target).closest('.umb-overlay');
+ var container = overlay.length > 0 ? overlay : $("#contentwrapper");
+
+ let rect = container[0].getBoundingClientRect();
+
+ var containerLeft = rect.left;
+ var containerRight = containerLeft + rect.width;
+ var containerTop = rect.top;
+ var containerBottom = containerTop + rect.height;
var mousePositionClickX = null;
var mousePositionClickY = null;
@@ -430,8 +438,9 @@ Opens an overlay to show a custom YSOD.
elementWidth = el[0].clientWidth;
// move element to this position
- position.left = mousePositionClickX - (elementWidth / 2);
- position.top = mousePositionClickY - (elementHeight / 2);
+ // when using hotkey it fallback to center of container
+ position.left = mousePositionClickX ? mousePositionClickX - (elementWidth / 2) : (containerLeft + containerRight) / 2 - (elementWidth / 2);
+ position.top = mousePositionClickY ? mousePositionClickY - (elementHeight / 2) : (containerTop + containerBottom) / 2 - (elementHeight / 2);
// check to see if element is outside screen
// outside right
@@ -459,6 +468,7 @@ Opens an overlay to show a custom YSOD.
}
el.css(position);
+ el.css("visibility", "visible");
}
scope.submitForm = function (model) {
@@ -530,6 +540,7 @@ Opens an overlay to show a custom YSOD.
view: "=",
position: "@",
size: "=?",
+ name: "=?",
parentScope: "=?"
},
link: link
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
index 0ccaf7b05c..a412f73c5a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtree.directive.js
@@ -88,9 +88,8 @@ function umbTreeDirective($q, $rootScope, treeService, notificationsService, use
/** Helper function to emit tree events */
function emitEvent(eventName, args) {
if (registeredCallbacks[eventName] && Utilities.isArray(registeredCallbacks[eventName])) {
- _.each(registeredCallbacks[eventName], function (c) {
- c(args);//call it
- });
+ // call it
+ registeredCallbacks[eventName].forEach(c => c(args));
}
}
@@ -342,26 +341,17 @@ function umbTreeDirective($q, $rootScope, treeService, notificationsService, use
var css = [];
if (node.cssClasses) {
- _.each(node.cssClasses, function (c) {
- css.push(c);
- });
+ node.cssClasses.forEach(c => css.push(c));
}
return css.join(" ");
};
- $scope.selectEnabledNodeClass = function (node) {
- return node ?
- node.selected ?
- 'icon umb-tree-icon sprTree icon-check green temporary' :
- '' :
- '';
- };
+ $scope.selectEnabledNodeClass = node =>
+ node && node.selected ? 'icon umb-tree-icon sprTree icon-check green temporary' : '';
/* helper to force reloading children of a tree node */
- $scope.loadChildren = function (node, forceReload) {
- return loadChildren(node, forceReload);
- };
+ $scope.loadChildren = (node, forceReload) => loadChildren(node, forceReload);
/**
Method called when the options button next to the root node is called.
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtreeitem.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtreeitem.directive.js
index 8767de446a..f2fc0d2dae 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtreeitem.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/tree/umbtreeitem.directive.js
@@ -70,9 +70,7 @@ angular.module("umbraco.directives")
var css = [];
if (node.cssClasses) {
- _.each(node.cssClasses, function(c) {
- css.push(c);
- });
+ node.cssClasses.forEach(c => css.push(c));
}
if (node.selected) {
css.push("umb-tree-node-checked");
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js
index 96ce8735eb..9a841e3e4a 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbchildselector.directive.js
@@ -21,14 +21,6 @@ Use this directive to render a ui component for selecting child items to a paren
on-remove="vm.removeChild">
-
-
-
-
@@ -37,7 +29,7 @@ Use this directive to render a ui component for selecting child items to a paren
(function () {
"use strict";
- function Controller() {
+ function Controller(overlayService) {
var vm = this;
@@ -64,23 +56,29 @@ Use this directive to render a ui component for selecting child items to a paren
vm.removeChild = removeChild;
function addChild($event) {
- vm.overlay = {
+
+ const dialog = {
view: "itempicker",
title: "Choose child",
availableItems: vm.availableChildren,
selectedItems: vm.selectedChildren,
event: $event,
- show: true,
submit: function(model) {
-
- // add selected child
- vm.selectedChildren.push(model.selectedItem);
+
+ if (model.selectedItem) {
+ // add selected child
+ vm.selectedChildren.push(model.selectedItem);
+ }
// close overlay
- vm.overlay.show = false;
- vm.overlay = null;
+ overlayService.close();
+ },
+ close: function() {
+ overlayService.close();
}
};
+
+ overlayService.open(dialog);
}
function removeChild($index) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
index 1dcccda481..2f682205ad 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbconfirmaction.directive.js
@@ -14,10 +14,10 @@ The prompt can be opened in four direction up, down, left or right.
-
@@ -71,17 +71,23 @@ The prompt can be opened in four direction up, down, left or right.
function link(scope, el, attr, ctrl) {
- scope.clickConfirm = function() {
- if(scope.onConfirm) {
- scope.onConfirm();
- }
- };
+ scope.clickButton = function (event) {
+ if(scope.onDelete) {
+ scope.onDelete({$event: event});
+ }
+ }
- scope.clickCancel = function() {
- if(scope.onCancel) {
- scope.onCancel();
- }
- };
+ scope.clickConfirm = function() {
+ if(scope.onConfirm) {
+ scope.onConfirm();
+ }
+ };
+
+ scope.clickCancel = function() {
+ if(scope.onCancel) {
+ scope.onCancel();
+ }
+ };
}
@@ -91,6 +97,8 @@ The prompt can be opened in four direction up, down, left or right.
templateUrl: 'views/components/umb-confirm-action.html',
scope: {
direction: "@",
+ show: "<",
+ onDelete: "&?",
onConfirm: "&",
onCancel: "&"
},
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js
index 0498b81963..ed9c011d72 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbdatetimepicker.directive.js
@@ -189,7 +189,7 @@ Use this directive to render a date time picker
};
}
- // bind hook for onOpen
+ // bind hook for onOpen
if (ctrl.options && ctrl.onClose) {
ctrl.options.onClose = function (selectedDates, dateStr, instance) {
$timeout(function () {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
index 3f53a1e18c..92d2df43e5 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbgroupsbuilder.directive.js
@@ -161,19 +161,17 @@
var resourceLookup = scope.contentType === "documentType" ? contentTypeResource.getAvailableCompositeContentTypes : mediaTypeResource.getAvailableCompositeContentTypes;
return resourceLookup(scope.model.id, selectedContentTypeAliases, propAliasesExisting).then(function (filteredAvailableCompositeTypes) {
- _.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (current) {
+ scope.compositionsDialogModel.availableCompositeContentTypes.forEach(current => {
//reset first
current.allowed = true;
//see if this list item is found in the response (allowed) list
- var found = _.find(filteredAvailableCompositeTypes, function (f) {
- return current.contentType.alias === f.contentType.alias;
- });
+ var found = filteredAvailableCompositeTypes.find(f => current.contentType.alias === f.contentType.alias);
//allow if the item was found in the response (allowed) list -
// and ensure its set to allowed if it is currently checked,
// DO not allow if it's a locked content type.
- current.allowed = scope.model.lockedCompositeContentTypes.indexOf(current.contentType.alias) === -1 &&
- (selectedContentTypeAliases.indexOf(current.contentType.alias) !== -1) || ((found !== null && found !== undefined) ? found.allowed : false);
+ current.allowed = scope.model.lockedCompositeContentTypes.includes(current.contentType.alias) &&
+ (selectedContentTypeAliases.includes(current.contentType.alias)) || (found ? found.allowed : false);
});
});
@@ -192,15 +190,15 @@
function setupAvailableContentTypesModel(result) {
scope.compositionsDialogModel.availableCompositeContentTypes = result;
//iterate each one and set it up
- _.each(scope.compositionsDialogModel.availableCompositeContentTypes, function (c) {
+ scope.compositionsDialogModel.availableCompositeContentTypes.forEach(c => {
//enable it if it's part of the selected model
- if (scope.compositionsDialogModel.compositeContentTypes.indexOf(c.contentType.alias) !== -1) {
+ if (scope.compositionsDialogModel.compositeContentTypes.includes(c.contentType.alias)) {
c.allowed = true;
}
//set the inherited flags
c.inherited = false;
- if (scope.model.lockedCompositeContentTypes.indexOf(c.contentType.alias) > -1) {
+ if (scope.model.lockedCompositeContentTypes.includes(c.contentType.alias)) {
c.inherited = true;
}
// convert icons for composite content types
@@ -281,6 +279,8 @@
},
selectCompositeContentType: function (selectedContentType) {
+ var deferred = $q.defer();
+
//first check if this is a new selection - we need to store this value here before any further digests/async
// because after that the scope.model.compositeContentTypes will be populated with the selected value.
var newSelection = scope.model.compositeContentTypes.indexOf(selectedContentType.alias) === -1;
@@ -308,7 +308,10 @@
//based on the selection, we need to filter the available composite types list
filterAvailableCompositions(selectedContentType, newSelection).then(function () {
+ deferred.resolve({ selectedContentType, newSelection });
// TODO: Here we could probably re-enable selection if we previously showed a throbber or something
+ }, function () {
+ deferred.reject();
});
});
}
@@ -318,10 +321,14 @@
//based on the selection, we need to filter the available composite types list
filterAvailableCompositions(selectedContentType, newSelection).then(function () {
+ deferred.resolve({ selectedContentType, newSelection });
// TODO: Here we could probably re-enable selection if we previously showed a throbber or something
+ }, function () {
+ deferred.reject();
});
}
+ return deferred.promise;
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js
new file mode 100644
index 0000000000..517776388b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbicon.directive.js
@@ -0,0 +1,86 @@
+/**
+@ngdoc directive
+@name umbraco.directives.directive:umbIcon
+@restrict E
+@scope
+@description
+Use this directive to show an render an umbraco backoffice svg icon. All svg icons used by this directive should use the following naming convention to keep things consistent: icon-[name of icon]. For example
icon-alert.svg
+
+
Markup example
+
+Simple icon
+
+
+
+
+Icon with additional attribute. It can be treated like any other dom element
+
+
+
+
+Manual svg string
+This format is only used in the iconpicker.html
+
+
+
+
+@example
+ **/
+
+(function () {
+ "use strict";
+
+ function UmbIconDirective(iconHelper) {
+
+ var directive = {
+ replace: true,
+ transclude: true,
+ templateUrl: "views/components/umb-icon.html",
+ scope: {
+ icon: "@",
+ svgString: "=?"
+ },
+
+ link: function (scope) {
+
+ if (scope.svgString === undefined && scope.svgString !== null && scope.icon !== undefined && scope.icon !== null) {
+ var icon = scope.icon.split(" ")[0]; // Ensure that only the first part of the icon is used as sometimes the color is added too, e.g. see umbeditorheader.directive scope.openIconPicker
+
+ _requestIcon(icon);
+ }
+ scope.$watch("icon", function (newValue, oldValue) {
+ if (newValue && oldValue) {
+ var newicon = newValue.split(" ")[0];
+ var oldicon = oldValue.split(" ")[0];
+
+ if (newicon !== oldicon) {
+ _requestIcon(newicon);
+ }
+ }
+ });
+
+ function _requestIcon(icon) {
+ // Reset svg string before requesting new icon.
+ scope.svgString = null;
+
+ iconHelper.getIcon(icon)
+ .then(data => {
+ if (data !== null && data.svgString !== undefined) {
+ // Watch source SVG string
+ //icon.svgString.$$unwrapTrustedValue();
+ scope.svgString = data.svgString;
+ }
+ });
+ }
+ }
+
+ };
+
+ return directive;
+ }
+
+ angular.module("umbraco.directives").directive("umbIcon", UmbIconDirective);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js
index aa28d49c4a..241f1e80e8 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbmediagrid.directive.js
@@ -322,6 +322,41 @@ Use this directive to generate a thumbnail grid of media items.
scope.$on('$destroy', function() {
unbindItemsWatcher();
});
+ //determine if sort is current
+ scope.sortColumn = "name";
+ scope.sortReverse = false;
+ scope.sortDirection = "asc";
+ //check sort status
+ scope.isSortDirection = function (col, direction) {
+ return col === scope.sortColumn && direction === scope.sortDirection;
+ };
+ //change sort
+ scope.setSort = function (col) {
+ if (scope.sortColumn === col) {
+ scope.sortReverse = !scope.sortReverse;
+ }
+ else {
+ scope.sortColumn = col;
+ if (col === "updateDate") {
+ scope.sortReverse = true;
+ }
+ else {
+ scope.sortReverse = false;
+ }
+ }
+ scope.sortDirection = scope.sortReverse ? "desc" : "asc";
+
+ }
+ // sort function
+ scope.sortBy = function (item) {
+ if (scope.sortColumn === "updateDate") {
+ return [-item['isFolder'],item['updateDate']];
+ }
+ else {
+ return [-item['isFolder'],item['name']];
+ }
+ };
+
}
@@ -345,7 +380,8 @@ Use this directive to generate a thumbnail grid of media items.
onlyImages: "@",
onlyFolders: "@",
includeSubFolders: "@",
- currentFolderId: "@"
+ currentFolderId: "@",
+ showMediaList: "="
},
link: link
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
index 66e03a7302..3865ffcdae 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbminilistview.directive.js
@@ -63,7 +63,7 @@
}
// update children
miniListView.children = data.items;
- _.each(miniListView.children, function(c) {
+ miniListView.children.forEach(c => {
// child allowed by default
c.allowed = true;
@@ -95,7 +95,8 @@
var filtered = angular.isFunction(scope.entityTypeFilter.filter)
? _.filter(miniListView.children, scope.entityTypeFilter.filter)
: _.where(miniListView.children, scope.entityTypeFilter.filter);
- _.each(filtered, (node) => node.allowed = false);
+
+ filtered.forEach(node => node.allowed = false);
}
// update pagination
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js
index ef7006be2c..ce1885a7cf 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/umbtooltip.directive.js
@@ -77,13 +77,17 @@ Use this directive to render a tooltip.
scope.tooltipStyles.left = 0;
scope.tooltipStyles.top = 0;
- function setTooltipPosition(event) {
+ function setTooltipPosition(event) {
- var container = $("#contentwrapper");
- var containerLeft = container[0].offsetLeft;
- var containerRight = containerLeft + container[0].offsetWidth;
- var containerTop = container[0].offsetTop;
- var containerBottom = containerTop + container[0].offsetHeight;
+ var overlay = $(event.target).closest('.umb-overlay');
+ var container = overlay.length > 0 ? overlay : $("#contentwrapper");
+
+ let rect = container[0].getBoundingClientRect();
+
+ var containerLeft = rect.left;
+ var containerRight = containerLeft + rect.width;
+ var containerTop = rect.top;
+ var containerBottom = containerTop + rect.height;
var elementHeight = null;
var elementWidth = null;
@@ -102,39 +106,43 @@ Use this directive to render a tooltip.
position.left = event.pageX - (elementWidth / 2);
position.top = event.pageY;
- // check to see if element is outside screen
- // outside right
- if (position.left + elementWidth > containerRight) {
- position.right = 10;
- position.left = "inherit";
+ if (overlay.length > 0) {
+ position.left = event.pageX - rect.left - (elementWidth / 2);
+ position.top = event.pageY - rect.top;
}
+ else {
+ // check to see if element is outside screen
+ // outside right
+ if (position.left + elementWidth > containerRight) {
+ position.right = 10;
+ position.left = "inherit";
+ }
- // outside bottom
- if (position.top + elementHeight > containerBottom) {
- position.bottom = 10;
- position.top = "inherit";
- }
+ // outside bottom
+ if (position.top + elementHeight > containerBottom) {
+ position.bottom = 10;
+ position.top = "inherit";
+ }
- // outside left
- if (position.left < containerLeft) {
- position.left = containerLeft + 10;
- position.right = "inherit";
- }
+ // outside left
+ if (position.left < containerLeft) {
+ position.left = containerLeft + 10;
+ position.right = "inherit";
+ }
- // outside top
- if (position.top < containerTop) {
- position.top = 10;
- position.bottom = "inherit";
+ // outside top
+ if (position.top < containerTop) {
+ position.top = 10;
+ position.bottom = "inherit";
+ }
}
scope.tooltipStyles = position;
el.css(position);
-
}
setTooltipPosition(scope.event);
-
}
var directive = {
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js
index 6a8ffa7969..3581aed9e0 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfileupload.directive.js
@@ -19,6 +19,17 @@ function umbFileUpload() {
//clear the element value - this allows us to pick the same file again and again
el.val('');
});
+
+ el.on('drag dragstart dragend dragover dragenter dragleave drop', function (e) {
+ e.preventDefault();
+ e.stopPropagation();
+ })
+ .on('dragover dragenter', function () {
+ scope.$emit("isDragover", { value: true });
+ })
+ .on('dragleave dragend drop', function () {
+ scope.$emit("isDragover", { value: false });
+ });
}
};
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
index 653b4f427c..db1e38adc6 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbpropertyfileupload.directive.js
@@ -78,6 +78,8 @@
/** Called when the component initializes */
function onInit() {
$scope.$on("filesSelected", onFilesSelected);
+ $scope.$on("isDragover", isDragover);
+
initialize();
}
@@ -118,7 +120,9 @@
isImage: mediaHelper.detectIfImageByExtension(file),
extension: getExtension(file)
};
+
f.fileSrc = getThumbnail(f);
+
return f;
});
@@ -228,19 +232,22 @@
var index = i; //capture
var isImage = mediaHelper.detectIfImageByExtension(files[i].name);
+ var extension = getExtension(files[i].name);
- //save the file object to the files collection
- vm.files.push({
+ var f = {
isImage: isImage,
- extension: getExtension(files[i].name),
+ extension: extension,
fileName: files[i].name,
isClientSide: true
- });
+ };
+
+ // Save the file object to the files collection
+ vm.files.push(f);
//special check for a comma in the name
newVal += files[i].name.split(',').join('-') + ",";
- if (isImage) {
+ if (isImage || extension === "svg") {
var deferred = $q.defer();
@@ -293,6 +300,11 @@
}
}
+ function isDragover(e, args) {
+ vm.dragover = args.value;
+ angularHelper.safeApply($scope);
+ }
+
};
var umbPropertyFileUploadComponent = {
@@ -303,6 +315,7 @@
propertyAlias: "@",
value: "<",
hideSelection: "<",
+ dragover: "<",
/**
* Called when a file is selected on this instance
*/
diff --git a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js
index 77c26e066e..c7894da171 100644
--- a/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js
+++ b/src/Umbraco.Web.UI.Client/src/common/directives/validation/valformmanager.directive.js
@@ -204,7 +204,7 @@ function valFormManager(serverValidationManager, $rootScope, $timeout, $location
var parts = nextPath.split("?");
var query = {};
if (parts.length > 1) {
- _.each(parts[1].split("&"), function (q) {
+ parts[1].split("&").forEach(q => {
var keyVal = q.split("=");
query[keyVal[0]] = keyVal[1];
});
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
index 3b58c127a7..aeb6229360 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/resources/media.mocks.js
@@ -8,12 +8,12 @@ angular.module('umbraco.mocks').
}
function returnNodebyIds(status, data, headers) {
- var ids = mocksUtils.getParameterByName(data, "ids") || "1234,1234,4234";
+ var ids = mocksUtils.getParameterByName(data, "ids") || ['1234','1234','4234'];
var items = [];
- _.each(ids, function(id){
- items.push(_getNode( parseInt( id, 10 )) );
- });
+ for (var i = 0; i < ids.length; i += 1) {
+ items.push(_getNode(parseInt(ids[i], 10)));
+ }
return [200, items, null];
}
@@ -26,8 +26,6 @@ angular.module('umbraco.mocks').
var id = mocksUtils.getParameterByName(data, "id") || 1234;
id = parseInt(id, 10);
-
-
return [200, _getNode(id), null];
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js
index da6f78a6a5..868bc4c6d5 100644
--- a/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js
+++ b/src/Umbraco.Web.UI.Client/src/common/mocks/umbraco.servervariables.js
@@ -19,7 +19,8 @@ Umbraco.Sys.ServerVariables = {
"dashboardApiBaseUrl": "/umbraco/UmbracoApi/Dashboard/",
"updateCheckApiBaseUrl": "/umbraco/Api/UpdateCheck/",
"relationApiBaseUrl": "/umbraco/UmbracoApi/Relation/",
- "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/"
+ "rteApiBaseUrl": "/umbraco/UmbracoApi/RichTextPreValue/",
+ "iconApiBaseUrl": "/umbraco/UmbracoApi/Icon/"
},
umbracoSettings: {
"umbracoPath": "/umbraco",
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
index 4ca85f44e6..3dfbeade4f 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
@@ -442,9 +442,7 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
getByIds: function (ids) {
var idQuery = "";
- _.each(ids, function (item) {
- idQuery += "ids=" + item + "&";
- });
+ ids.forEach(id => idQuery += `ids=${id}&`);
return umbRequestHelper.resourcePromise(
$http.get(
@@ -455,9 +453,7 @@ function contentResource($q, $http, umbDataFormatter, umbRequestHelper) {
'Failed to retrieve data for content with multiple ids')
.then(function (result) {
//each item needs to be re-formatted
- _.each(result, function (r) {
- umbDataFormatter.formatContentGetData(r)
- });
+ result.forEach(r => umbDataFormatter.formatContentGetData(r));
return $q.when(result);
});
},
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
index e24f4786eb..06eb2ed4d2 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/media.resource.js
@@ -226,9 +226,7 @@ function mediaResource($q, $http, umbDataFormatter, umbRequestHelper) {
getByIds: function (ids) {
var idQuery = "";
- _.each(ids, function (item) {
- idQuery += "ids=" + item + "&";
- });
+ ids.forEach(id => idQuery += `ids=${id}&`);
return umbRequestHelper.resourcePromise(
$http.get(
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js
index c83a31e47c..f9b9da9944 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js
@@ -32,9 +32,7 @@ function memberGroupResource($q, $http, umbRequestHelper) {
getByIds: function (ids) {
var idQuery = "";
- _.each(ids, function (item) {
- idQuery += "ids=" + item + "&";
- });
+ ids.forEach(id => idQuery += `ids=${id}&`);
return umbRequestHelper.resourcePromise(
$http.get(
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js
index 6c15b89c0e..2314fa6d6c 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/membertype.resource.js
@@ -16,16 +16,15 @@ function memberTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
}
var query = "";
- _.each(filterContentTypes, function (item) {
- query += "filterContentTypes=" + item + "&";
- });
+ filterContentTypes.forEach(fct => query += `filterContentTypes=${fct}&`);
+
// if filterContentTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterContentTypes.length === 0) {
query += "filterContentTypes=&";
}
- _.each(filterPropertyTypes, function (item) {
- query += "filterPropertyTypes=" + item + "&";
- });
+
+ filterPropertyTypes.forEach(fpt => query += `filterPropertyTypes=${fpt}&`);
+
// if filterPropertyTypes array is empty we need a empty variable in the querystring otherwise the service returns a error
if (filterPropertyTypes.length === 0) {
query += "filterPropertyTypes=&";
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
index 2b9e0c0fd5..91f00a36e3 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
@@ -295,6 +295,38 @@
"Failed to retrieve data for user " + userId);
}
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.usersResource#getUsers
+ * @methodOf umbraco.resources.usersResource
+ *
+ * @description
+ * Gets users from ids
+ *
+ * ##usage
+ *
+ *
+ * @param {Array} userIds user ids.
+ * @returns {Promise} resourcePromise object containing the users array.
+ *
+ */
+ function getUsers(userIds) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "userApiBaseUrl",
+ "GetByIds",
+ { ids: userIds })),
+ "Failed to retrieve data for users " + userIds);
+ }
+
/**
* @ngdoc method
* @name umbraco.resources.usersResource#createUser
@@ -481,6 +513,7 @@
setUserGroupsOnUsers: setUserGroupsOnUsers,
getPagedResults: getPagedResults,
getUser: getUser,
+ getUsers: getUsers,
createUser: createUser,
inviteUser: inviteUser,
saveUser: saveUser,
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js
index 30e59e9a88..b474b66174 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/assets.service.js
@@ -276,7 +276,7 @@ angular.module('umbraco.services')
//blocking
var promises = [];
var assets = [];
- _.each(nonEmpty, function (path) {
+ nonEmpty.forEach(path => {
path = convertVirtualPath(path);
var asset = service._getAssetPromise(path);
//if not previously loaded, add to list of promises
@@ -325,19 +325,17 @@ angular.module('umbraco.services')
scope = $rootScope;
}
angularHelper.safeApply(scope,
- function () {
- asset.deferred.resolve(true);
- });
+ () => asset.deferred.resolve(true));
}
if (cssAssets.length > 0) {
- var cssPaths = _.map(cssAssets, function (asset) { return appendRnd(asset.path) });
- LazyLoad.css(cssPaths, function () { _.each(cssAssets, assetLoaded); });
+ var cssPaths = cssAssets.map(css => appendRnd(css.path));
+ LazyLoad.css(cssPaths, () => cssAssets.forEach(assetLoaded));
}
if (jsAssets.length > 0) {
- var jsPaths = _.map(jsAssets, function (asset) { return appendRnd(asset.path) });
- LazyLoad.js(jsPaths, function () { _.each(jsAssets, assetLoaded); });
+ var jsPaths = jsAssets.map(js => appendRnd(js.path));
+ LazyLoad.js(jsPaths, () => jsAssets.forEach(assetLoaded));
}
return promise;
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
index 4ffd0c3c0b..c27283d5ad 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/contenteditinghelper.service.js
@@ -123,10 +123,7 @@ function contentEditingHelper(fileManager, $q, $location, $routeParams, editorSt
self.handleSaveError({
showNotifications: args.showNotifications,
softRedirect: args.softRedirect,
- err: err,
- rebindCallback: function () {
- rebindCallback.apply(self, [args.content, err.data]);
- }
+ err: err
});
//update editor state to what is current
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
index 538bd41ce0..0f4f04c6bf 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/editor.service.js
@@ -669,23 +669,6 @@ When building a custom infinite editor view you can use the same components as a
open(editor);
}
- /**
- * @ngdoc method
- * @name umbraco.services.editorService#memberTypeEditor
- * @methodOf umbraco.services.editorService
- *
- * @description
- * Opens the member type editor in infinite editing, the submit callback returns the saved member type
- * @param {Object} editor rendering options
- * @param {Callback} editor.submit Submits the editor
- * @param {Callback} editor.close Closes the editor
- * @returns {Object} editor object
- */
- function memberTypeEditor(editor) {
- editor.view = "views/membertypes/edit.html";
- open(editor);
- }
-
/**
* @ngdoc method
* @name umbraco.services.editorService#queryBuilder
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js b/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js
new file mode 100644
index 0000000000..a3dd91194e
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/services/focuslock.service.js
@@ -0,0 +1,26 @@
+(function () {
+ "use strict";
+
+ function focusLockService() {
+ var elementToInert = document.querySelector('#mainwrapper');
+
+ function addInertAttribute() {
+ elementToInert.setAttribute('inert', true);
+ }
+
+ function removeInertAttribute() {
+ elementToInert.removeAttribute('inert');
+ }
+
+ var service = {
+ addInertAttribute: addInertAttribute,
+ removeInertAttribute: removeInertAttribute
+ }
+
+ return service;
+
+ }
+
+ angular.module("umbraco.services").factory("focusLockService", focusLockService);
+
+})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
index 5866e28b1e..d9c11770cc 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/formhelper.service.js
@@ -17,10 +17,10 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
* @function
*
* @description
- * Called by controllers when submitting a form - this ensures that all client validation is checked,
+ * Called by controllers when submitting a form - this ensures that all client validation is checked,
* server validation is cleared, that the correct events execute and status messages are displayed.
* This returns true if the form is valid, otherwise false if form submission cannot continue.
- *
+ *
* @param {object} args An object containing arguments for form submission
*/
submitForm: function (args) {
@@ -33,6 +33,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
if (!args.scope) {
throw "args.scope cannot be null";
}
+
if (!args.formCtrl) {
//try to get the closest form controller
currentForm = angularHelper.getRequiredCurrentForm(args.scope);
@@ -44,15 +45,13 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
//the first thing any form must do is broadcast the formSubmitting event
args.scope.$broadcast("formSubmitting", { scope: args.scope, action: args.action });
- // Some property editors need to perform an action after all property editors have reacted to the formSubmitting.
- args.scope.$broadcast("formSubmittingFinalPhase", { scope: args.scope, action: args.action });
-
- // Set the form state to submitted
- currentForm.$setSubmitted();
+ this.focusOnFirstError(currentForm);
+ args.scope.$broadcast("postFormSubmitting", { scope: args.scope, action: args.action });
//then check if the form is valid
if (!args.skipValidation) {
if (currentForm.$invalid) {
+
return false;
}
}
@@ -68,6 +67,32 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
return true;
},
+ /**
+ * @ngdoc function
+ * @name umbraco.services.formHelper#focusOnFirstError
+ * @methodOf umbraco.services.formHelper
+ * @function
+ *
+ * @description
+ * Called by submitForm when a form has been submitted, it will fire a focus on the first found invalid umb-property it finds in the form..
+ *
+ * @param {object} form Pass in a form object.
+ */
+ focusOnFirstError: function(form) {
+ var invalidNgForms = form.$$element.find(`.umb-property ng-form.ng-invalid, .umb-property-editor ng-form.ng-invalid-required`);
+ var firstInvalidNgForm = invalidNgForms.first();
+
+ if(firstInvalidNgForm.length !== 0) {
+ var focusableFields = [...firstInvalidNgForm.find("umb-range-slider .noUi-handle,input,textarea,select,button")];
+ if(focusableFields.length !== 0) {
+ var firstErrorEl = focusableFields.find(el => el.type !== "hidden" && el.hasAttribute("readonly") === false);
+ if(firstErrorEl.length !== 0) {
+ firstErrorEl.focus();
+ }
+ }
+ }
+ },
+
/**
* @ngdoc function
* @name umbraco.services.formHelper#submitForm
@@ -76,32 +101,18 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
*
* @description
* Called by controllers when a form has been successfully submitted, this ensures the correct events are raised.
- *
+ *
* @param {object} args An object containing arguments for form submission
*/
resetForm: function (args) {
-
- var currentForm;
-
if (!args) {
throw "args cannot be null";
}
if (!args.scope) {
throw "args.scope cannot be null";
}
- if (!args.formCtrl) {
- //try to get the closest form controller
- currentForm = angularHelper.getRequiredCurrentForm(args.scope);
- }
- else {
- currentForm = args.formCtrl;
- }
- // Set the form state to pristine
- currentForm.$setPristine();
- currentForm.$setUntouched();
-
- args.scope.$broadcast(args.hasErrors ? "formSubmittedValidationFailed" : "formSubmitted", { scope: args.scope });
+ args.scope.$broadcast("formSubmitted", { scope: args.scope });
},
showNotifications: function (args) {
@@ -126,7 +137,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
* @description
* Needs to be called when a form submission fails, this will wire up all server validation errors in ModelState and
* add the correct messages to the notifications. If a server error has occurred this will show a ysod.
- *
+ *
* @param {object} err The error object returned from the http promise
*/
handleError: function (err) {
@@ -165,7 +176,7 @@ function formHelper(angularHelper, serverValidationManager, notificationsService
*
* @description
* This wires up all of the server validation model state so that valServer and valServerField directives work
- *
+ *
* @param {object} err The error object returned from the http promise
*/
handleServerValidation: function (modelState) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js
index 0fa2d0df1a..0d0135fff8 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/iconhelper.service.js
@@ -3,7 +3,7 @@
* @name umbraco.services.iconHelper
* @description A helper service for dealing with icons, mostly dealing with legacy tree icons
**/
-function iconHelper($q, $timeout) {
+function iconHelper($http, $q, $sce, $timeout, umbRequestHelper) {
var converter = [
{ oldIcon: ".sprNew", newIcon: "add" },
@@ -85,11 +85,15 @@ function iconHelper($q, $timeout) {
{ oldIcon: ".sprTreeDeveloperPython", newIcon: "icon-linux" }
];
+ var collectedIcons;
+
var imageConverter = [
{oldImage: "contour.png", newIcon: "icon-umb-contour"}
];
- var collectedIcons;
+ var iconCache = [];
+ var liveRequests = [];
+ var allIconsRequested = false;
return {
@@ -154,9 +158,110 @@ function iconHelper($q, $timeout) {
return false;
},
- /** Return a list of icons, optionally filter them */
+ /** Converts the icon from legacy to a new one if an old one is detected */
+ convertFromLegacyIcon: function (icon) {
+ if (this.isLegacyIcon(icon)) {
+ //its legacy so convert it if we can
+ var found = _.find(converter, function (item) {
+ return item.oldIcon.toLowerCase() === icon.toLowerCase();
+ });
+ return (found ? found.newIcon : icon);
+ }
+ return icon;
+ },
+
+ convertFromLegacyImage: function (icon) {
+ var found = _.find(imageConverter, function (item) {
+ return item.oldImage.toLowerCase() === icon.toLowerCase();
+ });
+ return (found ? found.newIcon : undefined);
+ },
+
+ /** If we detect that the tree node has legacy icons that can be converted, this will convert them */
+ convertFromLegacyTreeNodeIcon: function (treeNode) {
+ if (this.isLegacyTreeNodeIcon(treeNode)) {
+ return this.convertFromLegacyIcon(treeNode.icon);
+ }
+ return treeNode.icon;
+ },
+
+ /** Gets a single IconModel */
+ getIcon: function(iconName) {
+ return $q((resolve, reject) => {
+ var icon = this._getIconFromCache(iconName);
+
+ if(icon !== undefined) {
+ resolve(icon);
+ } else {
+ var iconRequestPath = Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl + 'GetIcon?iconName=' + iconName;
+
+ // If the current icon is being requested, wait a bit so that we don't have to make another http request and can instead get the icon from the cache.
+ // This is a bit rough and ready and could probably be improved used an event based system
+ if(liveRequests.indexOf(iconRequestPath) >= 0) {
+ setTimeout(() => {
+ resolve(this.getIcon(iconName));
+ }, 10);
+ } else {
+ liveRequests.push(iconRequestPath);
+ // TODO - fix bug where Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl is undefinied when help icon
+ umbRequestHelper.resourcePromise(
+ $http.get(iconRequestPath)
+ ,'Failed to retrieve icon: ' + iconName)
+ .then(icon => {
+ if(icon) {
+ var trustedIcon = {
+ name: icon.Name,
+ svgString: $sce.trustAsHtml(icon.SvgString)
+ };
+ this._cacheIcon(trustedIcon);
+
+ liveRequests = _.filter(liveRequests, iconRequestPath);
+
+ resolve(trustedIcon);
+ }
+ })
+ .catch(err => {
+ console.warn(err);
+ });
+ };
+
+ }
+ });
+ },
+
+ /** Gets all the available icons in the backoffice icon folder and returns them as an array of IconModels */
+ getAllIcons: function() {
+ return $q((resolve, reject) => {
+ if(allIconsRequested === false) {
+ allIconsRequested = true;
+
+ umbRequestHelper.resourcePromise(
+ $http.get(Umbraco.Sys.ServerVariables.umbracoUrls.iconApiBaseUrl + 'GetAllIcons')
+ ,'Failed to retrieve icons')
+ .then(icons => {
+ icons.forEach(icon => {
+ var trustedIcon = {
+ name: icon.Name,
+ svgString: $sce.trustAsHtml(icon.SvgString)
+ };
+
+ this._cacheIcon(trustedIcon);
+ });
+
+ resolve(iconCache);
+ })
+ .catch(err => {
+ console.warn(err);
+ });;
+ } else {
+ resolve(iconCache);
+ }
+ });
+ },
+
+ /** LEGACY - Return a list of icons from icon fonts, optionally filter them */
/** It fetches them directly from the active stylesheets in the browser */
- getIcons: function(){
+ getLegacyIcons: function(){
var deferred = $q.defer();
$timeout(function(){
if(collectedIcons){
@@ -188,8 +293,13 @@ function iconHelper($q, $timeout) {
s = s.substring(0, hasPseudo);
}
- if(collectedIcons.indexOf(s) < 0){
- collectedIcons.push(s);
+ var icon = {
+ name: s,
+ svgString: undefined
+ };
+
+ if(collectedIcons.indexOf(icon) < 0 && s !== "icon-chevron-up" && s !== "icon-chevron-down"){
+ collectedIcons.push(icon);
}
}
}
@@ -198,35 +308,20 @@ function iconHelper($q, $timeout) {
deferred.resolve(collectedIcons);
}
}, 100);
-
+
return deferred.promise;
},
- /** Converts the icon from legacy to a new one if an old one is detected */
- convertFromLegacyIcon: function (icon) {
- if (this.isLegacyIcon(icon)) {
- //its legacy so convert it if we can
- var found = _.find(converter, function (item) {
- return item.oldIcon.toLowerCase() === icon.toLowerCase();
- });
- return (found ? found.newIcon : icon);
- }
- return icon;
+ /** A simple cache to ensure that the icon is only requested from the server if is isn't already in memory */
+ _cacheIcon: function(icon) {
+ if(_.find(iconCache, {name: icon.name}) === undefined) {
+ iconCache = _.union(iconCache, [icon]);
+ }
},
- convertFromLegacyImage: function (icon) {
- var found = _.find(imageConverter, function (item) {
- return item.oldImage.toLowerCase() === icon.toLowerCase();
- });
- return (found ? found.newIcon : undefined);
- },
-
- /** If we detect that the tree node has legacy icons that can be converted, this will convert them */
- convertFromLegacyTreeNodeIcon: function (treeNode) {
- if (this.isLegacyTreeNodeIcon(treeNode)) {
- return this.convertFromLegacyIcon(treeNode.icon);
- }
- return treeNode.icon;
+ /** Returns the cached icon or undefined */
+ _getIconFromCache: function(iconName) {
+ return _.find(iconCache, {name: iconName});
}
};
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js
index 75c9dccc30..6e5ee82ec7 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js
@@ -435,11 +435,16 @@ function mediaHelper(umbRequestHelper, $http, $log) {
imagePath,
animationProcessMode: options.animationProcessMode,
cacheBusterValue: options.cacheBusterValue,
- focalPoint: options.focalPoint,
+ focalPointLeft: options.focalPoint.left,
+ focalPointTop: options.focalPoint.top,
height: options.height,
mode: options.mode,
upscale: options.upscale || false,
- width: options.width
+ width: options.width,
+ cropX1: options.crop.x1,
+ cropX2: options.crop.x2,
+ cropY1: options.crop.y1,
+ cropY2: options.crop.y2
})),
"Failed to retrieve processed image URL for image: " + imagePath);
}
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 f903c44ad5..2a5d182a59 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
@@ -169,7 +169,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
//if the routing parameter keys are the same, we'll compare their values to see if any have changed and if so then the routing will be allowed.
if (diff1.length === 0 && diff2.length === 0) {
var partsChanged = 0;
- _.each(currRoutingKeys, function (k) {
+ currRoutingKeys.forEach(k => {
if (currUrlParams[k] != nextUrlParams[k]) {
partsChanged++;
}
@@ -206,7 +206,8 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
var toRetain = _.union(retainedQueryStrings, toRetain);
var currentSearch = $location.search();
$location.search('');
- _.each(toRetain, function (k) {
+
+ toRetain.forEach(k => {
if (currentSearch[k]) {
$location.search(k, currentSearch[k]);
}
@@ -240,7 +241,7 @@ function navigationService($routeParams, $location, $q, $injector, eventsService
var toRetain = Utilities.copy(nextRouteParams);
var updated = false;
- _.each(retainedQueryStrings, function (r) {
+ retainedQueryStrings.forEach(r => {
// if mculture is set to null in nextRouteParams, the value will be undefined and we will not retain any query string that has a value of "null"
if (currRouteParams[r] && nextRouteParams[r] !== undefined && !nextRouteParams[r]) {
toRetain[r] = currRouteParams[r];
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js b/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
index 123845a63b..ea05dad4e7 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/overlay.service.js
@@ -8,14 +8,14 @@
(function () {
"use strict";
- function overlayService(eventsService, backdropService) {
+ function overlayService(eventsService, backdropService, focusLockService) {
var currentOverlay = null;
function open(newOverlay) {
// prevent two open overlays at the same time
- if(currentOverlay) {
+ if (currentOverlay) {
close();
}
@@ -23,32 +23,34 @@
var overlay = newOverlay;
// set the default overlay position to center
- if(!overlay.position) {
+ if (!overlay.position) {
overlay.position = "center";
}
// set the default overlay size to small
- if(!overlay.size) {
+ if (!overlay.size) {
overlay.size = "small";
}
// use a default empty view if nothing is set
- if(!overlay.view) {
+ if (!overlay.view) {
overlay.view = "views/common/overlays/default/default.html";
}
// option to disable backdrop clicks
- if(overlay.disableBackdropClick) {
+ if (overlay.disableBackdropClick) {
backdropOptions.disableEventsOnClick = true;
}
overlay.show = true;
+ focusLockService.addInertAttribute();
backdropService.open(backdropOptions);
currentOverlay = overlay;
eventsService.emit("appState.overlay", overlay);
}
function close() {
+ focusLockService.removeInertAttribute();
backdropService.close();
currentOverlay = null;
eventsService.emit("appState.overlay", null);
@@ -90,7 +92,6 @@
}
open(overlay);
-
}
function confirmDelete(overlay) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
index fef286ec7e..803cd857b7 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/search.service.js
@@ -21,8 +21,8 @@
*
*/
angular.module('umbraco.services')
- .factory('searchService', function ($q, $log, entityResource, contentResource, umbRequestHelper, $injector, searchResultFormatter) {
-
+ .factory('searchService', function (entityResource, $injector, searchResultFormatter) {
+
return {
/**
@@ -42,12 +42,11 @@ angular.module('umbraco.services')
throw "args.term is required";
}
- return entityResource.search(args.term, "Member", args.searchFrom).then(function (data) {
- _.each(data, function (item) {
- searchResultFormatter.configureMemberResult(item);
+ return entityResource.search(args.term, "Member", args.searchFrom)
+ .then(data => {
+ data.forEach(item => searchResultFormatter.configureMemberResult(item));
+ return data;
});
- return data;
- });
},
/**
@@ -67,12 +66,11 @@ angular.module('umbraco.services')
throw "args.term is required";
}
- return entityResource.search(args.term, "Document", args.searchFrom, args.canceler, args.dataTypeKey).then(function (data) {
+ return entityResource.search(args.term, "Document", args.searchFrom, args.canceler, args.dataTypeKey)
_.each(data, function (item) {
- searchResultFormatter.configureContentResult(item);
+ data.forEach(item => searchResultFormatter.configureContentResult(item));
+ return data;
});
- return data;
- });
},
/**
@@ -92,12 +90,11 @@ angular.module('umbraco.services')
throw "args.term is required";
}
- return entityResource.search(args.term, "Media", args.searchFrom, args.canceler, args.dataTypeKey).then(function (data) {
- _.each(data, function (item) {
- searchResultFormatter.configureMediaResult(item);
+ return entityResource.search(args.term, "Media", args.searchFrom, args.canceler, args.dataTypeKey)
+ .then(data => {
+ data.forEach(item => searchResultFormatter.configureMediaResult(item));
+ return data;
});
- return data;
- });
},
/**
@@ -117,10 +114,8 @@ angular.module('umbraco.services')
throw "args.term is required";
}
- return entityResource.searchAll(args.term, args.canceler).then(function (data) {
-
- _.each(data, function (resultByType) {
-
+ return entityResource.searchAll(args.term, args.canceler).then(data => {
+ Object.values(data).forEach(resultByType => {
//we need to format the search result data to include things like the subtitle, urls, etc...
// this is done with registered angular services as part of the SearchableTreeAttribute, if that
// is not found, than we format with the default formatter
@@ -140,7 +135,7 @@ angular.module('umbraco.services')
}
}
//now apply the formatter for each result
- _.each(resultByType.results, function (item) {
+ resultByType.results.forEach(item => {
formatterMethod.apply(this, [item, resultByType.treeAlias, resultByType.appAlias]);
});
@@ -148,12 +143,10 @@ angular.module('umbraco.services')
return data;
});
-
},
// TODO: This doesn't do anything!
setCurrent: function (sectionAlias) {
-
var currentSection = sectionAlias;
}
};
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
index 9945396262..5d6b4646a3 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
@@ -1372,6 +1372,9 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
// throw "args.model.value is required";
//}
+ // force TinyMCE to load plugins/themes from minified files (see http://archive.tinymce.com/wiki.php/api4:property.tinymce.suffix.static)
+ args.editor.suffix = ".min";
+
var unwatch = null;
//Starts a watch on the model value so that we can update TinyMCE if the model changes behind the scenes or from the server
@@ -1516,6 +1519,8 @@ function tinyMceService($rootScope, $q, imageHelper, $locale, $http, $timeout, s
});
args.editor.on('Dirty', function (e) {
+ syncContent(); // Set model.value to the RTE's content
+
//make the form dirty manually so that the track changes works, setting our model doesn't trigger
// the angular bits because tinymce replaces the textarea.
if (args.currentForm) {
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js b/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js
index 0d6216f7cc..37485ea7eb 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/tree.service.js
@@ -54,7 +54,7 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS
//take the last child
var childPath = this.getPath(node.children[node.children.length - 1]).join(",");
//check if this already exists, if so exit
- if (expandedPaths.indexOf(childPath) !== -1) {
+ if (expandedPaths.includes(childPath)) {
return;
}
@@ -65,18 +65,18 @@ function treeService($q, treeResource, iconHelper, notificationsService, eventsS
var clonedPaths = expandedPaths.slice(0); //make a copy to iterate over so we can modify the original in the iteration
- _.each(clonedPaths, function (p) {
+ clonedPaths.forEach(p => {
if (childPath.startsWith(p + ",")) {
//this means that the node's path supercedes this path stored so we can remove the current 'p' and replace it with node.path
expandedPaths.splice(expandedPaths.indexOf(p), 1); //remove it
- if (expandedPaths.indexOf(childPath) === -1) {
+ if (expandedPaths.includes(childPath) === false) {
expandedPaths.push(childPath); //replace it
}
}
else if (p.startsWith(childPath + ",")) {
//this means we've already tracked a deeper node so we shouldn't track this one
}
- else if (expandedPaths.indexOf(childPath) === -1) {
+ else if (expandedPaths.includes(childPath) === false) {
expandedPaths.push(childPath); //track it
}
});
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js
index 90125e7de6..78c8b5fa88 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/umbrequesthelper.service.js
@@ -264,9 +264,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe
//reset the tabs and set the active one
if (response.data.tabs && response.data.tabs.length > 0) {
- _.each(response.data.tabs, function (item) {
- item.active = false;
- });
+ response.data.tabs.forEach(item => item.active = false);
response.data.tabs[activeTabIndex].active = true;
}
@@ -327,7 +325,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe
if (!jsonData) { throw "jsonData cannot be null"; }
if (Utilities.isArray(jsonData)) {
- _.each(jsonData, function (item) {
+ jsonData.forEach(item => {
if (!item.key || !item.value) { throw "jsonData array item must have both a key and a value property"; }
});
}
@@ -345,7 +343,7 @@ function umbRequestHelper($http, $q, notificationsService, eventsService, formHe
var formData = new FormData();
//add the json data
if (Utilities.isArray(data)) {
- _.each(data, function(item) {
+ data.forEach(item => {
formData.append(item.key, !Utilities.isString(item.value) ? Utilities.toJson(item.value) : item.value);
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js b/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js
index 1bda86c3b3..e6450798fb 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/usershelper.service.js
@@ -12,36 +12,23 @@
{ "value": 4, "name": "Inactive", "key": "Inactive", "color": "warning" }
];
- localizationService.localizeMany(_.map(userStates, function (userState) {
- return "user_state" + userState.key;
- })).then(function (data) {
- var reg = /^\[[\S\s]*]$/g;
- _.each(data, function (value, index) {
- if (!reg.test(value)) {
- // Only translate if key exists
- userStates[index].name = value;
- }
+ localizationService.localizeMany(userStates.map(userState => "user_state" + userState.key))
+ .then(data => {
+ var reg = /^\[[\S\s]*]$/g;
+ data.forEach((value, index) => {
+ if (!reg.test(value)) {
+ // Only translate if key exists
+ userStates[index].name = value;
+ }
+ });
});
- });
- function getUserStateFromValue(value) {
- var foundUserState;
- angular.forEach(userStates, function (userState) {
- if(userState.value === value) {
- foundUserState = userState;
- }
- });
- return foundUserState;
+ function getUserStateFromValue(value) {
+ return userStates.find(userState => userState.value === value);
}
function getUserStateByKey(key) {
- var foundUserState;
- angular.forEach(userStates, function (userState) {
- if(userState.key === key) {
- foundUserState = userState;
- }
- });
- return foundUserState;
+ return userStates.find(userState => userState.key === key);
}
function getUserStatesFilter(userStatesObject) {
@@ -49,7 +36,7 @@
var userStatesFilter = [];
for (var key in userStatesObject) {
- if (userStatesObject.hasOwnProperty(key)) {
+ if (hasOwnProperty.call(userStatesObject, key)) {
var userState = getUserStateByKey(key);
if(userState) {
userState.count = userStatesObject[key];
@@ -59,7 +46,6 @@
}
return userStatesFilter;
-
}
////////////
@@ -71,10 +57,7 @@
};
return service;
-
}
angular.module('umbraco.services').factory('usersHelper', usersHelperService);
-
-
})();
diff --git a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
index 82353df744..1fb5884d4c 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/util.service.js
@@ -173,9 +173,9 @@ function umbModelMapper() {
/** This converts the source model to a basic entity model, it will throw an exception if there isn't enough data to create the model */
convertToEntityBasic: function (source) {
var required = ["id", "name", "icon", "parentId", "path"];
- _.each(required, function (k) {
- if (!_.has(source, k)) {
- throw "The source object does not contain the property " + k;
+ required.forEach(k => {
+ if (!hasOwnProperty.call(source, k)) {
+ throw `The source object does not contain the property ${k}`;
}
});
var optional = ["metaData", "key", "alias"];
diff --git a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
index fc870858cf..cfe0940aa2 100644
--- a/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
+++ b/src/Umbraco.Web.UI.Client/src/installer/steps/database.html
@@ -1,118 +1,121 @@
-
Configure your database
-
- Enter connection and authentication details for the database you want to install Umbraco on
-
+
Configure your database
+
+ Enter connection and authentication details for the database you want to install Umbraco on
+
-
@@ -102,10 +102,10 @@
{{topic.name}}
-
+ {{topic.description}}
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js
index aa0cd54dff..ab8c133211 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.controller.js
@@ -1,15 +1,17 @@
(function () {
"use strict";
- function CompositionsController($scope, $location, $filter, overlayService, localizationService) {
+ function CompositionsController($scope, $location, $filter, $timeout, overlayService, localizationService) {
var vm = this;
var oldModel = null;
vm.showConfirmSubmit = false;
+ vm.loading = false;
vm.isSelected = isSelected;
vm.openContentType = openContentType;
+ vm.selectCompositeContentType = selectCompositeContentType;
vm.submit = submit;
vm.close = close;
@@ -23,10 +25,13 @@
$scope.model.title = "Compositions";
}
- // group the content types by their container paths
+ // Group the content types by their container paths
vm.availableGroups = $filter("orderBy")(
_.map(
_.groupBy($scope.model.availableCompositeContentTypes, function (compositeContentType) {
+
+ compositeContentType.selected = isSelected(compositeContentType.contentType.alias);
+
return compositeContentType.contentType.metaData.containerPath;
}), function (group) {
return {
@@ -39,12 +44,12 @@
});
}
-
-
+
function isSelected(alias) {
if ($scope.model.contentType.compositeContentTypes.indexOf(alias) !== -1) {
return true;
}
+ return false;
}
function openContentType(contentType, section) {
@@ -52,6 +57,43 @@
$location.path(url);
}
+ function selectCompositeContentType(compositeContentType) {
+
+ vm.loading = true;
+
+ var contentType = compositeContentType.contentType;
+
+ $scope.model.selectCompositeContentType(contentType).then(function (response) {
+
+ Utilities.forEach(vm.availableGroups, function (group) {
+
+ Utilities.forEach(group.compositeContentTypes, function (obj) {
+ if (obj.allowed === false) {
+ obj.selected = false;
+ }
+ });
+ });
+
+ $timeout(function () {
+ vm.loading = false;
+ }, 500);
+
+ }, function () {
+ $timeout(function () {
+ vm.loading = false;
+ }, 500);
+ });
+
+ // Check if the template is already selected.
+ var index = $scope.model.contentType.compositeContentTypes.indexOf(contentType.alias);
+
+ if (index === -1) {
+ $scope.model.contentType.compositeContentTypes.push(contentType.alias);
+ } else {
+ $scope.model.contentType.compositeContentTypes.splice(index, 1);
+ }
+ }
+
function submit() {
if ($scope.model && $scope.model.submit) {
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html
index 4096192081..436c4ea30a 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/compositions/compositions.html
@@ -19,38 +19,39 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js
index 55d7a75000..f2a89ba7ea 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/sectionpicker/sectionpicker.controller.js
@@ -47,8 +47,8 @@
}
function preSelect(selection) {
- angular.forEach(selection, function(selected){
- angular.forEach(vm.sections, function(section){
+ selection.forEach(function(selected){
+ vm.sections.forEach(function(section){
if(selected.alias === section.alias) {
section.selected = true;
}
@@ -65,7 +65,7 @@
} else {
- angular.forEach($scope.model.selection, function(selectedSection, index){
+ $scope.model.selection.forEach(function(selectedSection, index){
if(selectedSection.alias === section.alias) {
section.selected = false;
$scope.model.selection.splice(index, 1);
@@ -77,7 +77,7 @@
}
function setSectionIcon(sections) {
- angular.forEach(sections, function(section) {
+ sections.forEach(function(section) {
section.icon = "icon-section";
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js
index 387dd71da8..c519a1d4fa 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.controller.js
@@ -188,8 +188,17 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
//used advanced filtering
if ($scope.model.filter.startsWith("{")) {
$scope.model.filterAdvanced = true;
- //convert to object
- $scope.model.filter = Utilities.fromJson($scope.model.filter);
+
+ if ($scope.model.filterByMetadata && !angular.isFunction($scope.model.filter))
+ {
+ var filter = angular.fromJson($scope.model.filter);
+ $scope.model.filter = function (node){ return _.isMatch(node.metaData, filter);};
+ }
+ else
+ {
+ //convert to object
+ $scope.model.filter = Utilities.fromJson($scope.model.filter);
+ }
}
}
}
@@ -274,19 +283,14 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
if (Utilities.isArray(args.children)) {
//iterate children
- _.each(args.children,
- function (child) {
-
- //now we need to look in the already selected search results and
- // toggle the check boxes for those ones that are listed
- var exists = _.find(vm.searchInfo.selectedSearchResults,
- function (selected) {
- return child.id == selected.id;
- });
- if (exists) {
- child.selected = true;
- }
- });
+ args.children.forEach(child => {
+ //now we need to look in the already selected search results and
+ // toggle the check boxes for those ones that are listed
+ var exists = vm.searchInfo.selectedSearchResults.find(selected => child.id === selected.id);
+ if (exists) {
+ child.selected = true;
+ }
+ });
//check filter
performFiltering(args.children);
@@ -456,8 +460,7 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
? _.filter(nodes, $scope.model.filter)
: _.where(nodes, $scope.model.filter);
- angular.forEach(filtered,
- function (value, key) {
+ filtered.forEach(function (value) {
value.filtered = true;
if ($scope.model.filterCssClass) {
if (!value.cssClasses) {
@@ -470,8 +473,7 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
}
else {
var a = $scope.model.filter.toLowerCase().replace(/\s/g, '').split(',');
- angular.forEach(nodes,
- function (value, key) {
+ nodes.forEach(function (value) {
var found = a.indexOf(value.metaData.contentType.toLowerCase()) >= 0;
@@ -541,78 +543,66 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
//we need to ensure that any currently displayed nodes that get selected
// from the search get updated to have a check box!
function checkChildren(children) {
- _.each(children,
- function (child) {
- //check if the id is in the selection, if so ensure it's flagged as selected
- var exists = _.find(vm.searchInfo.selectedSearchResults,
- function (selected) {
- return child.id == selected.id;
+ children.forEach(child => {
+ //check if the id is in the selection, if so ensure it's flagged as selected
+ var exists = vm.searchInfo.selectedSearchResults.find(selected => child.id === selected.id);
+ //if the curr node exists in selected search results, ensure it's checked
+ if (exists) {
+ child.selected = true;
+ }
+ //if the curr node does not exist in the selected search result, and the curr node is a child of a list view search result
+ else if (child.metaData.isSearchResult) {
+ //if this tree node is under a list view it means that the node was added
+ // to the tree dynamically under the list view that was searched, so we actually want to remove
+ // it all together from the tree
+ var listView = child.parent();
+ listView.children = _.reject(listView.children,
+ function (c) {
+ return c.id == child.id;
});
- //if the curr node exists in selected search results, ensure it's checked
- if (exists) {
- child.selected = true;
- }
- //if the curr node does not exist in the selected search result, and the curr node is a child of a list view search result
- else if (child.metaData.isSearchResult) {
- //if this tree node is under a list view it means that the node was added
- // to the tree dynamically under the list view that was searched, so we actually want to remove
- // it all together from the tree
- var listView = child.parent();
- listView.children = _.reject(listView.children,
- function (c) {
- return c.id == child.id;
- });
- }
+ }
- //check if the current node is a list view and if so, check if there's any new results
- // that need to be added as child nodes to it based on search results selected
- if (child.metaData.isContainer) {
+ //check if the current node is a list view and if so, check if there's any new results
+ // that need to be added as child nodes to it based on search results selected
+ if (child.metaData.isContainer) {
- child.cssClasses = _.reject(child.cssClasses,
- function (c) {
- return c === 'tree-node-slide-up-hide-active';
- });
+ child.cssClasses = _.reject(child.cssClasses,
+ function (c) {
+ return c === 'tree-node-slide-up-hide-active';
+ });
- var listViewResults = _.filter(vm.searchInfo.selectedSearchResults,
- function (i) {
- return i.parentId == child.id;
- });
- _.each(listViewResults,
- function (item) {
- var childExists = _.find(child.children,
- function (c) {
- return c.id == item.id;
- });
- if (!childExists) {
- var parent = child;
- child.children.unshift({
- id: item.id,
- name: item.name,
- cssClass: "icon umb-tree-icon sprTree " + item.icon,
- level: child.level + 1,
- metaData: {
- isSearchResult: true
- },
- hasChildren: false,
- parent: function () {
- return parent;
- }
- });
- }
- });
- }
+ var listViewResults = vm.searchInfo.selectedSearchResults.filter(i => i.parentId === child.id);
- //recurse
- if (child.children && child.children.length > 0) {
- checkChildren(child.children);
- }
- });
+ listViewResults.forEach(item => {
+ var childExists = child.children.find(c => c.id === item.id);
+
+ if (!childExists) {
+ var parent = child;
+ child.children.unshift({
+ id: item.id,
+ name: item.name,
+ cssClass: "icon umb-tree-icon sprTree " + item.icon,
+ level: child.level + 1,
+ metaData: {
+ isSearchResult: true
+ },
+ hasChildren: false,
+ parent: () => parent
+ });
+ }
+ });
+ }
+
+ //recurse
+ if (child.children && child.children.length > 0) {
+ checkChildren(child.children);
+ }
+ });
}
checkChildren(tree.root.children);
}
-
vm.searchInfo.showSearch = false;
vm.searchInfo.searchFromId = vm.startNodeId;
vm.searchInfo.searchFromName = null;
@@ -625,24 +615,16 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
performFiltering(results);
//now actually remove all filtered items so they are not even displayed
- results = _.filter(results,
- function (item) {
- return !item.filtered;
- });
-
+ results = results.filter(item => !item.filtered);
vm.searchInfo.results = results;
//sync with the curr selected results
- _.each(vm.searchInfo.results,
- function (result) {
- var exists = _.find($scope.model.selection,
- function (item) {
- return result.id == item.id;
- });
- if (exists) {
- result.selected = true;
- }
- });
+ vm.searchInfo.results.forEach(result => {
+ var exists = $scope.model.selection.find(item => result.id === item.id);
+ if (exists) {
+ result.selected = true;
+ }
+ });
vm.searchInfo.showSearch = true;
}
@@ -664,12 +646,8 @@ angular.module("umbraco").controller("Umbraco.Editors.TreePickerController",
}
function listViewItemsLoaded(items) {
- var selectedIds = _.pluck($scope.model.selection, "id");
- _.each(items, function (item) {
- if (_.contains(selectedIds, item.id)) {
- item.selected = true;
- }
- });
+ var selectedIds = $scope.model.selection.map(x => x.id);
+ items.forEach(item => item.selected = selectedIds.includes(item.id));
}
function submit(model) {
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
index 0c10d94136..c816c31b3e 100644
--- a/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
+++ b/src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/treepicker/treepicker.html
@@ -19,12 +19,12 @@
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.notify.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.notify.controller.js
index 1435b0854e..29619f2b96 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/content.notify.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/content/content.notify.controller.js
@@ -31,7 +31,7 @@
vm.saveError = false;
vm.saveSuccces = false;
var selectedString = [];
- angular.forEach(notifyOptions, function (option) {
+ notifyOptions.forEach(function (option) {
if (option.checked === true && option.notifyCode) {
selectedString.push(option.notifyCode);
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.rights.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.rights.controller.js
index 0e40fc2e6c..78521af2fe 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/content.rights.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/content/content.rights.controller.js
@@ -39,7 +39,7 @@
//reset this
vm.selectedUserGroups = [];
vm.availableUserGroups = userGroups;
- angular.forEach(vm.availableUserGroups, function (group) {
+ vm.availableUserGroups.forEach(function (group) {
if (group.permissions) {
//if there's explicit permissions assigned than it's selected
assignGroupPermissions(group);
@@ -70,8 +70,8 @@
group.allowedPermissions = [];
// get list of checked permissions
- angular.forEach(group.permissions, function (permissionGroup) {
- angular.forEach(permissionGroup, function (permission) {
+ Object.values(group.permissions).forEach(function (permissionGroup) {
+ permissionGroup.forEach(function (permission) {
if (permission.checked) {
//the `allowedPermissions` is what will get sent up to the server for saving
group.allowedPermissions.push(permission);
@@ -117,9 +117,9 @@
}
function formatSaveModel(permissionsSave, groupCollection) {
- angular.forEach(groupCollection, function (g) {
+ groupCollection.forEach(function (g) {
permissionsSave[g.id] = [];
- angular.forEach(g.allowedPermissions, function (p) {
+ g.allowedPermissions.forEach(function (p) {
permissionsSave[g.id].push(p.permissionCode);
});
});
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js
index f3113f5c8f..3fda4cb577 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/content/content.sort.controller.js
@@ -11,6 +11,8 @@
vm.saveButtonState = "init";
vm.sortOrder = {};
vm.sortableOptions = {
+ axis: "y",
+ containment: "parent",
distance: 10,
tolerance: "pointer",
opacity: 0.7,
@@ -68,7 +70,7 @@
function sort(column) {
// reverse if it is already ordered by that column
- if(vm.sortOrder.column === column) {
+ if (vm.sortOrder.column === column) {
vm.sortOrder.reverse = !vm.sortOrder.reverse
} else {
vm.sortOrder.column = column;
@@ -82,7 +84,6 @@
}
onInit();
-
}
angular.module("umbraco").controller("Umbraco.Editors.Content.SortController", ContentSortController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js
index 80207bb920..ffcd518ece 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.controller.js
@@ -1,7 +1,7 @@
(function () {
"use strict";
- function PublishController($scope, localizationService, contentEditingHelper) {
+ function PublishController($scope, localizationService) {
var vm = this;
vm.loading = true;
@@ -9,23 +9,23 @@
vm.changeSelection = changeSelection;
- /** Returns true if publish meets the requirements of mandatory languages */
+ /**
+ * Returns true if publish meets the requirements of mandatory languages
+ * */
function canPublish() {
-
+
var hasSomethingToPublish = false;
- for (var i = 0; i < vm.variants.length; i++) {
- var variant = vm.variants[i];
-
- // if varaint is mandatory and not already published, then we require it to be set to publish:
+ vm.variants.forEach(variant => {
+ // if variant is mandatory and not already published:
if (variant.publish === false && notPublishedMandatoryFilter(variant)) {
return false;
}
if (variant.publish === true) {
hasSomethingToPublish = true;
}
+ });
- }
return hasSomethingToPublish;
}
@@ -36,61 +36,74 @@
variant.save = variant.publish;
}
-
function hasAnyDataFilter(variant) {
- // if we have a name, then we have data.
- if (variant.name != null && variant.name.length > 0) {
- return true;
+ if (variant.name == null || variant.name.length === 0) {
+ return false;
}
if(variant.isDirty === true) {
return true;
}
- for (var t=0; t < variant.tabs.length; t++){
- for (var p=0; p < variant.tabs[t].properties.length; p++){
- var property = variant.tabs[t].properties[p];
+ variant.tabs.forEach(tab => {
+ tab.properties.forEach(property => {
if (property.value != null && property.value.length > 0) {
return true;
}
- }
- }
+ });
+ });
return false;
}
+ /**
+ * determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
+ * * it's editor is in a $dirty state
+ * * it has pending saves
+ * * it is unpublished
+ * @param {*} variant
+ */
function dirtyVariantFilter(variant) {
- //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
- // * it's editor is in a $dirty state
- // * it has pending saves
- // * it is unpublished
return (variant.isDirty || variant.state === "Draft" || variant.state === "PublishedPendingChanges");
}
+ /**
+ * determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
+ * * variant is active
+ * * it's editor is in a $dirty state
+ * * it has pending saves
+ * * it is unpublished
+ * @param {*} variant
+ */
function publishableVariantFilter(variant) {
- //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
- // * variant is active
- // * it's editor is in a $dirty state
- // * it has pending saves
- // * it is unpublished
+
return (variant.active || variant.isDirty || variant.state === "Draft" || variant.state === "PublishedPendingChanges");
}
function notPublishedMandatoryFilter(variant) {
- return variant.state !== "Published" && variant.state !== "PublishedPendingChanges" && variant.isMandatory === true;
+ return variant.state !== "Published" && isMandatoryFilter(variant);
}
- function isMandatoryFilter(variant) {
- //determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
- // * has a mandatory language
- // * without having a segment, segments cant be mandatory at current state of code.
+
+ /**
+ * determine a variant is 'dirty' (meaning it will show up as publish-able) if it's
+ * * has a mandatory language
+ * * without having a segment, segments cant be mandatory at current state of code.
+ * @param {*} variant
+ */
+ function isMandatoryFilter(variant) {
return (variant.language && variant.language.isMandatory === true && variant.segment == null);
}
+
+ /**
+ * determine a variant is needed, but not already a choice.
+ * * publishable — aka. displayed as a publish option.
+ * * published — its already published and everything is then fine.
+ * * mandatory — this is needed, and thats why we highlight it.
+ * @param {*} variant
+ */
function notPublishableButMandatoryFilter(variant) {
- //determine a variant is needed, but not already a choice.
- // * publishable — aka. displayed as a publish option.
- // * published — its already published and everything is then fine.
- // * mandatory — this is needed, and thats why we highlight it.
+
return !publishableVariantFilter(variant) && variant.state !== "Published" && variant.isMandatory === true;
}
@@ -98,54 +111,48 @@
vm.variants = $scope.model.variants;
- _.each(vm.variants, (variant) => {
+ // If we have a variant that's not in the state of NotCreated,
+ // then we know we have data and it's not a new content node.
+ vm.isNew = vm.variants.some(variant => variant.state === 'NotCreated');
+ vm.variants.forEach(variant => {
+
// reset to not be published
- variant.publish = false;
- variant.save = false;
+ variant.publish = variant.save = false;
variant.isMandatory = isMandatoryFilter(variant);
- // If we have a variant thats not in the state of NotCreated, then we know we have adata and its not a new content node.
- if(variant.state !== "NotCreated") {
- vm.isNew = false;
- }
- });
-
- _.each(vm.variants, (variant) => {
-
// if this is a new node and we have data on this variant.
- if(vm.isNew === true && hasAnyDataFilter(variant)) {
+ if (vm.isNew === true && hasAnyDataFilter(variant)) {
variant.save = true;
}
-
});
vm.availableVariants = vm.variants.filter(publishableVariantFilter);
vm.missingMandatoryVariants = vm.variants.filter(notPublishableButMandatoryFilter);
// if any active varaiant that is available for publish, we set it to be published:
- _.each(vm.availableVariants, (v) => {
+ vm.availableVariants.forEach(v => {
if(v.active) {
v.save = v.publish = true;
}
});
if (vm.availableVariants.length !== 0) {
- vm.availableVariants.sort(function (a, b) {
+ vm.availableVariants.sort((a, b) => {
if (a.language && b.language) {
- if (a.language.name > b.language.name) {
+ if (a.language.name < b.language.name) {
return -1;
}
- if (a.language.name < b.language.name) {
+ if (a.language.name > b.language.name) {
return 1;
}
- }
+ }
if (a.segment && b.segment) {
- if (a.segment > b.segment) {
+ if (a.segment < b.segment) {
return -1;
}
- if (a.segment < b.segment) {
+ if (a.segment > b.segment) {
return 1;
}
}
@@ -153,35 +160,28 @@
});
}
-
$scope.model.disableSubmitButton = !canPublish();
- if (vm.missingMandatoryVariants.length > 0) {
- localizationService.localize("content_notReadyToPublish").then(function (value) {
+ const localizeKey = vm.missingMandatoryVariants.length > 0 ? 'content_notReadyToPublish' :
+ !$scope.model.title ? 'content_readyToPublish' : '';
+
+ if (localizeKey) {
+ localizationService.localize(localizeKey).then(value => {
$scope.model.title = value;
vm.loading = false;
});
} else {
- if (!$scope.model.title) {
- localizationService.localize("content_readyToPublish").then(function (value) {
- $scope.model.title = value;
- vm.loading = false;
- });
- } else {
- vm.loading = false;
- }
+ vm.loading = false;
}
-
}
onInit();
//when this dialog is closed, reset all 'publish' flags
- $scope.$on('$destroy', function () {
- for (var i = 0; i < vm.variants.length; i++) {
- vm.variants[i].publish = false;
- vm.variants[i].save = false;
- }
+ $scope.$on('$destroy', () => {
+ vm.variants.forEach(variant => {
+ variant.publish = variant.save = false;
+ });
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html
index c3e0b90f5f..71e19651d6 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html
+++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publish.html
@@ -21,16 +21,19 @@
on-change="vm.changeSelection(variant)"
server-validation-field="{{variant.htmlId}}">
-
-
-
- — {{variant.language.name}}
- *
+
+
+ *
+
+
+
+ — {{variant.language.name}}
+ * -
-
+ {{publishVariantSelectorForm.publishVariantSelector.errorMsg}}
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.controller.js b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.controller.js
index 5d4cc7eec7..f8a7b005cf 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.controller.js
@@ -4,7 +4,6 @@
function PublishDescendantsController($scope, localizationService) {
var vm = this;
-
vm.includeUnpublished = $scope.model.includeUnpublished || false;
vm.changeSelection = changeSelection;
@@ -18,50 +17,47 @@
// get localized texts for use in directives
if (!$scope.model.title) {
- localizationService.localize("buttons_publishDescendants").then(function (value) {
+ localizationService.localize("buttons_publishDescendants").then(value => {
$scope.model.title = value;
});
}
if (!vm.labels.includeUnpublished) {
- localizationService.localize("content_includeUnpublished").then(function (value) {
+ localizationService.localize("content_includeUnpublished").then(value => {
vm.labels.includeUnpublished = value;
});
}
- _.each(vm.variants, function (variant) {
+ vm.variants.forEach(variant => {
variant.isMandatory = isMandatoryFilter(variant);
});
if (vm.variants.length > 1) {
- vm.displayVariants.sort(function (a, b) {
+ vm.displayVariants.sort((a, b) => {
if (a.language && b.language) {
- if (a.language.name > b.language.name) {
+ if (a.language.name < b.language.name) {
return -1;
}
- if (a.language.name < b.language.name) {
+ if (a.language.name > b.language.name) {
return 1;
}
}
if (a.segment && b.segment) {
- if (a.segment > b.segment) {
+ if (a.segment < b.segment) {
return -1;
}
- if (a.segment < b.segment) {
+ if (a.segment > b.segment) {
return 1;
}
}
return 0;
});
- var active = _.find(vm.variants, function (v) {
- return v.active;
- });
+ var active = vm.variants.find(v => v.active);
if (active) {
//ensure that the current one is selected
- active.publish = true;
- active.save = true;
+ active.publish = active.save = true;
}
$scope.model.disableSubmitButton = !canPublish();
@@ -72,8 +68,7 @@
"key": "content_publishDescendantsHelp",
"tokens": [vm.variants[0].name]
};
- }
-
+ }
}
function toggleIncludeUnpublished() {
@@ -85,12 +80,11 @@
/** Returns true if publishing is possible based on if there are un-published mandatory languages */
function canPublish() {
var selected = [];
- for (var i = 0; i < vm.variants.length; i++) {
- var variant = vm.variants[i];
+ vm.variants.forEach(variant => {
var published = !(variant.state === "NotCreated" || variant.state === "Draft");
- if (variant.segment == null && variant.language && variant.language.isMandatory && !published && !variant.publish) {
+ if (variant.segment == null && variant.language && variant.language.isMandatory && !published && !variant.publish) {
//if a mandatory variant isn't published
//and not flagged for saving
//then we cannot continue
@@ -102,7 +96,8 @@
if (variant.publish) {
selected.push(variant.publish);
}
- }
+ });
+
return selected.length > 0;
}
@@ -121,11 +116,10 @@
}
//when this dialog is closed, reset all 'publish' flags
- $scope.$on('$destroy', function () {
- for (var i = 0; i < vm.variants.length; i++) {
- vm.variants[i].publish = false;
- vm.variants[i].save = false;
- }
+ $scope.$on('$destroy', () => {
+ vm.variants.forEach(variant => {
+ variant.publish = variant.save = false;
+ });
});
onInit();
diff --git a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html
index cfc185818c..14dcc3a760 100644
--- a/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html
+++ b/src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html
@@ -9,10 +9,12 @@
+ show-labels="true">
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js
index cdabb05fd4..534b60c120 100644
--- a/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/dashboard.tabs.controller.js
@@ -70,7 +70,7 @@ function startUpDynamicContentController($q, $timeout, $scope, dashboardResource
{
title: "Umbraco.TV - Learn from the source!",
description: "Umbraco.TV will help you go from zero to Umbraco hero at a pace that suits you. Our easy to follow online training videos will give you the fundamental knowledge to start building awesome Umbraco websites.",
- img: "views/dashboard/default/umbracotv.jpg",
+ img: "views/dashboard/default/umbracotv.png",
url: "https://umbraco.tv/?utm_source=core&utm_medium=dashboard&utm_content=image&utm_campaign=tv",
altText: "Umbraco.TV - Hours of Umbraco Video Tutorials",
buttonText: "Visit Umbraco.TV"
@@ -78,7 +78,7 @@ function startUpDynamicContentController($q, $timeout, $scope, dashboardResource
{
title: "Our Umbraco - The Friendliest Community",
description: "Our Umbraco - the official community site is your one stop for everything Umbraco. Whether you need a question answered or looking for cool plugins, the world's best and friendliest community is just a click away.",
- img: "views/dashboard/default/ourumbraco.jpg",
+ img: "views/dashboard/default/ourumbraco.png",
url: "https://our.umbraco.com/?utm_source=core&utm_medium=dashboard&utm_content=image&utm_campaign=our",
altText: "Our Umbraco",
buttonText: "Visit Our Umbraco"
@@ -109,19 +109,16 @@ function startUpDynamicContentController($q, $timeout, $scope, dashboardResource
//we capture it like this, so we avoid UI errors - which automatically triggers ui based on http response code
if (data && data.sections) {
vm.dashboard = data;
- } else{
+ } else {
vm.showDefault = true;
}
-
},
-
function (exception) {
console.error(exception);
vm.loading = false;
vm.showDefault = true;
});
-
onInit();
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.jpg b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.jpg
deleted file mode 100644
index 5d5324e3de..0000000000
Binary files a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.jpg and /dev/null differ
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.png b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.png
new file mode 100644
index 0000000000..d0fb4e6235
Binary files /dev/null and b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/ourumbraco.png differ
diff --git a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/startupdashboardintro.html b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/startupdashboardintro.html
index 17a4dcdb65..330548bedd 100644
--- a/src/Umbraco.Web.UI.Client/src/views/dashboard/default/startupdashboardintro.html
+++ b/src/Umbraco.Web.UI.Client/src/views/dashboard/default/startupdashboardintro.html
@@ -35,7 +35,6 @@
-
+ Add
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js
index aaf41f3083..42ce10c519 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.controller.js
@@ -17,7 +17,7 @@
$scope.model.value = [];
}
- //add any fields that there isn't values for
+ // Add any fields that there isn't values for
if ($scope.model.config.min > 0) {
for (var i = 0; i < $scope.model.config.min; i++) {
if ((i + 1) > $scope.model.value.length) {
@@ -37,7 +37,7 @@
if ($scope.model.config.max <= 0 && txtBoxValue.value || $scope.model.value.length < $scope.model.config.max && txtBoxValue.value) {
var newItemIndex = index + 1;
$scope.model.value.splice(newItemIndex, 0, { value: "" });
- //Focus on the newly added value
+ // Focus on the newly added value
$scope.model.value[newItemIndex].hasFocus = true;
}
break;
@@ -47,7 +47,7 @@
var remainder = [];
// Used to require an extra hit on backspace for the field to be removed
- if(txtBoxValue.value === "") {
+ if (txtBoxValue.value === "") {
backspaceHits++;
} else {
backspaceHits = 0;
@@ -64,11 +64,11 @@
var prevItemIndex = index - 1;
- //Set focus back on false as the directive only watches for true
- if(prevItemIndex >= 0) {
+ // Set focus back on false as the directive only watches for true
+ if (prevItemIndex >= 0) {
$scope.model.value[prevItemIndex].hasFocus = false;
$timeout(function () {
- //Focus on the previous value
+ // Focus on the previous value
$scope.model.value[prevItemIndex].hasFocus = true;
});
}
@@ -81,12 +81,13 @@
default:
}
validate();
- }
+ };
$scope.add = function () {
if ($scope.model.config.max <= 0 || $scope.model.value.length < $scope.model.config.max) {
$scope.model.value.push({ value: "" });
- // focus new value
+
+ // Focus new value
var newItemIndex = $scope.model.value.length - 1;
$scope.model.value[newItemIndex].hasFocus = true;
}
@@ -106,7 +107,7 @@
$scope.model.value = remainder;
};
- $scope.showPrompt = function (idx, item){
+ $scope.showPrompt = function (idx, item) {
var i = $scope.model.value.indexOf(item);
@@ -114,11 +115,11 @@
if (i === idx) {
$scope.promptIsVisible = i;
}
- }
+ };
- $scope.hidePrompt = function(){
+ $scope.hidePrompt = function () {
$scope.promptIsVisible = "-1";
- }
+ };
function validate() {
if ($scope.multipleTextboxForm) {
@@ -126,10 +127,22 @@
$scope.multipleTextboxForm.mandatory.$setValidity("minCount", !invalid);
}
}
+
$timeout(function () {
validate();
});
-
+
+ // We always need to ensure we dont submit anything broken
+ var unsubscribe = $scope.$on("formSubmitting", function (ev, args) {
+
+ // Filter to items with values
+ $scope.model.value = $scope.model.value.filter(el => el.value.trim() !== "") || [];
+ });
+
+ // When the scope is destroyed we need to unsubscribe
+ $scope.$on('$destroy', function () {
+ unsubscribe();
+ });
}
angular.module("umbraco").controller("Umbraco.PropertyEditors.MultipleTextBoxController", MultipleTextBoxController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html
index 85221c61f7..6a9826ac3c 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/multipletextbox/multipletextbox.html
@@ -2,19 +2,20 @@
@@ -40,21 +41,21 @@
Add {{model.config.minNumber - renderModel.length}} item(s)
- You can only have {{model.config.maxNumber}} items selected
+ You can only have {{model.config.maxNumber}} url(s) selected
- Add up to {{model.config.maxNumber}} items
+ Add up to {{model.config.maxNumber}} url(s)
- You can only have {{model.config.maxNumber}} items selected
+ You can only have {{model.config.maxNumber}} url(s) selected
- Add at least {{model.config.minNumber}} item(s)
+ You need to add at least {{model.config.minNumber}} url(s)
@@ -65,12 +66,12 @@
- You need to add at least {{model.config.minNumber}} items
+ You need to add at least {{model.config.minNumber}} url(s)
- You can only have {{model.config.maxNumber}} items selected
+ You can only have {{model.config.maxNumber}} url(s) selected
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 fe9725a7d8..11a3b58c55 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
@@ -98,6 +98,8 @@
vm.wideMode = Object.toBoolean(model.config.hideLabel);
vm.hasContentTypes = model.config.contentTypes.length > 0;
+ var cultureChanged = eventsService.on('editors.content.cultureChanged', (name, args) => updateModel());
+
var labels = {};
vm.labels = labels;
localizationService.localizeMany(["grid_addElement", "content_createEmpty", "actions_copy"]).then(function (data) {
@@ -167,8 +169,6 @@
isDisabled: true
}
-
-
// helper to force the current form into the dirty state
function setDirty() {
if ($scope.$parent.$parent.propertyForm) {
@@ -187,17 +187,29 @@
};
vm.openNodeTypePicker = function ($event) {
- if (vm.overlayMenu || vm.nodes.length >= vm.maxItems) {
+
+ if (vm.nodes.length >= vm.maxItems) {
return;
}
- vm.overlayMenu = {
- show: false,
- style: {},
- filter: vm.scaffolds.length > 12 ? true : false,
+ var availableItems = [];
+ _.each(vm.scaffolds, function (scaffold) {
+ availableItems.push({
+ alias: scaffold.contentTypeAlias,
+ name: scaffold.contentTypeName,
+ icon: iconHelper.convertFromLegacyIcon(scaffold.icon),
+ tooltip: scaffold.documentType.description
+ });
+ });
+
+ const dialog = {
+ view: "itempicker",
orderBy: "$index",
view: "itempicker",
event: $event,
+ filter: availableItems.length > 12,
+ size: availableItems.length > 6 ? "medium" : "small",
+ availableItems: availableItems,
clickPasteItem: function (item) {
if (item.type === "elementTypeArray") {
_.each(item.data, function (entry) {
@@ -206,44 +218,30 @@
} else {
pasteFromClipboard(item.data);
}
- vm.overlayMenu.show = false;
- vm.overlayMenu = null;
+
+ overlayService.close();
},
submit: function (model) {
if (model && model.selectedItem) {
addNode(model.selectedItem.alias);
}
- vm.overlayMenu.show = false;
- vm.overlayMenu = null;
+
+ overlayService.close();
},
close: function () {
- vm.overlayMenu.show = false;
- vm.overlayMenu = null;
+ overlayService.close();
}
};
- // this could be used for future limiting on node types
- vm.overlayMenu.availableItems = [];
- _.each(vm.scaffolds, function (scaffold) {
- vm.overlayMenu.availableItems.push({
- alias: scaffold.contentTypeAlias,
- name: scaffold.contentTypeName,
- icon: iconHelper.convertFromLegacyIcon(scaffold.icon),
- tooltip: scaffold.documentType.description
- });
- });
-
- if (vm.overlayMenu.availableItems.length === 0) {
+ if (dialog.availableItems.length === 0) {
return;
}
- vm.overlayMenu.size = vm.overlayMenu.availableItems.length > 6 ? "medium" : "small";
-
- vm.overlayMenu.pasteItems = [];
+ dialog.pasteItems = [];
var singleEntriesForPaste = clipboardService.retriveEntriesOfType("elementType", contentTypeAliases);
_.each(singleEntriesForPaste, function (entry) {
- vm.overlayMenu.pasteItems.push({
+ dialog.pasteItems.push({
type: "elementType",
name: entry.label,
data: entry.data,
@@ -253,7 +251,7 @@
var arrayEntriesForPaste = clipboardService.retriveEntriesOfType("elementTypeArray", contentTypeAliases);
_.each(arrayEntriesForPaste, function (entry) {
- vm.overlayMenu.pasteItems.push({
+ dialog.pasteItems.push({
type: "elementTypeArray",
name: entry.label,
data: entry.data,
@@ -261,26 +259,27 @@
});
});
- vm.overlayMenu.title = labels.grid_addElement;
- vm.overlayMenu.hideHeader = vm.overlayMenu.pasteItems.length > 0;
+ dialog.title = dialog.pasteItems.length > 0 ? labels.grid_addElement : labels.content_createEmpty;
- vm.overlayMenu.clickClearPaste = function ($event) {
+ dialog.clickClearPaste = function ($event) {
$event.stopPropagation();
$event.preventDefault();
clipboardService.clearEntriesOfType("elementType", contentTypeAliases);
clipboardService.clearEntriesOfType("elementTypeArray", contentTypeAliases);
- vm.overlayMenu.pasteItems = [];// This dialog is not connected via the clipboardService events, so we need to update manually.
- vm.overlayMenu.hideHeader = false;
+ dialog.pasteItems = [];// This dialog is not connected via the clipboardService events, so we need to update manually.
+ dialog.overlayMenu.hideHeader = false;
};
- if (vm.overlayMenu.availableItems.length === 1 && vm.overlayMenu.pasteItems.length === 0) {
+ if (dialog.availableItems.length === 1 && dialog.pasteItems.length === 0) {
// only one scaffold type - no need to display the picker
addNode(vm.scaffolds[0].contentTypeAlias);
- vm.overlayMenu = null;
+
+ dialog.close();
+
return;
}
- vm.overlayMenu.show = true;
+ overlayService.open(dialog);
};
vm.editNode = function (idx) {
@@ -507,8 +506,7 @@
if (tab) {
scaffold.variants[0].tabs.push(tab);
- angular.forEach(tab.properties,
- function (property) {
+ tab.properties.forEach(function (property) {
if (_.find(notSupported, function (x) { return x === property.editor; })) {
property.notSupported = true;
// TODO: Not supported message to be replaced with 'content_nestedContentEditorNotSupported' dictionary key. Currently not possible due to async/timing quirk.
@@ -713,6 +711,7 @@
$scope.$on("$destroy", function () {
unsubscribe();
+ cultureChanged();
watcher();
});
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html
index 896f8cf4a4..2f3856b101 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/nestedcontent/nestedcontent.propertyeditor.html
@@ -47,13 +47,17 @@
-
+ No content types are configured for this property.
-
@@ -75,12 +79,4 @@
-
-
-
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js
index 33e2b834f3..47d1f401c7 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.controller.js
@@ -29,11 +29,15 @@ angular.module("umbraco").controller("Umbraco.PrevalueEditors.RteController",
// extend commands with properties for font-icon and if it is a custom command
$scope.tinyMceConfig.commands = _.map($scope.tinyMceConfig.commands, function (obj) {
var icon = getFontIcon(obj.alias);
- return angular.extend(obj, {
+
+ var objCmd = Utilities.extend(obj, {
fontIcon: icon.name,
isCustom: icon.isCustom,
- selected: $scope.model.value.toolbar.indexOf(obj.alias) >= 0
+ selected: $scope.model.value.toolbar.indexOf(obj.alias) >= 0,
+ icon: "mce-ico " + (icon.isCustom ? ' mce-i-custom ' : ' mce-i-') + icon.name
});
+
+ return objCmd;
});
});
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html
index d70f469e6f..96de0cd040 100644
--- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.prevalues.html
@@ -2,11 +2,12 @@
@@ -97,7 +102,7 @@
-
+
-
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js
index f996e944db..4ca4576755 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/group.controller.js
@@ -185,7 +185,7 @@
* however the list to display the permissions isn't via the dictionary way so we need to format it
*/
function formatGranularPermissionSelection() {
- angular.forEach(vm.userGroup.assignedPermissions, function (node) {
+ vm.userGroup.assignedPermissions.forEach(function (node) {
formatGranularPermissionSelectionForNode(node);
});
}
@@ -193,8 +193,8 @@
function formatGranularPermissionSelectionForNode(node) {
//the dictionary is assigned via node.permissions we will reformat to node.allowedPermissions
node.allowedPermissions = [];
- angular.forEach(node.permissions, function (permissions, key) {
- angular.forEach(permissions, function (p) {
+ Object.values(node.permissions).forEach(function (permissions) {
+ permissions.forEach(function (p) {
if (p.checked) {
node.allowedPermissions.push(p);
}
@@ -299,7 +299,7 @@
}
function setSectionIcon(sections) {
- angular.forEach(sections, function (section) {
+ sections.forEach(function (section) {
section.icon = "icon-section";
});
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
index 2845c8df68..df2bd997b4 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/user.controller.js
@@ -269,7 +269,7 @@
submit: function (model) {
// select items
if (model.selection) {
- angular.forEach(model.selection, function (item) {
+ model.selection.forEach(function (item) {
if (item.id === "-1") {
item.name = vm.labels.contentRoot;
item.icon = "icon-folder";
@@ -298,7 +298,7 @@
submit: function (model) {
// select items
if (model.selection) {
- angular.forEach(model.selection, function (item) {
+ model.selection.forEach(function (item) {
if (item.id === "-1") {
item.name = vm.labels.mediaRoot;
item.icon = "icon-folder";
@@ -321,7 +321,7 @@
var found = false;
// check if item is already in the selected list
if (selection.length > 0) {
- angular.forEach(selection, function (selectedItem) {
+ selection.forEach(function (selectedItem) {
if (selectedItem.udi === item.udi) {
found = true;
}
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js
index 31c52a344b..4b81e7c11c 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/views/groups/groups.controller.js
@@ -123,7 +123,7 @@
}
function clearSelection() {
- angular.forEach(vm.userGroups, function (userGroup) {
+ vm.userGroups.forEach(function (userGroup) {
userGroup.selected = false;
});
vm.selection = [];
diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js
index 2217628872..cb211834b2 100644
--- a/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/users/views/users/users.controller.js
@@ -274,7 +274,7 @@
}
function clearSelection() {
- angular.forEach(vm.users, function (user) {
+ vm.users.forEach(function (user) {
user.selected = false;
});
vm.selection = [];
@@ -305,7 +305,7 @@
vm.disableUserButtonState = "busy";
usersResource.disableUsers(vm.selection).then(function (data) {
// update userState
- angular.forEach(vm.selection, function (userId) {
+ vm.selection.forEach(function (userId) {
var user = getUserFromArrayById(userId, vm.users);
if (user) {
user.userState = 1;
@@ -326,7 +326,7 @@
vm.enableUserButtonState = "busy";
usersResource.enableUsers(vm.selection).then(function (data) {
// update userState
- angular.forEach(vm.selection, function (userId) {
+ vm.selection.forEach(function (userId) {
var user = getUserFromArrayById(userId, vm.users);
if (user) {
user.userState = 0;
@@ -345,7 +345,7 @@
vm.unlockUserButtonState = "busy";
usersResource.unlockUsers(vm.selection).then(function (data) {
// update userState
- angular.forEach(vm.selection, function (userId) {
+ vm.selection.forEach(function (userId) {
var user = getUserFromArrayById(userId, vm.users);
if (user) {
user.userState = 0;
@@ -423,14 +423,14 @@
function selectAll() {
if (areAllSelected()) {
vm.selection = [];
- angular.forEach(vm.users, function (user) {
+ vm.users.forEach(function (user) {
user.selected = false;
});
} else {
// clear selection so we don't add the same user twice
vm.selection = [];
// select all users
- angular.forEach(vm.users, function (user) {
+ vm.users.forEach(function (user) {
// prevent the current user to be selected
if (!user.isCurrentUser) {
user.selected = true;
@@ -470,7 +470,7 @@
function getFilterName(array) {
var name = vm.labels.all;
var found = false;
- angular.forEach(array, function (item) {
+ array.forEach(function (item) {
if (item.selected) {
if (!found) {
name = item.name
@@ -491,7 +491,7 @@
//If the selection is "ALL" then we need to unselect everything else since this is an 'odd' filter
if (userState.key === "All") {
- angular.forEach(vm.userStatesFilter, function (i) {
+ vm.userStatesFilter.forEach(function (i) {
i.selected = false;
});
//we can't unselect All
@@ -500,7 +500,7 @@
vm.usersOptions.userStates = [];
}
else {
- angular.forEach(vm.userStatesFilter, function (i) {
+ vm.userStatesFilter.forEach(function (i) {
if (i.key === "All") {
i.selected = false;
}
@@ -715,13 +715,13 @@
}
function setUserDisplayState(users) {
- angular.forEach(users, function (user) {
+ users.forEach(function (user) {
user.userDisplayState = usersHelper.getUserStateFromValue(user.userState);
});
}
function formatDates(users) {
- angular.forEach(users, function (user) {
+ users.forEach(function (user) {
if (user.lastLoginDate) {
var dateVal;
var serverOffset = Umbraco.Sys.ServerVariables.application.serverTimeOffset;
@@ -752,7 +752,7 @@
var firstSelectedUserGroups;
- angular.forEach(users, function (user) {
+ users.forEach(function (user) {
if (!user.selected) {
return;
diff --git a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js
index 49d8914ac6..c111421d75 100644
--- a/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js
+++ b/src/Umbraco.Web.UI.Client/test/unit/app/propertyeditors/content-picker-controller.spec.js
@@ -5,11 +5,11 @@ describe('Content picker controller tests', function () {
beforeEach(module('umbraco'));
//inject the contentMocks service
- beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, entityMocks, mocksUtils, localizationMocks) {
+ beforeEach(inject(function ($rootScope, $controller, angularHelper, $httpBackend, entityMocks, mocksUtils, localizationMocks, userMocks) {
//for these tests we don't want any authorization to occur
- mocksUtils.disableAuth();
-
+ mocksUtils.setAuth();
+
httpBackend = $httpBackend;
scope = $rootScope.$new();
@@ -34,6 +34,7 @@ describe('Content picker controller tests', function () {
//see /mocks/content.mocks.js for how its setup
entityMocks.register();
localizationMocks.register();
+ userMocks.register();
controller = $controller('Umbraco.PropertyEditors.ContentPickerController', {
$scope: scope,
@@ -42,7 +43,7 @@ describe('Content picker controller tests', function () {
//For controller tests its easiest to have the digest and flush happen here
//since its intially always the same $http calls made
-
+
//scope.$digest resolves the promise against the httpbackend
scope.$digest();
diff --git a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj
index f832deea13..3e1518abdd 100644
--- a/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj
+++ b/src/Umbraco.Web.UI.NetCore/Umbraco.Web.UI.NetCore.csproj
@@ -21,6 +21,12 @@
+
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml
index fe7e8ac638..4126d1d224 100644
--- a/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml
+++ b/src/Umbraco.Web.UI.NetCore/umbraco/config/lang/cs.xml
@@ -1,8 +1,8 @@
- umbraco
- http://umbraco.org
+ Umbraco komunita
+ https://our.umbraco.com/documentation/Extending-Umbraco/Language-Files
Kultura a názvy hostitelů
@@ -11,10 +11,13 @@
Změnit typ dokumentuKopírovatVytvořit
+ ExportovatVytvořit balíček
+ Vytvořit skupinuOdstranitDeaktivovatVyprázdnit koš
+ AktivovatExportovat typ dokumentuImportovat typ dokumentuImportovat balíček
@@ -28,17 +31,64 @@
Znovu načíst uzlyZnovu publikovat celý webPráva
+ Přejmenovat
+ Obnovit
+ Nastavit oprávnění pro stránku %0%
+ Kam zkopírovat
+ Kam přesunout
+ do struktury stromu pod
+ Choose where to copy the selected item(s)
+ Choose where to move the selected item(s)
+ bylo přesunuto
+ bylo zkopírováno
+ bylo smazánoVrátit starší verziOdeslat k publikováníOdeslat k překladu
+ Nastavit skupinuSeřaditPřeložitAktualizovat
+ Nastavit oprávnění
+ Odemknout
+ Vytvořit šablonu obsahu
+ Přeposlat pozvánku
+
+
+ Obsah
+ Administrace
+ Struktura
+ Ostatní
+
+
+ Povolit přístup k přiřazování kultury a názvů hostitelů
+ Povolit přístup k zobrazení protokolu historie uzlu
+ Povolit přístup k zobrazení uzlu
+ Povolit přístup ke změně typu dokumentu daného uzlu
+ Povolit přístup ke kopírování uzlu
+ Povolit přístup k vytváření uzlů
+ Povolit přístup k mazání uzlů
+ Povolit přístup k přesunutí uzlu
+ Povolit přístup k nastavení a změně veřejného přístupu k uzlu
+ Povolit přístup k publikování uzlu
+ Povolit přístup k zrušení publikování uzlu
+ Povolit přístup ke změně oprávnění pro uzel
+ Povolit přístup k vrácení uzlu do předchozího stavu
+ Povolit přístup k odeslání uzlu ke schválení před publikováním
+ Povolit přístup k odeslání uzlu k překladu
+ Povolit přístup ke změně pořadí uzlů
+ Povolit přístup k překladu uzlu
+ Povolit přístup k uložení uzlu
+ Povolit přístup k vytvoření šablony obsahu
+
+
+ Obsah
+ InfoPřístup zakázán.Přidat novou doménu
- odebrat
+ OdebratNeplatný uzel.Neplatný tvar domény.Doména už byla přiřazena.
@@ -49,16 +99,17 @@
Doména '%0%' už byla přiřazenaDoména '%0%' byla aktualizovánaEditace aktuálních domén
+
+ DěditKulturanebo dědění kultury po nadřazeném uzlu. Vztahuje se také
na aktivní uzel.]]>Domény
-
- Zobrazení pro
-
+ Zrušit výběrVybratDělat něco jinéhoTučně
@@ -77,15 +128,62 @@
Číslovaný seznamVložit makroVložit obrázek
+ Publikovat a zavřít
+ Publikovat s potomkyEditovat vztahy
+ Zpět na seznamUložit
+ Uložit a zavřítUložit a publikovat
+ Uložit a naplánovatUložit a odeslat ke schváleníNáhled
+ Uložit zobrazení seznamu
+ Naplánovat
+ NáhledNáhled je deaktivován, protože není přiřazena žádná šablonaVybrat stylZobrazit stylyVložit tabulku
+ Generovat modely a zavřít
+ Uložit a generovat modely
+ Zpět
+ Znovu
+ Obnovit
+ Smazat štítek
+ Zrušit
+ Potvrdit
+ Další možnosti publikování
+
+
+ Zobrazení pro
+ Obsah smazán
+ Obsah nepublikován
+ Obsah nepublikován pro jazyky: %0%
+ Obsah publikován
+ Obsah publikován pro jazyky: %0%
+ Obsah uložen
+ Obsah uložen pro jazyky: %0%
+ Obsah přesunut
+ Obsah zkopírován
+ Obsah vrácen zpět
+ Obsah odeslán k publikování
+ Obsah odeslán k publikování pro jazyky: %0%
+ Seřadit podřízené položky prováděné uživatelem
+ Kopírovat
+ Publikovat
+ Publikovat
+ Přesunout
+ Uložit
+ Uložit
+ Smazat
+ Nepublikovat
+ Nepublikovat
+ Vrátit zpět
+ Odeslat k publikování
+ Odeslat k publikování
+ Seřadit
+ Historie (všechny jazyky)Abyste změnili typ dokumentu pro zvolený obsah, nejprve jej vyberte ze seznamu typů platných pro tohle umístění.
@@ -107,7 +205,14 @@
Nelze dokončit mapování vlastností, neboť nejméně jedna z vlastností má definováno více než jedno mapování.Jsou zobrazeny pouze alternativní typy platné pro aktuální umístění.
+
+ Nepodařilo se vytvořit složku pod rodičem s ID %0%
+ Nepodařilo se vytvořit složku pod rodičem s názvem %0%
+ Název složky nesmí obsahovat nepovolené znaky.
+ Odstranění položky se nezdařilo: %0%
+
+ Is PublishedO této stránceAlias(jak byste popsali obrázek přes telefon)
@@ -124,45 +229,146 @@
Tato položko byla změněna po publikováníTato položka není publikovánaNaposledy publikováno
+ There are no items to show
+ There are no items to show in the list.
+ No child items have been added
+ No members have been addedTyp médiaOdkaz na položky mediíSkupina členůRoleTyp člena
+ No changes have been madeNevybráno žádné datumTitulek stránky
+ This media item has no link
+ No content can be added for this itemVlastnostiTento dokument je publikován, ale není viditelný, protože jeho rodič '%0%' publikován není
+ Tato jazyková verze je publikována, ale není viditelná, protože její rodič '%0%' publikován neníJejda: tento dokument je publikován, ale není v mezipaměti (vnitřní chyba)
+ Could not get the url
+ This document is published but its url would collide with content %0%
+ This document is published but its url cannot be routedPublikovat
+ Published
+ Published (pending changes)>
Stav publikování
+ Publish with descendants to publish %0% and all content items underneath and thereby making their content publicly available.]]>
+ Publish with descendants to publish the selected languages and the same languages of content items underneath and thereby making their content publicly available.]]>Datum publikováníDatum ukončení publikováníDatum odebrání
+ Set dateTřídění je aktualizovánoAbyste uzly setřídili, jednoduše je přetáhněte anebo klikněte na jednu z hlaviček sloupce. Podržením "shift" nebo "control" při výběru můžete označit uzlů více.StatistikaTitulek (volitelně)
+ Alternative text (optional)TypNepublikovat
+ Draft
+ Not createdNaposledy změněnoDatum/čas poslední změny dokumentuOdebrat soubor(y)
+ Click here to remove the image from the media item
+ Click here to remove the file from the media itemURL adresa dokumentuČlen skupin(y)Není člen skupin(y)Podřízené položkyCíl
+ This translates to the following time on the server:
+ What does this mean?]]>
+ Are you sure you want to delete this item?
+ Are you sure you want to delete all items?
+ Property %0% uses editor %1% which is not supported by Nested Content.
+ No content types are configured for this property.
+ Add element type
+ Select element type
+ Select the group whose properties should be displayed. If left blank, the first group on the element type will be used.
+ Enter an angular expression to evaluate against each item for its name. Use
+ to display the item index
+ Add another text box
+ Remove this text box
+ Content root
+ Include drafts: also publish unpublished content items.
+ This value is hidden. If you need access to view this value please contact your website administrator.
+ This value is hidden.
+ What languages would you like to publish? All languages with content are saved!
+ What languages would you like to publish?
+ What languages would you like to save?
+ All languages with content are saved on creation!
+ What languages would you like to send for approval?
+ What languages would you like to schedule?
+ Select the languages to unpublish. Unpublishing a mandatory language will unpublish all languages.
+ Published Languages
+ Unpublished Languages
+ Unmodified Languages
+ These languages haven't been created
+ Ready to Publish?
+ Ready to Save?
+ Send for approval
+ Select the date and time to publish and/or unpublish the content item.
+ Create new
+ Paste from clipboard
+ This item is in the Recycle Bin
+
+
+ Vytvořit novou šablonu obsahu z '%0%'
+ Prázdná
+ Vybrat obsahovou šablonu
+ Šablona obsahu byla vytvořena
+ Šablona obsahu byla vytvořena z '%0%'
+ Již existuje jiná šablona obsahu se stejným názvem
+ Šablona obsahu je předdefinovaný obsah, který si editor může vybrat jako základ pro vytváření nového obsahuKlikněte pro nahrání
+ nebo kliknutím sem vyberte soubory
+ Sem můžete přetáhnout a nahrát soubory.
+ Tento soubor nelze nahrát, nemá povolený typ souboru
+ Maximální velikost souboru je
+ Nejvyšší složka médií
+ Nepodařilo se přesunout média
+ Nadřazené a cílové složky nemohou být stejné
+ Médium se nepodařilo zkopírovat
+ Nepodařilo se vytvořit složku pod nadřazeným id %0%
+ Nepodařilo se přejmenovat složku s id %0%
+ Přetáhněte své soubory do oblasti
+
+
+ Vytvořit nového člena
+ Všichni členové
+ Členské skupiny nemají žádné další vlastnosti pro úpravy.Kde chcete vytvořit nový %0%Vytvořit položku pod
+ Vyberte typ dokumentu, pro který chcete vytvořit šablonu obsahu
+ Zadejte název složkyVyberte typ a titulek"typy dokumentů".]]>
+ Typy dokumentů v části Nastavení.]]>
+ Vybraná stránka ve stromu obsahu neumožňuje vytváření žádných stránek pod ní.
+ Oprávnění k úpravám pro tento typ dokumentu
+ Vytvořit nový typ dokumentu
+ Typy dokumentů v části Nastavení změnou možnosti Povolit jako root v části Oprávnění.]]>"typy medií".]]>
+ Vybraná média ve stromu neumožňuje vytváření pod nimi žádná další média.
+ Upravit oprávnění pro tento typ média
+ Typ dokumentu bez šablony
+ Nová složka
+ Nový datový typ
+ Nový skript JavaScript
+ Nová prázdná částečná šablona
+ Nové makro pro částečnou šablonu
+ Nová částečná šablona ze snippetu
+ Nové makro částečné šablony ze snippetu
+ Nové makro pro částečnou šablonu (bez makra)
+ Nový soubor stylů - stylopis
+ Nový soubor stylů Rich Text editoruProhlédnout svůj web
@@ -174,35 +380,42 @@
Vítejte
- Stay
- Discard changes
- You have unsaved changes
- Are you sure you want to navigate away from this page? - you have unsaved changes
+ Zůstat zde
+ Zahodit změny
+ Máte neuložené změny
+ Opravdu chcete opustit tuto stránku? Máte neuložené změny.
+ Publikování zviditelní vybrané položky na webu.
+ Zrušení publikování odstraní vybrané položky a všechny jejich potomky z webu.
+ Zrušení publikování odstraní tuto stránku a všechny její potomky z webu.
+ Máte neuložené změny. Provedením změn typu dokumentu změny zahodíte.
- Done
- Deleted %0% item
- Deleted %0% items
- Deleted %0% out of %1% item
- Deleted %0% out of %1% items
- Published %0% item
- Published %0% items
- Published %0% out of %1% item
- Published %0% out of %1% items
- Unpublished %0% item
- Unpublished %0% items
- Unpublished %0% out of %1% item
- Unpublished %0% out of %1% items
- Moved %0% item
- Moved %0% items
- Moved %0% out of %1% item
- Moved %0% out of %1% items
- Copied %0% item
- Copied %0% items
- Copied %0% out of %1% item
- Copied %0% out of %1% items
+ Hotovo
+ Smazána %0% položka
+ Smazáno %0% položek
+ Smazána %0% z %1% položek
+ Smazáno %0% z %1% položek
+ Publikována %0% položka
+ Publikováno %0% položek
+ Publikována %0% z %1% položek
+ Publikováno %0% z %1% položek
+ Zrušeno publikování %0% položky
+ Zrušeno publikování %0% položek
+ Zrušeno publikování %0% z %1% položek
+ Zrušeno publikování %0% z %1% položek
+ Přesunuta %0% položka
+ Přesunuto %0% položek
+ Přesunuta %0% z %1% položek
+ Přesunuto %0% z %1% položek
+ Zkopírována %0% položka
+ Zkopírováno %0% položek
+ Zkopírována %0% z %1% položek
+ Zkopírováno %0% z %1% položek
+ Titulek odkazu
+ Odkaz
+ Kotva / dotazNázevSpravovat názvy hostitelůZavřít toto okno
@@ -213,6 +426,7 @@
VyjmoutEditovat položku slovníkuEditovat jazyk
+ Edit selected mediaVložit místní odkazVložit znakVložit grafický titulek
@@ -220,14 +434,20 @@
Vložit odkazKliknout pro přidání makraVložit tabulku
+ Tím se odstraní jazyk
+ Změna kultury jazyka může být náročná operace a bude mít za následek opětovné sestavení mezipaměti obsahu a indexůNaposledy editovánoOdkazMístní odkaz:Při používání místních odkazů vložte znak "#" před odkazOtevřít v novém okně?
+ Nastavení makraToto makro nemá žádné vlastnosti, které by bylo možno editovatVložitEditovat oprávnění pro
+ Nastavit oprávnění pro
+ Nastavit oprávnění pro %0% pro skupinu %1%
+ Vyberte skupiny uživatelů, pro které chcete nastavit oprávněníPoložky koše jsou nyní mazány. Nezavírejte, prosím, toto okno, dokud operace probíháKoš je nyní prázdnýOdebrání položek z koše způsobí jejich trvalé odstranění
@@ -243,21 +463,109 @@
Klikněte na obrázek pro zobrazení v plné velikostiVybrat položkuZobrazit položku mezipaměti
+ Navázat na originál
+ Včetně potomků
+ Nejpřátelštější komunita
+ Odkaz na stránku
+ Otevře propojený dokument v novém okně nebo na kartě
+ Odkaz na média
+ Vybrat počáteční uzel obsahu
+ Vybrat média
+ Vybrat typ média
+ Vybrat ikonu
+ Vybrat položku
+ Vybrat odkaz
+ Vybrat makro
+ Vybrat obsah
+ Vybrat typ obsahu
+ Vybrat počáteční uzel média
+ Vybrat člena
+ Vybrat skupinu členů
+ Vybrat typ člena
+ Vybrat uzel
+ Vybrat sekce
+ Vybrat uživatele
+ Nebyly nalezeny žádné ikony
+ Pro toto makro neexistují žádné parametry
+ K dispozici nejsou žádná makra
+ Externí poskytovatelé přihlášení
+ Podrobnosti o výjimce
+ Stacktrace
+ Vnitřní výjimka
+ Propojit se
+ Odpojit se
+ účet
+ Vybrat editora
+ Vybrat snippet
+ Tímto odstraníte uzel a všechny jeho jazyky. Pokud chcete smazat pouze jeden jazyk, měli byste zrušit publikování uzlu v tomto jazyce.
+
+
+ Nejsou žádné položky ve slovníku.%0%' níže. Můžete přidat další jazyky v nabídce 'jazyky' nalevo.]]>Název jazyka
+
+ Přehled slovníku
+
+
+ Konfigurovaní vyhledávače
+ Zobrazuje vlastnosti a nástroje pro libovolný konfigurovaný vyhledávač (např. pro víceindexový vyhledávač)
+ Hodnoty pole
+ Stav
+ Stav indexu a jeho čitelnost
+ Indexery
+ Informace o indexu
+ Uvádí vlastnosti indexu
+ Spravovat indexy Examine
+ Umožňuje zobrazit podrobnosti každého indexu a poskytuje některé nástroje pro správu indexů
+ Znovu vytvořit index
+ V závislosti na tom, kolik obsahu je na vašem webu, může to chvíli trvat. Nedoporučuje se znovu vytvářet index v době vysokého provozu na webu nebo při úpravách obsahu editory.
+ ]]>
+
+ Vyhledávače
+ Prohledat index a zobrazit výsledky
+ Nástroje
+ Nástroje pro správu indexu
+ pole
+ Index nelze číst a bude nutné jej znovu sestavit
+ Proces trvá déle, než se očekávalo, zkontrolujte Umbraco log a zkontrolujte, zda během této operace nedošlo k chybám
+ Tento index nelze znovu sestavit, protože nemá přiřazen
+ IIndexPopulatorZadejte Vaše uživatelské jménoZadejte Vaše heslo
+ Potvrďte hesloPojmenujte %0%...Zadejte jméno...
+ Zadejte e-mail...
+ Zadejte uživatelské jméno...
+ Popisek...
+ Zadejte popis...Pište pro vyhledání...Pište pro filtrování...
+ Pište pro vložení štítků (po každém stiskněte klávesu Enter)...
+ Vložte svůj e-mail
+ Vložte zprávu...
+ Vaše uživatelské jméno je obvykle váš e-mail
+ #hodnota or ?klíč=hodnota
+ Vložte alias...
+ Generování aliasu...
+ Vytvořit vlastní zobrazení seznamu
+ Odebrat vlastní zobrazení seznamu
+ Typ obsahu, typ média nebo typ člena s tímto aliasem již existuje
+
+
+ Přejmenováno
+ Sem zadejte nový název složky
+ %0% přejmenováno na %1%Přidat předlohu
@@ -271,6 +579,15 @@
Související stylopisyZobrazit jmenovkuŠířka a výška
+ Všechny typy vlastností a údaje o nich
+ použití tohoto datového typu bude trvale smazáno, potvrďte, že je chcete odstranit
+ Ano, smazat
+ a všechny typy vlastností a data vlastností používající tento typ dat
+ Vyberte složku, kterou chcete přesunout
+ do stromové struktury níže
+ byla přesunuta pod
+ %0% vymažete vlastnosti a jejich data z následujících položek]]>
+ Rozumím, že tato akce odstraní vlastnosti a data založená na tomto datovém typuVaše data byla uložena, ale než budete moci publikovat tuto stránku, je třeba odstranit některé chyby:
@@ -286,10 +603,12 @@
%0% není ve správném formátu
+ Ze serveru byla přijata chybaPoužití daného typu souboru bylo zakázáno adminitrátoremUPOZORNĚNÍ! I když CodeMirror je dle konfigurace povolený, je zakázaný v Internet Exploreru, protože není dost stabilní.Vyplňte, prosím, alias i název nového typu vlastností!Vyskytl se problém při čtení/zápisu do určeného souboru nebo adresáře
+ Chyba při načítání skriptu částečné šablony (soubor: %0%)Uveďte, prosím, titulekVyberte, prosím, typChystáte se obrázek zvětšit více, než je jeho původní rozměr. Opravdu chcete pokračovat?
@@ -298,34 +617,43 @@
Žádne aktivní styly nejsou dostupnéUmístěte, prosím, kurzor nalevo od těch dvou buňek, které chcete sloučitNemužete rozdělit buňku, která nebyla sloučená.
+ Tato vlastnost je neplatná
+ VolbyO...AkceAkcePřidatAlias
+ VšeJste si jistí?
+ Zpět
+ Zpět na přehledOkrajoZrušitOkraj buňkyVybrat
+ VyčistitZavřítZavřít oknoKomentovatPotvrdit
+ OmezitZachovat proporce
+ ObsahPokračovatKopírovatVytvořit
- Databáse
+ DatabázeDatumVýchozíOdstranitOdstraněnoOdstraňování...Vzhled
+ SlovníkRozměryDolůStáhnout
@@ -334,55 +662,85 @@
PrvkyEmailChyba
+ PoleNajít
+ První
+ Focal point
+ Obecné
+ Skupiny
+ SkupinaVýškaNápověda
+ Skrýt
+ HistorieIkona
+ IdImport
+ Zahrnout podsložky do vyhledávání
+ InfoVnitřní okrajVložitInstalovat
+ NeplatnéVyrovnat
+ PopisekJazyk
+ PosledníRozvržení
+ OdkazyNahráváníZamčenoPřihlášeníOdhlášeníOdhlášeníMakro
+ Povinné
+ ZprávaPřesunoutNázevNovýNásledujícíNez
+ VypnutoOKOtevřít
+ Zapnutonebo
+ Seřadit podleHesloCestaMoment, prosím...PředchozíVlastnosti
+ ObnovitEmail pro obdržení formulářových datKoš
+ Váš koš je prázdný
+ Znovu načístZbývající
+ OdebratPřejmenovatObnovitPovinné
+ NačístZopakovatOprávnění
+ Plánované publikováníHledat
+ Litujeme, ale nemůžeme najít to, co hledáte.
+ Nebyly přidány žádné položkyServer
+ NastaveníZobrazitZobrazit stránku při odesláníRozměrSeřadit
- Submit
-
- Typ
- Pro hledání pište...
+ Stav
+ Potvrdit
+ Zadejte
+ Pište pro vyhledávání...
+ podNahoruAktualizovatPovýšit
@@ -397,18 +755,57 @@
AnoSložkaVýsledky hledání
- Reorder
- I am done reordering
+ Přesunout
+ Skončil jsem s přesouváním
+ Náhled
+ Změnit heslo
+ na
+ Seznam
+ Ukládám...
+ aktuální
+ Vložené
+ vybrané
+ Další
+ Články
+ Videa
+ Vyčistit
+ Instalování
+
+
+ Modrá
+
+
+ Přidat skupinu
+ Přidat vlastnost
+ Přidat editor
+ Přidat šablonu
+ Přidat vnořený uzel
+ Přidat potomka
+ Upravit datový typ
+ Navigace v sekcích
+ Klávesové zkratky
+ zobrazit klávesové zkratky
+ Přepnout zobrazení seznamu
+ Přepnout povolení jako root
+ Okomentovat/Odkomentovat řádky
+ Odebrat řádek
+ Kopírovat řádky nahoru
+ Kopírovat řádky dolů
+ Přesunout řádky nahoru
+ Přesunout řádky dolů
+ Obecný
+ Editor
+ Přepnout povolení jazykových verzí
- Background color
- Bold
- Text color
+ Barva pozadí
+ Tučně
+ Barva písmaFontText
- Page
+ StránkaInstalátor se nemůže připojit k databázi.
@@ -441,7 +838,7 @@
Heslo výchozího uživatele bylo úspěšně změněno od doby instalace!
Netřeba nic dalšího dělat. Klikněte na Následující pro pokračování.]]>