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 @@ +