diff --git a/src/Umbraco.Core/Constants-Applications.cs b/src/Umbraco.Core/Constants-Applications.cs
index 2feae59bad..f24fb61610 100644
--- a/src/Umbraco.Core/Constants-Applications.cs
+++ b/src/Umbraco.Core/Constants-Applications.cs
@@ -90,12 +90,16 @@
///
public const string MediaTypes = "mediaTypes";
-
///
/// alias for the member type tree.
///
public const string MemberTypes = "memberTypes";
+ ///
+ /// alias for the member group tree.
+ ///
+ public const string MemberGroups = "memberGroups";
+
///
/// alias for the template tree.
///
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
new file mode 100644
index 0000000000..8bfd5bc998
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/membergroup.resource.js
@@ -0,0 +1,73 @@
+/**
+ * @ngdoc service
+ * @name umbraco.resources.memberGroupResource
+ * @description Loads in data for member groups
+ **/
+function memberGroupResource($q, $http, umbRequestHelper) {
+
+ return {
+
+ //return all member types
+ getGroups: function () {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberGroupApiBaseUrl",
+ "GetAllGroups")),
+ "Failed to retrieve data for member groups");
+ },
+
+ getById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberGroupApiBaseUrl",
+ "GetById",
+ [{ id: id }])),
+ "Failed to retrieve member group");
+ },
+
+ deleteById: function (id) {
+
+ return umbRequestHelper.resourcePromise(
+ $http.post(
+ umbRequestHelper.getApiUrl(
+ "memberGroupApiBaseUrl",
+ "DeleteById",
+ [{ id: id }])),
+ "Failed to delete member group");
+ },
+
+ getScaffold: function() {
+
+ return umbRequestHelper.resourcePromise(
+ $http.get(
+ umbRequestHelper.getApiUrl(
+ "memberGroupApiBaseUrl",
+ "GetEmpty")),
+ "Failed to retrieve data for member group");
+ },
+
+ /**
+ * @ngdoc method
+ * @name umbraco.resources.memberGroupResource#save
+ * @methodOf umbraco.resources.memberGroupResource
+ *
+ * @description
+ * Saves or update a member group
+ *
+ * @param {Object} member group object to create/update
+ * @returns {Promise} resourcePromise object.
+ *
+ */
+ save: function (memberGroup) {
+ return umbRequestHelper.resourcePromise(
+ $http.post(umbRequestHelper.getApiUrl("memberGroupApiBaseUrl", "PostSave"), memberGroup),
+ "Failed to save data for member group, id: " + memberGroup.id);
+ }
+
+ };
+}
+angular.module('umbraco.resources').factory('memberGroupResource', memberGroupResource);
diff --git a/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.controller.js
new file mode 100644
index 0000000000..22deb6df4b
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.controller.js
@@ -0,0 +1,33 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.MemberGroups.DeleteController
+ * @function
+ *
+ * @description
+ * The controller for deleting member groups
+ */
+function MemberGroupsDeleteController($scope, memberGroupResource, treeService, navigationService) {
+
+ $scope.performDelete = function() {
+
+ //mark it for deletion (used in the UI)
+ $scope.currentNode.loading = true;
+ memberGroupResource.deleteById($scope.currentNode.id).then(function () {
+ $scope.currentNode.loading = false;
+
+ //get the root node before we remove it
+ var rootNode = treeService.getTreeRoot($scope.currentNode);
+
+ //TODO: Need to sync tree, etc...
+ treeService.removeNode($scope.currentNode);
+ navigationService.hideMenu();
+ });
+
+ };
+
+ $scope.cancel = function() {
+ navigationService.hideDialog();
+ };
+}
+
+angular.module("umbraco").controller("Umbraco.Editors.MemberGroups.DeleteController", MemberGroupsDeleteController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.html b/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.html
new file mode 100644
index 0000000000..8b637a71dd
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/membergroups/delete.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Are you sure you want to delete {{currentNode.name}} ?
+
+
+
+
+
+
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.controller.js
new file mode 100644
index 0000000000..4a2f20166a
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.controller.js
@@ -0,0 +1,115 @@
+/**
+ * @ngdoc controller
+ * @name Umbraco.Editors.MemberGroups.EditController
+ * @function
+ *
+ * @description
+ * The controller for the member group editor
+ */
+function MemberGroupsEditController($scope, $routeParams, appState, navigationService, memberGroupResource, contentEditingHelper, formHelper, editorState, eventsService) {
+
+ //setup scope vars
+ $scope.page = {};
+ $scope.page.loading = false;
+ $scope.page.menu = {};
+ $scope.page.menu.currentSection = appState.getSectionState("currentSection");
+ $scope.page.menu.currentNode = null;
+ var evts = [];
+
+ if ($routeParams.create) {
+
+ $scope.page.loading = true;
+
+ //we are creating so get an empty member group item
+ memberGroupResource.getScaffold()
+ .then(function(data) {
+
+ $scope.content = data;
+
+ //set a shared state
+ editorState.set($scope.content);
+
+ $scope.page.loading = false;
+
+ });
+ }
+ else {
+ loadMemberGroup();
+ }
+
+ function loadMemberGroup() {
+
+ $scope.page.loading = true;
+
+ //we are editing so get the content item from the server
+ memberGroupResource.getById($routeParams.id)
+ .then(function (data) {
+ $scope.content = data;
+
+ //share state
+ editorState.set($scope.content);
+
+ navigationService.syncTree({ tree: "memberGroups", path: data.path }).then(function (syncArgs) {
+ $scope.page.menu.currentNode = syncArgs.node;
+ });
+
+ $scope.page.loading = false;
+
+ });
+ }
+
+ $scope.save = function () {
+
+ if (formHelper.submitForm({ scope: $scope, statusMessage: "Saving..." })) {
+
+ $scope.page.saveButtonState = "busy";
+
+ memberGroupResource.save($scope.content, $scope.preValues, $routeParams.create)
+ .then(function (data) {
+
+ formHelper.resetForm({ scope: $scope, notifications: data.notifications });
+
+ contentEditingHelper.handleSuccessfulSave({
+ scope: $scope,
+ savedContent: data
+ });
+
+ //share state
+ editorState.set($scope.content);
+
+ navigationService.syncTree({ tree: "memberGroups", path: data.path, forceReload: true }).then(function (syncArgs) {
+ $scope.page.menu.currentNode = syncArgs.node;
+ });
+
+ $scope.page.saveButtonState = "success";
+
+ }, function (err) {
+
+ contentEditingHelper.handleSaveError({
+ redirectOnFailure: false,
+ err: err
+ });
+
+ $scope.page.saveButtonState = "error";
+
+ //share state
+ editorState.set($scope.content);
+ });
+ }
+
+ };
+
+ evts.push(eventsService.on("app.refreshEditor", function (name, error) {
+ loadMemberGroup();
+ }));
+
+ //ensure to unregister from all events!
+ $scope.$on('$destroy', function () {
+ for (var e in evts) {
+ eventsService.unsubscribe(evts[e]);
+ }
+ });
+
+}
+
+angular.module("umbraco").controller("Umbraco.Editors.MemberGroups.EditController", MemberGroupsEditController);
diff --git a/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.html b/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.html
new file mode 100644
index 0000000000..bf9e5e67b6
--- /dev/null
+++ b/src/Umbraco.Web.UI.Client/src/views/membergroups/edit.html
@@ -0,0 +1,48 @@
+
diff --git a/src/Umbraco.Web.UI.Client/src/views/membertypes/create.controller.js b/src/Umbraco.Web.UI.Client/src/views/membertypes/create.controller.js
index 324835a20b..6f11f94d09 100644
--- a/src/Umbraco.Web.UI.Client/src/views/membertypes/create.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/membertypes/create.controller.js
@@ -1,6 +1,6 @@
/**
* @ngdoc controller
- * @name Umbraco.Editors.MemberType.CreateController
+ * @name Umbraco.Editors.MemberTypes.CreateController
* @function
*
* @description
diff --git a/src/Umbraco.Web.UI.Client/src/views/membertypes/delete.controller.js b/src/Umbraco.Web.UI.Client/src/views/membertypes/delete.controller.js
index 061ca7eb2c..a9de8652ce 100644
--- a/src/Umbraco.Web.UI.Client/src/views/membertypes/delete.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/membertypes/delete.controller.js
@@ -1,6 +1,6 @@
/**
* @ngdoc controller
- * @name Umbraco.Editors.DocumentType.DeleteController
+ * @name Umbraco.Editors.MemberTypes.DeleteController
* @function
*
* @description
diff --git a/src/Umbraco.Web.UI.Client/src/views/membertypes/edit.controller.js b/src/Umbraco.Web.UI.Client/src/views/membertypes/edit.controller.js
index ab42c91959..3114336e95 100644
--- a/src/Umbraco.Web.UI.Client/src/views/membertypes/edit.controller.js
+++ b/src/Umbraco.Web.UI.Client/src/views/membertypes/edit.controller.js
@@ -1,6 +1,6 @@
/**
* @ngdoc controller
- * @name Umbraco.Editors.MemberType.EditController
+ * @name Umbraco.Editors.MemberTypes.EditController
* @function
*
* @description
diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
index 78fd78b16a..8445feb4e0 100644
--- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
+++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj
@@ -612,7 +612,9 @@
UI.xml
-
+
+ Designer
+
@@ -858,9 +860,6 @@
-
- Form
-
Form
diff --git a/src/Umbraco.Web.UI/config/trees.config b/src/Umbraco.Web.UI/config/trees.config
index 57022b7402..e92d9adc17 100644
--- a/src/Umbraco.Web.UI/config/trees.config
+++ b/src/Umbraco.Web.UI/config/trees.config
@@ -29,7 +29,7 @@
-
+
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
index 1360c09667..e3ea6f3120 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/en.xml
@@ -179,6 +179,7 @@
Create a new member
All Members
+ Member groups have no additional properties for editing.
Where do you want to create the new %0%
@@ -920,6 +921,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Stylesheet saved
Stylesheet saved without any errors
Datatype saved
+ Member group saved
Dictionary item saved
Publishing failed because the parent page isn't published
Content published
diff --git a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
index 700c252cde..d8d78a70ab 100644
--- a/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
+++ b/src/Umbraco.Web.UI/umbraco/config/lang/en_us.xml
@@ -181,6 +181,7 @@
Create a new member
All Members
+ Member groups have no additional properties for editing.
Where do you want to create the new %0%
@@ -919,6 +920,7 @@ To manage your website, simply open the Umbraco back office and start adding con
Stylesheet saved
Stylesheet saved without any errors
Datatype saved
+ Member group saved
Dictionary item saved
Publishing failed because the parent page isn't published
Content published
diff --git a/src/Umbraco.Web.UI/umbraco/members/EditMemberGroup.aspx b/src/Umbraco.Web.UI/umbraco/members/EditMemberGroup.aspx
deleted file mode 100644
index 488a616f08..0000000000
--- a/src/Umbraco.Web.UI/umbraco/members/EditMemberGroup.aspx
+++ /dev/null
@@ -1,22 +0,0 @@
-<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoPage.Master" CodeBehind="EditMemberGroup.aspx.cs"
- AutoEventWireup="True" Inherits="umbraco.presentation.members.EditMemberGroup" %>
-
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-
-
-
-
-
-
- |
- <%=Services.TextService.Localize("name")%>
- |
-
-
- |
-
-
-
-
-
diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs
index 203cee7dfc..99bceffdc7 100644
--- a/src/Umbraco.Web/Editors/BackOfficeController.cs
+++ b/src/Umbraco.Web/Editors/BackOfficeController.cs
@@ -319,6 +319,10 @@ namespace Umbraco.Web.Editors
"memberTypeApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl(
controller => controller.GetAllTypes())
},
+ {
+ "memberGroupApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl(
+ controller => controller.GetAllGroups())
+ },
{
"updateCheckApiBaseUrl", Url.GetUmbracoApiServiceBaseUrl(
controller => controller.GetCheck())
diff --git a/src/Umbraco.Web/Editors/MemberGroupController.cs b/src/Umbraco.Web/Editors/MemberGroupController.cs
new file mode 100644
index 0000000000..1b74b77949
--- /dev/null
+++ b/src/Umbraco.Web/Editors/MemberGroupController.cs
@@ -0,0 +1,101 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Web.Http;
+using System.Web.Security;
+using AutoMapper;
+using Umbraco.Core.Models;
+using Umbraco.Core.Security;
+using Umbraco.Core.Services;
+using Umbraco.Web.Models.ContentEditing;
+using Umbraco.Web.Mvc;
+using Umbraco.Web.WebApi.Filters;
+using Constants = Umbraco.Core.Constants;
+
+namespace Umbraco.Web.Editors
+{
+ ///
+ /// An API controller used for dealing with member groups
+ ///
+ [PluginController("UmbracoApi")]
+ [UmbracoTreeAuthorize(Constants.Trees.MemberGroups)]
+ public class MemberGroupController : UmbracoAuthorizedJsonController
+ {
+ public MemberGroupController()
+ : this(UmbracoContext.Current)
+ {
+ _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();
+ }
+
+ public MemberGroupController(UmbracoContext umbracoContext)
+ : base(umbracoContext)
+ {
+ _provider = Core.Security.MembershipProviderExtensions.GetMembersMembershipProvider();
+ }
+
+ private readonly MembershipProvider _provider;
+
+ public MemberGroupDisplay GetById(int id)
+ {
+ var memberGroup = Services.MemberGroupService.GetById(id);
+ if (memberGroup == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ var dto = Mapper.Map(memberGroup);
+ return dto;
+ }
+
+ [HttpDelete]
+ [HttpPost]
+ public HttpResponseMessage DeleteById(int id)
+ {
+ var memberGroup = Services.MemberGroupService.GetById(id);
+ if (memberGroup == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ Services.MemberGroupService.Delete(memberGroup);
+ return Request.CreateResponse(HttpStatusCode.OK);
+ }
+
+ public IEnumerable GetAllGroups()
+ {
+ if (_provider.IsUmbracoMembershipProvider())
+ {
+ return Services.MemberGroupService.GetAll()
+ .Select(Mapper.Map);
+ }
+
+ return Enumerable.Empty();
+ }
+
+ public MemberGroupDisplay GetEmpty()
+ {
+ var item = new MemberGroup();
+ return Mapper.Map(item);
+ }
+
+ public MemberGroupDisplay PostSave(MemberGroupSave saveModel)
+ {
+ var service = ApplicationContext.Services.MemberGroupService;
+
+ var id = int.Parse(saveModel.Id.ToString());
+ var memberGroup = id > 0 ? service.GetById(id) : new MemberGroup();
+ if (memberGroup == null)
+ {
+ throw new HttpResponseException(HttpStatusCode.NotFound);
+ }
+
+ memberGroup.Name = saveModel.Name;
+ service.Save(memberGroup);
+
+ var display = Mapper.Map(memberGroup);
+ display.AddSuccessNotification(Services.TextService.Localize("speechBubbles/memberGroupSaved"), string.Empty);
+ return display;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Editors/MemberTypeController.cs b/src/Umbraco.Web/Editors/MemberTypeController.cs
index 4ce6766a63..49dcf8c522 100644
--- a/src/Umbraco.Web/Editors/MemberTypeController.cs
+++ b/src/Umbraco.Web/Editors/MemberTypeController.cs
@@ -1,27 +1,23 @@
using System.Collections.Generic;
using System.Linq;
+using System.Net;
+using System.Net.Http;
+using System.Web.Http;
using System.Web.Security;
using AutoMapper;
-using Umbraco.Core;
using Umbraco.Core.Models;
-using Umbraco.Core.Services;
using Umbraco.Core.Security;
+using Umbraco.Core.Services;
using Umbraco.Web.Models.ContentEditing;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi.Filters;
using Constants = Umbraco.Core.Constants;
-using System.Web.Http;
-using System.Net;
-using Umbraco.Core.PropertyEditors;
-using System;
-using System.Net.Http;
-using ContentType = System.Net.Mime.ContentType;
namespace Umbraco.Web.Editors
{
///
- /// An API controller used for dealing with content types
+ /// An API controller used for dealing with member types
///
[PluginController("UmbracoApi")]
[UmbracoTreeAuthorize(Constants.Trees.MemberTypes)]
diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberGroupDisplay.cs b/src/Umbraco.Web/Models/ContentEditing/MemberGroupDisplay.cs
new file mode 100644
index 0000000000..f2e8cc6277
--- /dev/null
+++ b/src/Umbraco.Web/Models/ContentEditing/MemberGroupDisplay.cs
@@ -0,0 +1,21 @@
+using System.Runtime.Serialization;
+
+namespace Umbraco.Web.Models.ContentEditing
+{
+ using System.Collections.Generic;
+
+ [DataContract(Name = "memberGroup", Namespace = "")]
+ public class MemberGroupDisplay : EntityBasic, INotificationModel
+ {
+ public MemberGroupDisplay()
+ {
+ Notifications = new List();
+ }
+
+ ///
+ /// This is used to add custom localized messages/strings to the response for the app to use for localized UI purposes.
+ ///
+ [DataMember(Name = "notifications")]
+ public List Notifications { get; private set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Models/ContentEditing/MemberGroupSave.cs b/src/Umbraco.Web/Models/ContentEditing/MemberGroupSave.cs
new file mode 100644
index 0000000000..26e1665451
--- /dev/null
+++ b/src/Umbraco.Web/Models/ContentEditing/MemberGroupSave.cs
@@ -0,0 +1,9 @@
+using System.Runtime.Serialization;
+
+namespace Umbraco.Web.Models.ContentEditing
+{
+ [DataContract(Name = "memberGroup", Namespace = "")]
+ public class MemberGroupSave : EntityBasic
+ {
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
index 6595878055..d1e3eae9f1 100644
--- a/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
+++ b/src/Umbraco.Web/Models/Mapping/MemberModelMapper.cs
@@ -156,6 +156,10 @@ namespace Umbraco.Web.Models.Mapping
.ForMember(x => x.Alias, expression => expression.Ignore())
//do no map the custom member properties (currently anyways, they were never there in 6.x)
.ForMember(dto => dto.Properties, expression => expression.ResolveUsing());
+
+ //FROM IMemberGroup TO MemberGroupDisplay
+ config.CreateMap()
+ .ForMember(x => x.Path, expression => expression.MapFrom(group => "-1," + group.Id));
}
///
diff --git a/src/Umbraco.Web/Trees/MemberGroupTreeController.cs b/src/Umbraco.Web/Trees/MemberGroupTreeController.cs
new file mode 100644
index 0000000000..d1a0d2c318
--- /dev/null
+++ b/src/Umbraco.Web/Trees/MemberGroupTreeController.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.Http.Formatting;
+using Umbraco.Core;
+using Umbraco.Web.Models.Trees;
+using Umbraco.Web.WebApi.Filters;
+
+namespace Umbraco.Web.Trees
+{
+ [UmbracoTreeAuthorize(Constants.Trees.MemberGroups)]
+ [Tree(Constants.Applications.Members, Constants.Trees.MemberGroups, null, sortOrder: 2)]
+ [Mvc.PluginController("UmbracoTrees")]
+ [CoreTree]
+ public class MemberGroupTreeController : MemberTypeAndGroupTreeControllerBase
+ {
+ protected override IEnumerable GetTreeNodesFromService(string id, FormDataCollection queryStrings)
+ {
+ return Services.MemberGroupService.GetAll()
+ .OrderBy(x => x.Name)
+ .Select(dt => CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-item-arrangement", false));
+ }
+ }
+}
diff --git a/src/Umbraco.Web/Trees/MemberTypeAndGroupTreeControllerBase.cs b/src/Umbraco.Web/Trees/MemberTypeAndGroupTreeControllerBase.cs
new file mode 100644
index 0000000000..c89b94670e
--- /dev/null
+++ b/src/Umbraco.Web/Trees/MemberTypeAndGroupTreeControllerBase.cs
@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+using System.Net.Http.Formatting;
+using Umbraco.Core;
+using Umbraco.Core.Services;
+using Umbraco.Web._Legacy.Actions;
+using Umbraco.Web.Models.Trees;
+
+namespace Umbraco.Web.Trees
+{
+ [Mvc.PluginController("UmbracoTrees")]
+ [CoreTree]
+ public abstract class MemberTypeAndGroupTreeControllerBase : TreeController
+ {
+ protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
+ {
+ var nodes = new TreeNodeCollection();
+ nodes.AddRange(GetTreeNodesFromService(id, queryStrings));
+ return nodes;
+ }
+
+ protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
+ {
+ var menu = new MenuItemCollection();
+
+ if (id == Constants.System.Root.ToInvariantString())
+ {
+ // root actions
+ menu.Items.Add(Services.TextService.Localize("actions", ActionNew.Instance.Alias));
+ menu.Items.Add(Services.TextService.Localize("actions", ActionRefresh.Instance.Alias), true);
+ return menu;
+ }
+ else
+ {
+ //delete member type/group
+ menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias));
+ }
+
+ return menu;
+ }
+
+ protected abstract IEnumerable GetTreeNodesFromService(string id, FormDataCollection queryStrings);
+ }
+}
diff --git a/src/Umbraco.Web/Trees/MemberTypeTreeController.cs b/src/Umbraco.Web/Trees/MemberTypeTreeController.cs
index 4921a2e130..73bbdee37f 100644
--- a/src/Umbraco.Web/Trees/MemberTypeTreeController.cs
+++ b/src/Umbraco.Web/Trees/MemberTypeTreeController.cs
@@ -1,53 +1,21 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
-using System.Text;
-using System.Threading.Tasks;
-using umbraco;
using Umbraco.Core;
-using Umbraco.Core.Services;
using Umbraco.Web.Models.Trees;
using Umbraco.Web.WebApi.Filters;
-using Umbraco.Web._Legacy.Actions;
namespace Umbraco.Web.Trees
{
[UmbracoTreeAuthorize(Constants.Trees.MemberTypes)]
- [Tree(Constants.Applications.Members, Constants.Trees.MemberTypes, null, sortOrder:2 )]
- [Mvc.PluginController("UmbracoTrees")]
- [CoreTree]
- public class MemberTypeTreeController : TreeController
+ [Tree(Constants.Applications.Members, Constants.Trees.MemberTypes, null, sortOrder: 1)]
+ public class MemberTypeTreeController : MemberTypeAndGroupTreeControllerBase
{
- protected override TreeNodeCollection GetTreeNodes(string id, FormDataCollection queryStrings)
+ protected override IEnumerable GetTreeNodesFromService(string id, FormDataCollection queryStrings)
{
- var nodes = new TreeNodeCollection();
- nodes.AddRange(
- Services.MemberTypeService.GetAll()
- .OrderBy(x => x.Name)
- .Select(dt => CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-item-arrangement", false)));
-
- return nodes;
- }
-
- protected override MenuItemCollection GetMenuForNode(string id, FormDataCollection queryStrings)
- {
- var menu = new MenuItemCollection();
-
- if (id == Constants.System.Root.ToInvariantString())
- {
- // root actions
- menu.Items.Add(Services.TextService.Localize("actions", ActionNew.Instance.Alias));
- menu.Items.Add(Services.TextService.Localize("actions", ActionRefresh.Instance.Alias), true);
- return menu;
- }
- else
- {
- //delete member type
- menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias));
- }
-
- return menu;
+ return Services.MemberTypeService.GetAll()
+ .OrderBy(x => x.Name)
+ .Select(dt => CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-item-arrangement", false));
}
}
}
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index 90e5af5e98..843e636522 100644
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -326,6 +326,7 @@
+
@@ -336,6 +337,10 @@
+
+
+
+
@@ -1462,13 +1467,6 @@
viewAuditTrail.aspx
-
- EditMemberGroup.aspx
- ASPXCodeBehind
-
-
- EditMemberGroup.aspx
-
DictionaryItemList.aspx
ASPXCodeBehind
@@ -1539,7 +1537,6 @@
xml.aspx
-
@@ -1749,9 +1746,6 @@
-
- Form
-
ASPXCodeBehind
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadMemberGroups.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadMemberGroups.cs
deleted file mode 100644
index f498e87760..0000000000
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/loadMemberGroups.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-using Umbraco.Core.Services;
-using System;
-using System.Text;
-using System.Web;
-
-using umbraco.cms.businesslogic.member;
-using umbraco.cms.presentation.Trees;
-using System.Web.Security;
-using Umbraco.Core;
-using Umbraco.Web.Trees;
-
-namespace umbraco
-{
- ///
- /// Handles loading of the member groups into the application tree
- ///
- [Tree(Constants.Applications.Members, "memberGroups", "Member Groups", sortOrder: 1)]
- public class loadMemberGroups : BaseTree
- {
- public loadMemberGroups(string application) : base(application) { }
-
- protected override void CreateRootNode(ref XmlTreeNode rootNode)
- {
- // if we're using 3rd party membership providers we should use the Role terminology
- if (!Member.IsUsingUmbracoRoles())
- {
- rootNode.Text = Services.TextService.Localize("memberRoles");
- }
- rootNode.NodeType = "initmemberGroup";
- rootNode.NodeID = "init";
- }
-
- ///
- /// Renders the Javascript.
- ///
- /// The javascript.
- public override void RenderJS(ref StringBuilder Javascript)
- {
- Javascript.Append(
- @"
-function openMemberGroup(id) {
- UmbClientMgr.contentFrame('members/editMemberGroup.aspx?id=' + id);
-}
-");
- }
-
- public override void Render(ref XmlTree tree)
- {
- var roles = Roles.GetAllRoles();
- Array.Sort(roles);
-
- foreach(string role in roles) {
- if (role.StartsWith(Constants.Conventions.Member.InternalRolePrefix) == false)
- {
- XmlTreeNode xNode = XmlTreeNode.Create(this);
- xNode.NodeID = role;
- xNode.Text = role;
- xNode.Action = "javascript:openMemberGroup('" + HttpContext.Current.Server.UrlEncode(role.Replace("'", "\\'")) + "');";
- xNode.Icon = "icon-users";
- if (!Member.IsUsingUmbracoRoles())
- {
- xNode.Menu = null;
- }
-
- OnBeforeNodeRender(ref tree, ref xNode, EventArgs.Empty);
- if (xNode != null)
- {
- tree.Add(xNode);
- }
- OnAfterNodeRender(ref tree, ref xNode, EventArgs.Empty);
- }
- }
- }
- }
-}
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx
deleted file mode 100644
index 488a616f08..0000000000
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx
+++ /dev/null
@@ -1,22 +0,0 @@
-<%@ Page Language="c#" MasterPageFile="../masterpages/umbracoPage.Master" CodeBehind="EditMemberGroup.aspx.cs"
- AutoEventWireup="True" Inherits="umbraco.presentation.members.EditMemberGroup" %>
-
-<%@ Register TagPrefix="cc1" Namespace="umbraco.uicontrols" Assembly="controls" %>
-
-
-
-
-
-
- |
- <%=Services.TextService.Localize("name")%>
- |
-
-
- |
-
-
-
-
-
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs
deleted file mode 100644
index 2e1eb58dae..0000000000
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-using Umbraco.Core.Services;
-using System;
-using umbraco.cms.businesslogic.member;
-using umbraco.cms.presentation.Trees;
-using umbraco.uicontrols;
-using Umbraco.Core;
-using Umbraco.Web.UI;
-
-namespace umbraco.presentation.members
-{
- ///
- /// Summary description for EditMemberGroup.
- ///
- public partial class EditMemberGroup : Umbraco.Web.UI.Pages.UmbracoEnsuredPage
- {
- public EditMemberGroup()
- {
- CurrentApp = Constants.Applications.Members.ToString();
-
- }
-
- private MemberGroup _memberGroup = null;
- protected MenuButton save = null;
- string _memberGroupId = String.Empty;
-
- protected void Page_Load(object sender, System.EventArgs e)
- {
- _memberGroupId = !String.IsNullOrEmpty(memberGroupName.Value) ? memberGroupName.Value : Request.QueryString["id"];
-
- // Restore any escaped apostrophe for name look up
- _memberGroupId = _memberGroupId.Replace("\\'", "'");
-
- if (!IsPostBack)
- {
- ClientTools
- .SetActiveTreeType(TreeDefinitionCollection.Instance.FindTree().Tree.Alias)
- .SyncTree(_memberGroupId, false);
- }
-
- if (!Member.IsUsingUmbracoRoles())
- {
- NameTxt.Enabled = false;
- save.Enabled = false;
- NameTxt.Text = _memberGroupId + " (not editable from umbraco)";
- }
- else
- {
- _memberGroup = MemberGroup.GetByName(_memberGroupId);
-
- if (!IsPostBack)
- {
- NameTxt.Text = _memberGroup.Text;
- }
- }
- }
-
- private void save_click(object sender, EventArgs e)
- {
- _memberGroup.Text = NameTxt.Text;
- memberGroupName.Value = NameTxt.Text;
- _memberGroup.Save();
- this.ClientTools.ShowSpeechBubble(SpeechBubbleIcon.Save, Services.TextService.Localize("speechBubbles/editMemberGroupSaved"),"");
-
- ClientTools
- .RefreshTree(TreeDefinitionCollection.Instance.FindTree().Tree.Alias);
-
- }
-
- #region Web Form Designer generated code
- override protected void OnInit(EventArgs e)
- {
- //
- // CODEGEN: This call is required by the ASP.NET Web Form Designer.
- //
- InitializeComponent();
- base.OnInit(e);
- Panel1.hasMenu = true;
- save = Panel1.Menu.NewButton();
- save.Text = Services.TextService.Localize("save");
- save.Click += new EventHandler(save_click);
- save.ButtonType = MenuButtonType.Primary;
-
- Panel1.Text = Services.TextService.Localize("membergroup");
- }
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
-
- }
- #endregion
- }
-}
diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.designer.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.designer.cs
deleted file mode 100644
index 0319903f54..0000000000
--- a/src/Umbraco.Web/umbraco.presentation/umbraco/members/EditMemberGroup.aspx.designer.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace umbraco.presentation.members {
-
-
- public partial class EditMemberGroup {
-
- ///
- /// memberGroupName control.
- ///
- ///
- /// Auto-generated field.
- /// To modify move field declaration from designer file to code-behind file.
- ///
- protected global::System.Web.UI.HtmlControls.HtmlInputHidden memberGroupName;
-
- ///
- /// Panel1 control.
- ///
- ///
- /// Auto-generated field.
- /// To modify move field declaration from designer file to code-behind file.
- ///
- protected global::umbraco.uicontrols.UmbracoPanel Panel1;
-
- ///
- /// Pane7 control.
- ///
- ///
- /// Auto-generated field.
- /// To modify move field declaration from designer file to code-behind file.
- ///
- protected global::umbraco.uicontrols.Pane Pane7;
-
- ///
- /// NameTxt control.
- ///
- ///
- /// Auto-generated field.
- /// To modify move field declaration from designer file to code-behind file.
- ///
- protected global::System.Web.UI.WebControls.TextBox NameTxt;
- }
-}