+
+
diff --git a/src/Umbraco.Tests/CoreThings/GuidUtilsTests.cs b/src/Umbraco.Tests/CoreThings/GuidUtilsTests.cs
new file mode 100644
index 0000000000..5ef8cba356
--- /dev/null
+++ b/src/Umbraco.Tests/CoreThings/GuidUtilsTests.cs
@@ -0,0 +1,32 @@
+using System;
+using NUnit.Framework;
+using Umbraco.Core;
+
+namespace Umbraco.Tests.CoreThings
+{
+ public class GuidUtilsTests
+ {
+ [Test]
+ public void GuidCombineMethodsAreEqual()
+ {
+ var a = Guid.NewGuid();
+ var b = Guid.NewGuid();
+
+ Assert.AreEqual(GuidUtils.Combine(a, b).ToByteArray(), Combine(a, b));
+ }
+
+ // Reference implementation taken from original code.
+ private static byte[] Combine(Guid guid1, Guid guid2)
+ {
+ var bytes1 = guid1.ToByteArray();
+ var bytes2 = guid2.ToByteArray();
+ var bytes = new byte[bytes1.Length];
+ for (var i = 0; i < bytes1.Length; i++)
+ {
+ bytes[i] = (byte)(bytes1[i] ^ bytes2[i]);
+ }
+
+ return bytes;
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/CoreThings/HexEncoderTests.cs b/src/Umbraco.Tests/CoreThings/HexEncoderTests.cs
new file mode 100644
index 0000000000..588fff83e8
--- /dev/null
+++ b/src/Umbraco.Tests/CoreThings/HexEncoderTests.cs
@@ -0,0 +1,71 @@
+using System;
+using System.Text;
+using NUnit.Framework;
+using Umbraco.Core;
+
+namespace Umbraco.Tests.CoreThings
+{
+ public class HexEncoderTests
+ {
+ [Test]
+ public void ToHexStringCreatesCorrectValue()
+ {
+ var buffer = new byte[255];
+ var random = new Random();
+ random.NextBytes(buffer);
+
+ var sb = new StringBuilder(buffer.Length * 2);
+ for (var i = 0; i < buffer.Length; i++)
+ {
+ sb.Append(buffer[i].ToString("X2"));
+ }
+
+ var expected = sb.ToString();
+
+ var actual = HexEncoder.Encode(buffer);
+ Assert.AreEqual(expected, actual);
+ }
+
+ [Test]
+ public void ToHexStringWithSeparatorCreatesCorrectValue()
+ {
+ var buffer = new byte[255];
+ var random = new Random();
+ random.NextBytes(buffer);
+
+ var expected = ToHexString(buffer, '/', 2, 4);
+ var actual = HexEncoder.Encode(buffer, '/', 2, 4);
+
+ Assert.AreEqual(expected, actual);
+ }
+
+ private static readonly char[] _bytesToHexStringLookup = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ // Reference implementation taken from original extension method.
+ private static string ToHexString(byte[] bytes, char separator, int blockSize, int blockCount)
+ {
+ int p = 0, bytesLength = bytes.Length, count = 0, size = 0;
+ var chars = new char[(bytesLength * 2) + blockCount];
+ for (var i = 0; i < bytesLength; i++)
+ {
+ var b = bytes[i];
+ chars[p++] = _bytesToHexStringLookup[b / 0x10];
+ chars[p++] = _bytesToHexStringLookup[b % 0x10];
+ if (count == blockCount)
+ {
+ continue;
+ }
+
+ if (++size < blockSize)
+ {
+ continue;
+ }
+
+ chars[p++] = separator;
+ size = 0;
+ count++;
+ }
+ return new string(chars, 0, chars.Length);
+ }
+ }
+}
diff --git a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs
index bc0854bdb7..8ea4856861 100644
--- a/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs
+++ b/src/Umbraco.Tests/Services/ContentTypeServiceTests.cs
@@ -148,7 +148,7 @@ namespace Umbraco.Tests.Services
//change the content type to be invariant, we will also update the name here to detect the copy changes
doc.SetCultureName("Hello2", "en-US");
ServiceContext.ContentService.Save(doc);
- contentType.Variations = ContentVariation.Nothing;
+ contentType.Variations = ContentVariation.Nothing;
ServiceContext.ContentTypeService.Save(contentType);
doc = ServiceContext.ContentService.GetById(doc.Id); //re-get
@@ -372,7 +372,7 @@ namespace Umbraco.Tests.Services
doc2 = ServiceContext.ContentService.GetById(doc2.Id); //re-get
//this will be null because the doc type was changed back to variant but it's property types don't get changed back
- Assert.IsNull(doc.GetValue("title", "en-US"));
+ Assert.IsNull(doc.GetValue("title", "en-US"));
Assert.IsNull(doc2.GetValue("title", "en-US"));
}
@@ -1714,50 +1714,65 @@ namespace Umbraco.Tests.Services
// Arrange
var service = ServiceContext.ContentTypeService;
+ // create 'page' content type with a 'Content_' group
var page = MockedContentTypes.CreateSimpleContentType("page", "Page", null, false, "Content_");
+ Assert.IsTrue(page.PropertyGroups.Contains("Content_"));
+ Assert.AreEqual(3, page.PropertyTypes.Count());
service.Save(page);
+
+ // create 'contentPage' content type as a child of 'page'
var contentPage = MockedContentTypes.CreateSimpleContentType("contentPage", "Content Page", page, true);
- service.Save(contentPage);
- var composition = MockedContentTypes.CreateMetaContentType();
- composition.AddPropertyGroup("Content");
- service.Save(composition);
- //Adding Meta-composition to child doc type
- contentPage.AddContentType(composition);
+ Assert.AreEqual(3, contentPage.PropertyTypes.Count());
service.Save(contentPage);
- // Act
- var propertyTypeOne = new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "testTextbox")
+ // add 'Content' group to 'meta' content type
+ var meta = MockedContentTypes.CreateMetaContentType();
+ meta.AddPropertyGroup("Content");
+ Assert.AreEqual(2, meta.PropertyTypes.Count());
+ service.Save(meta);
+
+ // add 'meta' content type to 'contentPage' composition
+ contentPage.AddContentType(meta);
+ service.Save(contentPage);
+
+ // add property 'prop1' to 'contentPage' group 'Content_'
+ var prop1 = new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "testTextbox")
{
Name = "Test Textbox", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88
};
- var firstOneAdded = contentPage.AddPropertyType(propertyTypeOne, "Content_");
- var propertyTypeTwo = new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "anotherTextbox")
+ var prop1Added = contentPage.AddPropertyType(prop1, "Content_");
+ Assert.IsTrue(prop1Added);
+
+ // add property 'prop2' to 'contentPage' group 'Content'
+ var prop2 = new PropertyType(Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext, "anotherTextbox")
{
Name = "Another Test Textbox", Description = "", Mandatory = false, SortOrder = 1, DataTypeId = -88
};
- var secondOneAdded = contentPage.AddPropertyType(propertyTypeTwo, "Content");
+ var prop2Added = contentPage.AddPropertyType(prop2, "Content");
+ Assert.IsTrue(prop2Added);
+
+ // save 'contentPage' content type
service.Save(contentPage);
- Assert.That(page.PropertyGroups.Contains("Content_"), Is.True);
- var propertyGroup = page.PropertyGroups["Content_"];
- page.PropertyGroups.Add(new PropertyGroup(true) { Id = propertyGroup.Id, Name = "ContentTab", SortOrder = 0});
+ var group = page.PropertyGroups["Content_"];
+ group.Name = "ContentTab"; // rename the group
service.Save(page);
+ Assert.AreEqual(3, page.PropertyTypes.Count());
- // Assert
- Assert.That(firstOneAdded, Is.True);
- Assert.That(secondOneAdded, Is.True);
+ // get 'contentPage' content type again
+ var contentPageAgain = service.Get("contentPage");
+ Assert.IsNotNull(contentPageAgain);
- var contentType = service.Get("contentPage");
- Assert.That(contentType, Is.Not.Null);
+ // assert that 'Content_' group is still there because we don't propagate renames
+ var findGroup = contentPageAgain.CompositionPropertyGroups.FirstOrDefault(x => x.Name == "Content_");
+ Assert.IsNotNull(findGroup);
- var compositionPropertyGroups = contentType.CompositionPropertyGroups;
-
- // now it is still 1, because we don't propagate renames anymore
- Assert.That(compositionPropertyGroups.Count(x => x.Name.Equals("Content_")), Is.EqualTo(1));
-
- var propertyTypeCount = contentType.PropertyTypes.Count();
- var compPropertyTypeCount = contentType.CompositionPropertyTypes.Count();
+ // count all property types (local and composed)
+ var propertyTypeCount = contentPageAgain.PropertyTypes.Count();
Assert.That(propertyTypeCount, Is.EqualTo(5));
+
+ // count composed property types
+ var compPropertyTypeCount = contentPageAgain.CompositionPropertyTypes.Count();
Assert.That(compPropertyTypeCount, Is.EqualTo(10));
}
diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj
index 7147cc8453..513701bf6a 100644
--- a/src/Umbraco.Tests/Umbraco.Tests.csproj
+++ b/src/Umbraco.Tests/Umbraco.Tests.csproj
@@ -118,6 +118,8 @@
+
+
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 9f9f1aa21e..99b89bf8cf 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
@@ -124,58 +124,6 @@
-
-Content Picker
-Opens a content picker.
-view: contentpicker
-
-
-
- | Param |
- Type |
- Details |
-
-
-
- | model.multiPicker |
- Boolean |
- Pick one or multiple items |
-
-
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
- | model.selection |
- Array |
- Array of content objects |
-
-
-
-
-Icon Picker
-Opens an icon picker.
-view: iconpicker
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
- | model.icon |
- String |
- The icon class |
-
-
-
Item Picker
Opens an item picker.
view: itempicker
@@ -220,170 +168,6 @@ Opens an item picker.
-Macro Picker
-Opens a media picker.
-view: macropicker
-
-
-
- | Param |
- Type |
- Details |
-
-
-
-
- | model.dialogData |
- Object |
- Object which contains array of allowedMacros. Set to null to allow all. |
-
-
-
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
-
- | model.macroParams |
- Array |
- Array of macro params |
-
-
- | model.selectedMacro |
- Object |
- The selected macro |
-
-
-
-
-Media Picker
-Opens a media picker.
-view: mediapicker
-
-
-
- | Param |
- Type |
- Details |
-
-
-
-
- | model.multiPicker |
- Boolean |
- Pick one or multiple items |
-
-
- | model.onlyImages |
- Boolean |
- Only display files that have an image file-extension |
-
-
- | model.disableFolderSelect |
- Boolean |
- Disable folder selection |
-
-
-
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
-
- | model.selectedImages |
- Array |
- Array of selected images |
-
-
-
-
-Member Group Picker
-Opens a member group picker.
-view: membergrouppicker
-
-
-
- | Param |
- Type |
- Details |
-
-
-
-
- | model.multiPicker |
- Boolean |
- Pick one or multiple items |
-
-
-
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
-
- | model.selectedMemberGroup |
- String |
- The selected member group |
-
-
- | model.selectedMemberGroups (multiPicker) |
- Array |
- The selected member groups |
-
-
-
-
-Member Picker
-Opens a member picker.
-view: memberpicker
-
-
-
- | Param |
- Type |
- Details |
-
-
-
-
- | model.multiPicker |
- Boolean |
- Pick one or multiple items |
-
-
-
-
-
-
- | Returns |
- Type |
- Details |
-
-
-
-
- | model.selection |
- Array |
- Array of selected members/td>
- |
-
-
-
YSOD
Opens an overlay to show a custom YSOD.
view: ysod
diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/relationtype.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/relationtype.resource.js
index f17aae0a6b..7f13a46d2f 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/relationtype.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/relationtype.resource.js
@@ -35,7 +35,7 @@ function relationTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
/**
* @ngdoc method
* @name umbraco.resources.relationTypeResource#getRelationObjectTypes
- * @methodof umbraco.resources.relationTypeResource
+ * @methodOf umbraco.resources.relationTypeResource
*
* @description
* Gets a list of Umbraco object types which can be associated with a relation.
@@ -54,7 +54,7 @@ function relationTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
/**
* @ngdoc method
* @name umbraco.resources.relationTypeResource#save
- * @methodof umbraco.resources.relationTypeResource
+ * @methodOf umbraco.resources.relationTypeResource
*
* @description
* Updates a relation type.
@@ -74,7 +74,7 @@ function relationTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
/**
* @ngdoc method
* @name umbraco.resources.relationTypeResource#create
- * @methodof umbraco.resources.relationTypeResource
+ * @methodOf umbraco.resources.relationTypeResource
*
* @description
* Creates a new relation type.
@@ -94,7 +94,7 @@ function relationTypeResource($q, $http, umbRequestHelper, umbDataFormatter) {
/**
* @ngdoc method
* @name umbraco.resources.relationTypeResource#deleteById
- * @methodof umbraco.resources.relationTypeResource
+ * @methodOf umbraco.resources.relationTypeResource
*
* @description
* Deletes a relation type with a given ID.
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 650a210784..0dbd27b7a5 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
@@ -4,6 +4,76 @@
*
* @description
* Added in Umbraco 8.0. Application-wide service for handling infinite editing.
+ *
+ *
+Markup example
+
+
+
+
+
+
+
+
+Controller example
+
+ (function () {
+
+ "use strict";
+
+ function Controller() {
+
+ var vm = this;
+
+ vm.open = open;
+
+ function open() {
+ var mediaPickerOptions = {
+ multiPicker: true,
+ submit: function(model) {
+ editorService.close();
+ },
+ close: function() {
+ editorService.close();
+ }
+ }
+ editorService.mediaPicker(mediaPickerOptions);
+ };
+ }
+
+ angular.module("umbraco").controller("My.Controller", Controller);
+ })();
+
+
+Custom view example
+
+ (function () {
+
+ "use strict";
+
+ function Controller() {
+
+ var vm = this;
+
+ vm.open = open;
+
+ function open() {
+ var options = {
+ view: "path/to/view.html"
+ submit: function(model) {
+ editorService.close();
+ },
+ close: function() {
+ editorService.close();
+ }
+ }
+ editorService.open(options);
+ };
+ }
+
+ angular.module("umbraco").controller("My.Controller", Controller);
+ })();
+
*/
(function () {
"use strict";
@@ -43,6 +113,10 @@
*
* @description
* Method to open a new editor in infinite editing
+ *
+ * @param {Object} editor rendering options
+ * @param {String} editor.view Path to view
+ * @param {String} editor.size Sets the size of the editor ("Small"). If nothing is set it will use full width.
*/
function open(editor) {
@@ -108,8 +182,12 @@
*
* @description
* Opens a media editor in infinite editing, the submit callback returns the updated content item
+ * @param {Object} editor rendering options
* @param {String} editor.id The id of the content item
* @param {Boolean} editor.create Create new content item
+ * @param {Function} editor.submit Callback function when the publish and close button is clicked. Returns the editor model object
+ * @param {Function} editor.close Callback function when the close button is clicked.
+ *
* @returns {Object} editor object
*/
function contentEditor(editor) {
@@ -124,6 +202,12 @@
*
* @description
* Opens a content picker in infinite editing, the submit callback returns an array of selected items
+ *
+ * @param {Object} editor rendering options
+ * @param {Boolean} editor.multiPicker Pick one or multiple items
+ * @param {Function} editor.submit Callback function when the submit button is clicked. Returns the editor model object
+ * @param {Function} editor.close Callback function when the close button is clicked.
+ *
* @returns {Object} editor object
*/
function contentPicker(editor) {
@@ -218,11 +302,13 @@
*
* @description
* Opens an embed editor in infinite editing.
+ * @param {Object} editor rendering options
+ * @param {String} editor.icon The icon class
+ * @param {String} editor.color The color class
* @param {Callback} editor.submit Saves, submits, and closes the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
*/
-
function linkPicker(editor) {
editor.view = "views/common/infiniteeditors/linkpicker/linkpicker.html";
editor.size = "small";
@@ -236,6 +322,7 @@
*
* @description
* Opens a media editor in infinite editing, the submit callback returns the updated media item
+ * @param {Object} editor rendering options
* @param {String} editor.id The id of the media item
* @param {Boolean} editor.create Create new media item
* @param {Callback} editor.submit Saves, submits, and closes the editor
@@ -254,6 +341,7 @@
*
* @description
* Opens a media picker in infinite editing, the submit callback returns an array of selected media items
+ * @param {Object} editor rendering options
* @param {Boolean} editor.multiPicker Pick one or multiple items
* @param {Boolean} editor.onlyImages Only display files that have an image file-extension
* @param {Boolean} editor.disableFolderSelect Disable folder selection
@@ -276,6 +364,7 @@
*
* @description
* Opens an icon picker in infinite editing, the submit callback returns the selected icon
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -293,6 +382,7 @@
*
* @description
* Opens the document type editor in infinite editing, the submit callback returns the saved document type
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -309,6 +399,7 @@
*
* @description
* Opens the media type editor in infinite editing, the submit callback returns the saved media type
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -318,24 +409,75 @@
open(editor);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.services.editorService#queryBuilder
+ * @methodOf umbraco.services.editorService
+ *
+ * @description
+ * Opens the query builder in infinite editing, the submit callback returns the generted query
+ * @param {Object} editor rendering options
+ * @param {Callback} editor.submit Submits the editor
+ * @param {Callback} editor.close Closes the editor
+ * @returns {Object} editor object
+ */
function queryBuilder(editor) {
editor.view = "views/common/infiniteeditors/querybuilder/querybuilder.html";
editor.size = "small";
open(editor);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.services.editorService#treePicker
+ * @methodOf umbraco.services.editorService
+ *
+ * @description
+ * Opens the query builder in infinite editing, the submit callback returns the generted query
+ * @param {Object} editor rendering options
+ * @param {String} options.section tree section to display
+ * @param {String} options.treeAlias specific tree to display
+ * @param {Boolean} options.multiPicker should the tree pick one or multiple items before returning
+ * @param {Callback} editor.submit Submits the editor
+ * @param {Callback} editor.close Closes the editor
+ * @returns {Object} editor object
+ */
function treePicker(editor) {
editor.view = "views/common/infiniteeditors/treepicker/treepicker.html";
editor.size = "small";
open(editor);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.services.editorService#nodePermissions
+ * @methodOf umbraco.services.editorService
+ *
+ * @description
+ * Opens the an editor to set node permissions.
+ * @param {Object} editor rendering options
+ * @param {Callback} editor.submit Submits the editor
+ * @param {Callback} editor.close Closes the editor
+ * @returns {Object} editor object
+ */
function nodePermissions(editor) {
editor.view = "views/common/infiniteeditors/nodepermissions/nodepermissions.html";
editor.size = "small";
open(editor);
}
+ /**
+ * @ngdoc method
+ * @name umbraco.services.editorService#insertCodeSnippet
+ * @methodOf umbraco.services.editorService
+ *
+ * @description
+ * Open an editor to insert code snippets into the code editor
+ * @param {Object} editor rendering options
+ * @param {Callback} editor.submit Submits the editor
+ * @param {Callback} editor.close Closes the editor
+ * @returns {Object} editor object
+ */
function insertCodeSnippet(editor) {
editor.view = "views/common/infiniteeditors/insertcodesnippet/insertcodesnippet.html";
editor.size = "small";
@@ -349,6 +491,7 @@
*
* @description
* Opens the user group picker in infinite editing, the submit callback returns an array of the selected user groups
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -366,6 +509,7 @@
*
* @description
* Opens the user group picker in infinite editing, the submit callback returns the saved template
+ * @param {Object} editor rendering options
* @param {String} editor.id The template id
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
@@ -382,7 +526,8 @@
* @methodOf umbraco.services.editorService
*
* @description
- * Opens the section picker in infinite editing, the submit callback returns an array of the selected sections
+ * Opens the section picker in infinite editing, the submit callback returns an array of the selected sections¨
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -400,6 +545,7 @@
*
* @description
* Opens the insert field editor in infinite editing, the submit callback returns the code snippet
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -417,6 +563,7 @@
*
* @description
* Opens the template sections editor in infinite editing, the submit callback returns the type to insert
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -429,11 +576,12 @@
/**
* @ngdoc method
- * @name umbraco.services.editorService#sectionPicker
+ * @name umbraco.services.editorService#userPicker
* @methodOf umbraco.services.editorService
*
* @description
* Opens the section picker in infinite editing, the submit callback returns an array of the selected users
+ * @param {Object} editor rendering options
* @param {Callback} editor.submit Submits the editor
* @param {Callback} editor.close Closes the editor
* @returns {Object} editor object
@@ -452,6 +600,7 @@
* @description
* Opens the section picker in infinite editing, the submit callback returns an array of the selected items
*
+ * @param {Object} editor rendering options
* @param {Array} editor.availableItems Array of available items.
* @param {Array} editor.selectedItems Array of selected items. When passed in the selected items will be filtered from the available items.
* @param {Boolean} editor.filter Set to false to hide the filter.
@@ -485,12 +634,14 @@
/**
* @ngdoc method
- * @name umbraco.services.editorService#macroPicker
+ * @name umbraco.services.editorService#memberGroupPicker
* @methodOf umbraco.services.editorService
*
* @description
* Opens a member group picker in infinite editing.
*
+ * @param {Object} editor rendering options
+ * @param {Object} editor.multiPicker Pick one or multiple items.
* @param {Callback} editor.submit Submits the editor.
* @param {Callback} editor.close Closes the editor.
* @returns {Object} editor object
diff --git a/src/Umbraco.Web.UI.Client/src/less/dashboards.less b/src/Umbraco.Web.UI.Client/src/less/dashboards.less
index 5fd0e25be1..cc13ad31fd 100644
--- a/src/Umbraco.Web.UI.Client/src/less/dashboards.less
+++ b/src/Umbraco.Web.UI.Client/src/less/dashboards.less
@@ -1,13 +1,14 @@
.umb-dashboards-forms-install {
background: url('../img/forms/installer-background.png');
background-repeat: repeat-x;
- position: relative;
- top: -30px;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
padding-top: 30px;
- box-shadow: inset 0px -40px 30px 25px rgba(255,255,255,1);
- -moz-border-radius: 0px 0px 200px 200px;
- -webkit-border-radius: 0px 0px 200px 200px;
- border-radius: 0px 0px 200px 200px;
+ background-color: @white;
+ overflow: auto;
small {
font-size: 14px;
diff --git a/src/Umbraco.Web.UI/App_Plugins/UmbracoForms/package.manifest b/src/Umbraco.Web.UI/App_Plugins/UmbracoForms/package.manifest
deleted file mode 100644
index c7ed4a957a..0000000000
--- a/src/Umbraco.Web.UI/App_Plugins/UmbracoForms/package.manifest
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "dashboards": [
- {
- "name": "Install Umbraco Forms",
- "alias": "installUmbracoForms",
- "view": "views/dashboard/forms/formsdashboardintro.html",
- "sections": [ "forms" ]
- }
- ]
-}
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index 130015ad53..5751e9155c 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -231,7 +231,6 @@
-
404handlers.config
diff --git a/src/Umbraco.Web.UI/config/Dashboard.config b/src/Umbraco.Web.UI/config/Dashboard.config
index 785fb61681..fec6ab34ae 100644
--- a/src/Umbraco.Web.UI/config/Dashboard.config
+++ b/src/Umbraco.Web.UI/config/Dashboard.config
@@ -22,6 +22,17 @@
+
+
+ forms
+
+
+
+ views/dashboard/forms/formsdashboardintro.html
+
+
+
+