Merge pull request #2502 from umbraco/temp-U4-11032
U4-11032 Consolidate the number of dropdown property editors into one
This commit is contained in:
@@ -122,6 +122,11 @@ namespace Umbraco.Core
|
||||
/// Alias for the Dropdown list, publishing keys datatype.
|
||||
/// </summary>
|
||||
public const string DropdownlistPublishingKeysAlias = "Umbraco.DropdownlistPublishingKeys";
|
||||
|
||||
/// <summary>
|
||||
/// Alias for the "new" Dropdown list, that replaces the old four deprecated ones and works as other list based property editors
|
||||
/// </summary>
|
||||
public const string DropDownListFlexibleAlias = "Umbraco.DropDown.Flexible";
|
||||
|
||||
/// <summary>
|
||||
/// Guid for the Folder browser datatype.
|
||||
@@ -452,4 +457,4 @@ namespace Umbraco.Core
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
<input name="boolean" type="checkbox" ng-model="model.value" ng-true-value="1" ng-false-value="0" />
|
||||
<input name="boolean" type="checkbox" ng-model="model.value" ng-true-value="1" ng-false-value="0" id="boolean" /> <label for="boolean">True</label>
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
angular.module("umbraco").controller("Umbraco.PropertyEditors.DropdownFlexibleController",
|
||||
function($scope) {
|
||||
|
||||
//setup the default config
|
||||
var config = {
|
||||
items: [],
|
||||
multiple: false
|
||||
};
|
||||
|
||||
//map the user config
|
||||
angular.extend(config, $scope.model.config);
|
||||
|
||||
//map back to the model
|
||||
$scope.model.config = config;
|
||||
|
||||
function convertArrayToDictionaryArray(model){
|
||||
//now we need to format the items in the dictionary because we always want to have an array
|
||||
var newItems = [];
|
||||
for (var i = 0; i < model.length; i++) {
|
||||
newItems.push({ id: model[i], sortOrder: 0, value: model[i] });
|
||||
}
|
||||
|
||||
return newItems;
|
||||
}
|
||||
|
||||
|
||||
function convertObjectToDictionaryArray(model){
|
||||
//now we need to format the items in the dictionary because we always want to have an array
|
||||
var newItems = [];
|
||||
var vals = _.values($scope.model.config.items);
|
||||
var keys = _.keys($scope.model.config.items);
|
||||
|
||||
for (var i = 0; i < vals.length; i++) {
|
||||
var label = vals[i].value ? vals[i].value : vals[i];
|
||||
newItems.push({ id: keys[i], sortOrder: vals[i].sortOrder, value: label });
|
||||
}
|
||||
|
||||
return newItems;
|
||||
}
|
||||
|
||||
$scope.updateSingleDropdownValue = function() {
|
||||
$scope.model.value = [$scope.model.singleDropdownValue];
|
||||
}
|
||||
|
||||
if (angular.isArray($scope.model.config.items)) {
|
||||
//PP: I dont think this will happen, but we have tests that expect it to happen..
|
||||
//if array is simple values, convert to array of objects
|
||||
if(!angular.isObject($scope.model.config.items[0])){
|
||||
$scope.model.config.items = convertArrayToDictionaryArray($scope.model.config.items);
|
||||
}
|
||||
}
|
||||
else if (angular.isObject($scope.model.config.items)) {
|
||||
$scope.model.config.items = convertObjectToDictionaryArray($scope.model.config.items);
|
||||
}
|
||||
else {
|
||||
throw "The items property must be either an array or a dictionary";
|
||||
}
|
||||
|
||||
|
||||
//sort the values
|
||||
$scope.model.config.items.sort(function (a, b) { return (a.sortOrder > b.sortOrder) ? 1 : ((b.sortOrder > a.sortOrder) ? -1 : 0); });
|
||||
|
||||
//now we need to check if the value is null/undefined, if it is we need to set it to "" so that any value that is set
|
||||
// to "" gets selected by default
|
||||
if ($scope.model.value === null || $scope.model.value === undefined) {
|
||||
if ($scope.model.config.multiple) {
|
||||
$scope.model.value = [];
|
||||
}
|
||||
else {
|
||||
$scope.model.value = "";
|
||||
}
|
||||
}
|
||||
|
||||
// if we run in single mode we'll store the value in a local variable
|
||||
// so we can pass an array as the model as our PropertyValueEditor expects that
|
||||
$scope.model.singleDropdownValue = "";
|
||||
if ($scope.model.config.multiple === "0") {
|
||||
$scope.model.singleDropdownValue = Array.isArray($scope.model.value) ? $scope.model.value[0] : $scope.model.value;
|
||||
}
|
||||
|
||||
});
|
||||
@@ -0,0 +1,19 @@
|
||||
<div ng-controller="Umbraco.PropertyEditors.DropdownFlexibleController" ng-switch="model.config.multiple">
|
||||
|
||||
<select name="dropDownList"
|
||||
class="umb-editor umb-dropdown"
|
||||
ng-switch-default
|
||||
ng-change="updateSingleDropdownValue()"
|
||||
ng-model="model.singleDropdownValue"
|
||||
ng-options="item.id as item.value for item in model.config.items">
|
||||
<option></option>
|
||||
</select>
|
||||
|
||||
<!--NOTE: This ng-switch is required because ng-multiple doesn't actually support dynamic bindings with multi-select lists -->
|
||||
<select name="dropDownList"
|
||||
class="umb-editor umb-dropdown"
|
||||
ng-switch-when="1"
|
||||
multiple
|
||||
ng-model="model.value"
|
||||
ng-options="item.id as item.value for item in model.config.items"></select>
|
||||
</div>
|
||||
@@ -15,7 +15,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
[ParameterEditor("propertyTypePickerMultiple", "Name", "textbox")]
|
||||
[ParameterEditor("contentTypeMultiple", "Name", "textbox")]
|
||||
[ParameterEditor("tabPickerMultiple", "Name", "textbox")]
|
||||
[PropertyEditor(Constants.PropertyEditors.DropDownListMultipleAlias, "Dropdown list multiple", "dropdown", Group = "lists", Icon="icon-bulleted-list")]
|
||||
[PropertyEditor(Constants.PropertyEditors.DropDownListMultipleAlias, "Dropdown list multiple", "dropdown", Group = "lists", Icon="icon-bulleted-list", IsDeprecated = true)]
|
||||
public class DropDownMultiplePropertyEditor : DropDownMultipleWithKeysPropertyEditor
|
||||
{
|
||||
protected override PropertyValueEditor CreateValueEditor()
|
||||
@@ -28,4 +28,4 @@ namespace Umbraco.Web.PropertyEditors
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
/// Due to maintaining backwards compatibility this data type stores the value as a string which is a comma separated value of the
|
||||
/// ids of the individual items so we have logic in here to deal with that.
|
||||
/// </remarks>
|
||||
[PropertyEditor(Constants.PropertyEditors.DropdownlistMultiplePublishKeysAlias, "Dropdown list multiple, publish keys", "dropdown", Group = "lists", Icon = "icon-bulleted-list")]
|
||||
[PropertyEditor(Constants.PropertyEditors.DropdownlistMultiplePublishKeysAlias, "Dropdown list multiple, publish keys", "dropdown", Group = "lists", Icon = "icon-bulleted-list", IsDeprecated = true)]
|
||||
public class DropDownMultipleWithKeysPropertyEditor : DropDownPropertyEditor
|
||||
{
|
||||
protected override PropertyValueEditor CreateValueEditor()
|
||||
@@ -62,4 +62,4 @@ namespace Umbraco.Web.PropertyEditors
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
/// as INT and we have logic in here to ensure it is formatted correctly including ensuring that the string value is published
|
||||
/// in cache and not the int ID.
|
||||
/// </remarks>
|
||||
[PropertyEditor(Constants.PropertyEditors.DropDownListAlias, "Dropdown list", "dropdown", ValueType = PropertyEditorValueTypes.String, Group = "lists", Icon = "icon-indent")]
|
||||
[PropertyEditor(Constants.PropertyEditors.DropDownListAlias, "Dropdown list", "dropdown", ValueType = PropertyEditorValueTypes.String, Group = "lists", Icon = "icon-indent", IsDeprecated = true)]
|
||||
public class DropDownPropertyEditor : DropDownWithKeysPropertyEditor
|
||||
{
|
||||
/// <summary>
|
||||
@@ -29,4 +29,4 @@ namespace Umbraco.Web.PropertyEditors
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Umbraco.Web.PropertyEditors
|
||||
/// as INT and we have logic in here to ensure it is formatted correctly including ensuring that the INT ID value is published
|
||||
/// in cache and not the string value.
|
||||
/// </remarks>
|
||||
[PropertyEditor(Constants.PropertyEditors.DropdownlistPublishingKeysAlias, "Dropdown list, publishing keys", "dropdown", ValueType = PropertyEditorValueTypes.Integer, Group = "lists", Icon = "icon-indent")]
|
||||
[PropertyEditor(Constants.PropertyEditors.DropdownlistPublishingKeysAlias, "Dropdown list, publishing keys", "dropdown", ValueType = PropertyEditorValueTypes.Integer, Group = "lists", Icon = "icon-indent", IsDeprecated = true)]
|
||||
public class DropDownWithKeysPropertyEditor : PropertyEditor
|
||||
{
|
||||
|
||||
@@ -24,4 +24,4 @@ namespace Umbraco.Web.PropertyEditors
|
||||
return new ValueListPreValueEditor();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.PropertyEditors;
|
||||
|
||||
namespace Umbraco.Web.PropertyEditors
|
||||
{
|
||||
[PropertyEditor(Constants.PropertyEditors.DropDownListFlexibleAlias, "Dropdown", "dropdownFlexible", Group = "lists", Icon = "icon-indent")]
|
||||
public class DropdownFlexiblePropertyEditor : PropertyEditor
|
||||
{
|
||||
private static readonly string _multipleKey = "multiple";
|
||||
|
||||
/// <summary>
|
||||
/// Return a custom pre-value editor
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// We are just going to re-use the ValueListPreValueEditor
|
||||
/// </remarks>
|
||||
protected override PreValueEditor CreatePreValueEditor()
|
||||
{
|
||||
return new DropdownFlexiblePreValueEditor();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// We need to override the value editor so that we can ensure the string value is published in cache and not the integer ID value.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected override PropertyValueEditor CreateValueEditor()
|
||||
{
|
||||
return new PublishValuesMultipleValueEditor(false, base.CreateValueEditor());
|
||||
}
|
||||
|
||||
internal class DropdownFlexiblePreValueEditor : ValueListPreValueEditor
|
||||
{
|
||||
public DropdownFlexiblePreValueEditor()
|
||||
{
|
||||
Fields.Insert(0, new PreValueField
|
||||
{
|
||||
Key = "multiple",
|
||||
Name = "Enable multiple choice",
|
||||
Description = "When checked, the dropdown will be a select multiple / combo box style dropdown",
|
||||
View = "boolean"
|
||||
});
|
||||
}
|
||||
|
||||
public override IDictionary<string, PreValue> ConvertEditorToDb(IDictionary<string, object> editorValue, PreValueCollection currentValue)
|
||||
{
|
||||
|
||||
var result = base.ConvertEditorToDb(editorValue, currentValue);
|
||||
|
||||
// get multiple config
|
||||
var multipleValue = editorValue[_multipleKey] != null ? editorValue[_multipleKey].ToString() : "0";
|
||||
result.Add(_multipleKey, new PreValue(-1, multipleValue));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override IDictionary<string, object> ConvertDbToEditor(IDictionary<string, object> defaultPreVals, PreValueCollection persistedPreVals)
|
||||
{
|
||||
// weird way, but as the value stored is 0 or 1 need to do it this way
|
||||
string multipleMode = "0";
|
||||
if (persistedPreVals != null && persistedPreVals.PreValuesAsDictionary[_multipleKey] != null)
|
||||
{
|
||||
multipleMode = persistedPreVals.PreValuesAsDictionary[_multipleKey].Value;
|
||||
|
||||
// remove from the collection sent to the base multiple values collection
|
||||
persistedPreVals.PreValuesAsDictionary.Remove(_multipleKey);
|
||||
}
|
||||
|
||||
var returnVal = base.ConvertDbToEditor(defaultPreVals, persistedPreVals);
|
||||
|
||||
returnVal[_multipleKey] = multipleMode;
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -337,6 +337,7 @@
|
||||
<Compile Include="Models\Mapping\ContentTreeNodeUrlResolver.cs" />
|
||||
<Compile Include="Models\Mapping\MemberTreeNodeUrlResolver.cs" />
|
||||
<Compile Include="Models\Trees\ExportMember.cs" />
|
||||
<Compile Include="PropertyEditors\DropdownFlexiblePropertyEditor.cs" />
|
||||
<Compile Include="TourFilterResolver.cs" />
|
||||
<Compile Include="Editors\UserEditorAuthorizationHelper.cs" />
|
||||
<Compile Include="Editors\UserGroupAuthorizationAttribute.cs" />
|
||||
|
||||
Reference in New Issue
Block a user