diff --git a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js
index 08f1690a1b..488bd8a393 100644
--- a/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js
+++ b/src/Umbraco.Web.UI.Client/src/common/services/dialog.service.js
@@ -318,6 +318,25 @@ angular.module('umbraco.services')
return openDialog(options);
},
+ /**
+ * @ngdoc method
+ * @name umbraco.services.dialogService#memberPicker
+ * @methodOf umbraco.services.dialogService
+ *
+ * @description
+ * Opens a member picker tree in a modal, the callback returns an array of selected documents
+ * @param {Object} options member picker dialog options object
+ * @param {$scope} options.scope dialog scope
+ * @param {$scope} options.multipicker should the picker return one or multiple items
+ * @param {Function} options.callback callback function
+ * @returns {Object} modal object
+ */
+ memberPicker: function (options) {
+ options.template = 'views/common/dialogs/memberPicker.html';
+ options.show = true;
+ return openDialog(options);
+ },
+
/**
* @ngdoc method
* @name umbraco.services.dialogService#linkPicker
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js
new file mode 100644
index 0000000000..814710f8f8
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js
@@ -0,0 +1,34 @@
+//used for the member picker dialog
+angular.module("umbraco").controller("Umbraco.Dialogs.MemberPickerController",
+ function ($scope, eventsService, $log) {
+ var dialogOptions = $scope.$parent.dialogOptions;
+ $scope.dialogTreeEventHandler = $({});
+
+ $scope.dialogTreeEventHandler.bind("treeNodeSelect", function(ev, args){
+ args.event.preventDefault();
+ args.event.stopPropagation();
+
+ eventsService.publish("Umbraco.Dialogs.MemberPickerController.Select", args).then(function(args){
+ if(dialogOptions && dialogOptions.multipicker){
+
+ var c = $(args.event.target.parentElement);
+ if(!args.node.selected){
+ args.node.selected = true;
+ c.find("i.umb-tree-icon").hide()
+ .after("");
+ }else{
+ args.node.selected = false;
+ c.find(".temporary").remove();
+ c.find("i.umb-tree-icon").show();
+ }
+
+ $scope.select(args.node);
+
+ }else{
+ $scope.submit(args.node);
+ }
+
+ });
+
+ });
+});
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.html b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.html
new file mode 100644
index 0000000000..a4657e9733
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.html
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js
new file mode 100644
index 0000000000..0714ef25d4
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.controller.js
@@ -0,0 +1,58 @@
+//this controller simply tells the dialogs service to open a memberPicker window
+//with a specified callback, this callback will receive an object with a selection on it
+angular.module('umbraco')
+.controller("Umbraco.PropertyEditors.MemberPickerController",
+
+ function($scope, dialogService, entityResource, $log, iconHelper){
+ $scope.ids = $scope.model.value.split(',');
+ $scope.renderModel = [];
+ $scope.multipicker = true;
+
+ entityResource.getByIds($scope.ids, "Member").then(function(data){
+ $(data).each(function(i, item){
+ item.icon = iconHelper.convertFromLegacyIcon(item.icon);
+ $scope.renderModel.push({name: item.name, id: item.id, icon: item.icon});
+ });
+ });
+
+ $scope.openMemberPicker =function(){
+ var d = dialogService.memberPicker({scope: $scope, multipicker: $scope.multipicker, callback: populate});
+ };
+
+ $scope.remove =function(index){
+ $scope.renderModel.splice(index, 1);
+ $scope.ids.splice(index, 1);
+ $scope.model.value = trim($scope.ids.join(), ",");
+ };
+
+ $scope.add =function(item){
+ if($scope.ids.indexOf(item.id) < 0){
+ item.icon = iconHelper.convertFromLegacyIcon(item.icon);
+ $scope.renderModel.push({name: item.name, id: item.id, icon: item.icon});
+ $scope.ids.push(item.id);
+ $scope.model.value = trim($scope.ids.join(), ",");
+ }
+ };
+
+ $scope.clear = function() {
+ $scope.ids = [];
+ $scope.model.value = "";
+ $scope.renderModel = [];
+ };
+
+ function trim(str, chr) {
+ var rgxtrim = (!chr) ? new RegExp('^\\s+|\\s+$', 'g') : new RegExp('^'+chr+'+|'+chr+'+$', 'g');
+ return str.replace(rgxtrim, '');
+ }
+
+ function populate(data){
+ if(data.selection && angular.isArray(data.selection)){
+ $(data.selection).each(function(i, item){
+ $scope.add(item);
+ });
+ }else{
+ $scope.clear();
+ $scope.add(data);
+ }
+ }
+});
\ No newline at end of file
diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html
new file mode 100644
index 0000000000..8cc1f82e4a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html
@@ -0,0 +1,21 @@
+
\ No newline at end of file
diff --git a/src/Umbraco.Web/PropertyEditors/MemberPickerPropertyEditor.cs b/src/Umbraco.Web/PropertyEditors/MemberPickerPropertyEditor.cs
new file mode 100644
index 0000000000..d1102ec2f9
--- /dev/null
+++ b/src/Umbraco.Web/PropertyEditors/MemberPickerPropertyEditor.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Umbraco.Core;
+using Umbraco.Core.PropertyEditors;
+
+namespace Umbraco.Web.PropertyEditors
+{
+ [PropertyEditor(Constants.PropertyEditors.MemberPickerAlias, "Member Picker", "memberpicker")]
+ public class MemberPickerPropertyEditor : PropertyEditor
+ {
+ }
+}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index dc7ace1be7..b2196e6ead 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -328,6 +328,7 @@
+