Add MemberManage dashboard

This commit is contained in:
2022-10-24 11:17:36 -04:00
parent cb5f92e58f
commit bdaa3ab3d5
34 changed files with 2834 additions and 13 deletions
@@ -78,4 +78,138 @@
<loadcontrol>
</loadcontrol>
</package>
<package id="2" version="1.5.4" url="https://github.com/YourItGroup/umbMemberListView" name="MemberListView for Umbraco 7" folder="323970a2-1dba-4a53-a689-12e65b957ac2" packagepath="" repositoryGuid="65194810-1f85-11dd-bd0b-0800200c9a66" iconUrl="" umbVersion="7.15.3" packageGuid="876ec278-80ed-49ac-9b64-813b0c7a59f3" hasUpdate="False" enableSkins="False" skinRepoGuid="00000000-0000-0000-0000-000000000000">
<license url="http://opensource.org/licenses/MIT">MIT License</license>
<author url="http://youritteam.com.au">Robert Foster</author>
<readme><![CDATA[The MemberListView for Umbraco 7 provides a management dashboard view for Members with convenient filtering and sorting and allows for mass Unlock, Suspension or Activation of members.
Installing the package enables a new Manage Dashboard on the Members section.
Features
========
The MemberListView has been designed to be similar to the ContentListView property editor and features a Create button to allow for quick creation of new Members and context-sensitive action buttons to Unlock, Approve or Suspend members depending on the status of their account as well as the ability to Delete them. All actions can be performed on batches of users, as they apply to selected users only.
Member Editing
==============
Member Editing can be done without leaving the MemberListView by clicking on a member name, which creates a Dialog pulled in from the right side to edit the member.
New in Version 1.5.4
====================
* Improved handling of bulk operations - refresh should now display correct items after a short delay to allow the index to catch up.
New in Version 1.5.3
====================
* Added support for SensitiveData - Exports will be hidden if the user doesn't have permission to view sensitive data, and sensitive properties will not be viewable
* Enhanced Export functionality - now allows selection of columns and the choice of exporting to CSV or Excel OpenFormat
New in Version 1.5.0
====================
* Support for Umbraco 7.15
* Refreshed listview to be more inline with current Umbraco styling and practices.
* Filtering and columns now much easier to customise.
* Added multiple Member Group filtering out of the box
New in Version 1.3.0
====================
* Support for Localization with plugin-based lang files
* Fixed issue where selecting a row caused the "You have unsaved changes" message to appear on navigation.
New in Version 1.2.0
====================
* Compiled against Umbraco 7.7
* Fixed issue with suspending/activating/deleting members
New in Version 0.9.12
=====================
* Fixed "Error: Argument 'MemberManager.Dashboard.MemberListViewController' is not a function" issue due to update in ClientDependency module
New in Version 0.9.11
=====================
* UI cleanup - paging now consistent with 7.2.0 ListView
* Issue with UnApproved members showing up in the list as approved.
New in Version 0.9.10
=====================
* Export - Export now supports additional user indexed fields. If you add a property to a member type and want it to be exported, add it to the IndexUserFields collection in the ExamineIndex.config file.
New in Version 0.9.9
====================
* Search is now lightning fast, although some modification to the Examine Index configuration is required.
* Filtering - filtering has now been moved to a dialog, includes Membership Flags and MemberType as default fields and is extendable.
* Export - Filtered members can now be exported to a CSV file containing basic fields.
Current issues
==============
Currently Bulk Deletion will throw a lot of errors due to Database commit blocking. Deleting one at a time however should not be affected.]]></readme>
<actions>
<Action runat="install" alias="addDashboardSection" dashboardAlias="MemberManagerDashboardSection">
<section>
<areas>
<area>member</area>
</areas>
<tab caption="Manage">
<control showOnce="false" addPanel="false" panelCaption="">
/app_plugins/MemberManager/backoffice/dashboard/memberListView.html
</control>
</tab>
</section>
</Action>
</actions>
<datatypes>
</datatypes>
<content nodeId="" loadChildNodes="False">
</content>
<templates>
</templates>
<stylesheets>
</stylesheets>
<documenttypes>
</documenttypes>
<macros>
</macros>
<files>
<file>/App_Plugins/MemberManager/package.manifest</file>
<file>/App_Plugins/MemberManager/backoffice/dashboard/memberListView.controller.js</file>
<file>/App_Plugins/MemberManager/backoffice/dashboard/memberListView.html</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/edit.html</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/edit.controller.js</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/export.html</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/export.controller.js</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/filter.html</file>
<file>/App_Plugins/MemberManager/backoffice/dialogs/member/filter.controller.js</file>
<file>/App_Plugins/MemberManager/css/memberListView.css</file>
<file>/App_Plugins/MemberManager/resources/member.resource.js</file>
<file>/bin/MemberListView.dll</file>
<file>/bin/ClosedXML.dll</file>
<file>/bin/DocumentFormat.OpenXml.dll</file>
<file>/bin/ExcelNumberFormat.dll</file>
<file>/bin/FastMember.dll</file>
<file>/App_Plugins/MemberManager/lang/cs.xml</file>
<file>/App_Plugins/MemberManager/lang/da.xml</file>
<file>/App_Plugins/MemberManager/lang/de.xml</file>
<file>/App_Plugins/MemberManager/lang/en-gb.xml</file>
<file>/App_Plugins/MemberManager/lang/en-us.xml</file>
<file>/App_Plugins/MemberManager/lang/es.xml</file>
<file>/App_Plugins/MemberManager/lang/fr.xml</file>
<file>/App_Plugins/MemberManager/lang/he.xml</file>
<file>/App_Plugins/MemberManager/lang/it.xml</file>
<file>/App_Plugins/MemberManager/lang/ja.xml</file>
<file>/App_Plugins/MemberManager/lang/ko.xml</file>
<file>/App_Plugins/MemberManager/lang/nb.xml</file>
<file>/App_Plugins/MemberManager/lang/nl.xml</file>
<file>/App_Plugins/MemberManager/lang/pl.xml</file>
<file>/App_Plugins/MemberManager/lang/pt.xml</file>
<file>/App_Plugins/MemberManager/lang/ru.xml</file>
<file>/App_Plugins/MemberManager/lang/sv.xml</file>
<file>/App_Plugins/MemberManager/lang/tr.xml</file>
<file>/App_Plugins/MemberManager/lang/zh-tw.xml</file>
<file>/App_Plugins/MemberManager/lang/zh.xml</file>
</files>
<languages>
</languages>
<dictionaryitems>
</dictionaryitems>
<loadcontrol>
</loadcontrol>
</package>
</packages>
@@ -0,0 +1,720 @@
/**
* @ngdoc controller
* @name MemberManager.List.ViewController
* @function
*
* @description
* The controller for the member list view
*
* @param {object} $scope Scope
* @param {object} $routeParams Route Parameters
* @param {object} $timeout Timeout
* @param {object} $location Location
* @param {object} memberResource Member Resource
* @param {object} memberExtResource Member Extension Resource (custom)
* @param {object} memberTypeResource Member Type Resource
* @param {object} notificationsService Notifications Service
* @param {object} iconHelper Icon Helper
* @param {object} dialogService Dialog Service
* @param {object} editorState Editor State
* @param {object} localizationService Localisation Service
* @param {object} listViewHelper Listview Helper
*/
function memberListViewController($scope, $routeParams, $timeout, $location, memberResource, memberExtResource, memberTypeResource, notificationsService, iconHelper, dialogService, editorState, localizationService, listViewHelper) {
var deleteItemCallback, getIdCallback, createEditUrlCallback;
$scope.model = {};
$scope.model.config = {
pageSize: 100,
orderBy: 'Name',
orderDirection: 'asc',
includeProperties: [
{ alias: 'email', header: 'Email', isSystem: 1 },
{ alias: 'memberGroups', header: 'Group', isSystem: 1 },
{ alias: 'firstName', header: 'First Name', isSystem: 0 },
{ alias: 'lastName', header: 'Last Name', isSystem: 0 },
{ alias: 'phone', header: 'Phone', isSystem: 0 },
{ alias: 'isApproved', header: 'Approved', isSystem: 1 },
{ alias: 'isLockedOut', header: 'Locked Out', isSystem: 1 }
],
layouts: [
{ name: 'List', path: 'views/propertyeditors/listview/layouts/list/list.html', icon: 'icon-list', isSystem: 1, selected: true }
],
bulkActionPermissions: {
allowBulkDelete: true,
allowExport: true
}
};
$scope.currentNodePermissions = null;
if (editorState.current) {
//Fetch current node allowed actions for the current user
//This is the current node & not each individual child node in the list
var currentUserPermissions = editorState.current.allowedActions;
//Create a nicer model rather than the funky & hard to remember permissions strings
$scope.currentNodePermissions = {
"canCopy": _.contains(currentUserPermissions, 'O'), //Magic Char = O
"canCreate": _.contains(currentUserPermissions, 'C'), //Magic Char = C
"canDelete": _.contains(currentUserPermissions, 'D'), //Magic Char = D
"canMove": _.contains(currentUserPermissions, 'M'), //Magic Char = M
};
}
$scope.entityType = "member";
$scope.memberGroups = null;
getContentTypesCallback = memberTypeResource.getTypes;
deleteItemCallback = memberResource.deleteByKey;
getIdCallback = function (selected) {
return selected.key;
};
createEditUrlCallback = function (item) {
return "/" + $scope.entityType + "/" + $scope.entityType + "/edit/" + item.key;
};
$scope.pagination = [];
$scope.isNew = false;
$scope.actionInProgress = false;
$scope.selection = [];
$scope.folders = [];
$scope.listViewResultSet = {
totalPages: 0,
items: []
};
$scope.createAllowedButtonSingle = false;
$scope.createAllowedButtonMulti = false;
$scope.options = {
pageSize: $scope.model.config.pageSize ? $scope.model.config.pageSize : 10,
pageNumber: $routeParams.page && !isNaN($routeParams.page) && Number($routeParams.page) > 0 ? $routeParams.page : 1,
filterData: {
filter: null
},
orderBy: ($scope.model.config.orderBy ? $scope.model.config.orderBy : 'Name').trim(),
orderDirection: $scope.model.config.orderDirection ? $scope.model.config.orderDirection.trim() : "asc",
orderBySystemField: true,
includeProperties: $scope.model.config.includeProperties ? $scope.model.config.includeProperties : [
{ alias: 'updateDate', header: 'Last edited', isSystem: 1 },
{ alias: 'updater', header: 'Last edited by', isSystem: 1 }
],
layout: {
layouts: $scope.model.config.layouts,
activeLayout: listViewHelper.getLayout($routeParams.id, $scope.model.config.layouts)
},
allowBulkDelete: $scope.model.config.bulkActionPermissions.allowBulkDelete,
allowExport: $scope.model.config.bulkActionPermissions.allowExport
};
// Check if selected order by field is actually custom field
for (var j = 0; j < $scope.options.includeProperties.length; j++) {
var includedProperty = $scope.options.includeProperties[j];
if (includedProperty.alias.toLowerCase() === $scope.options.orderBy.toLowerCase()) {
$scope.options.orderBySystemField = includedProperty.isSystem === 1;
break;
}
}
//update all of the system includeProperties to enable sorting
_.each($scope.options.includeProperties, function (e, i) {
//NOTE: special case for contentTypeAlias, it's a system property that cannot be sorted
// to do that, we'd need to update the base query for content to include the content type alias column
// which requires another join and would be slower. BUT We are doing this for members so not sure it makes a diff?
if (e.alias !== "contentTypeAlias") {
e.allowSorting = true;
}
if (e.isSystem) {
//localize the header
var key = getLocalizedKey(e.alias);
localizationService.localize(key).then(function (v) {
e.header = v;
});
}
});
function showNotificationsAndReset(err, reload, successMsg) {
//check if response is ysod
if (err.status && err.status >= 500) {
// Open ysod overlay
$scope.ysodOverlay = {
view: "ysod",
error: err,
show: true
};
}
$timeout(function () {
$scope.bulkStatus = "";
$scope.actionInProgress = false;
},
500);
if (reload === true) {
$scope.reloadView();
}
if (err.data && angular.isArray(err.data.notifications)) {
for (var i = 0; i < err.data.notifications.length; i++) {
notificationsService.showNotification(err.data.notifications[i]);
}
} else if (successMsg) {
localizationService.localize("bulk_done")
.then(function (v) {
notificationsService.success(v, successMsg);
});
}
}
$scope.next = function (pageNumber) {
$scope.options.pageNumber = pageNumber;
$scope.reloadView();
};
$scope.goToPage = function (pageNumber) {
$scope.options.pageNumber = pageNumber;
$scope.reloadView();
};
$scope.prev = function (pageNumber) {
$scope.options.pageNumber = pageNumber;
$scope.getContent();
};
$scope.isSortDirection = function (col, direction) {
return $scope.options.orderBy.toUpperCase() === col.toUpperCase() && $scope.options.orderDirection === direction;
};
$scope.sort = function (field) {
$scope.options.orderBy = field;
if ($scope.options.orderDirection === "desc") {
$scope.options.orderDirection = "asc";
} else {
$scope.options.orderDirection = "desc";
}
$scope.reloadView();
};
$scope.getContent = function (contentId) {
$scope.reloadView();
};
/*Loads the search results, based on parameters set in prev,next,sort and so on*/
/*Pagination is done by an array of objects, due angularJS's funky way of monitoring state
with simple values */
$scope.reloadView = function () {
$scope.viewLoaded = false;
$scope.folders = [];
listViewHelper.clearSelection($scope.listViewResultSet.items, $scope.folders, $scope.selection);
memberExtResource.getMembers($scope.options).then(function (data) {
$scope.actionInProgress = false;
$scope.listViewResultSet = data;
//update all values for display
if ($scope.listViewResultSet.items) {
_.each($scope.listViewResultSet.items, function (e, index) {
setPropertyValues(e);
});
}
$scope.viewLoaded = true;
//NOTE: This might occur if we are requesting a higher page number than what is actually available, for example
// if you have more than one page and you delete all items on the last page. In this case, we need to reset to the last
// available page and then re-load again
if ($scope.options.pageNumber > $scope.listViewResultSet.totalPages) {
$scope.options.pageNumber = $scope.listViewResultSet.totalPages;
//reload!
$scope.reloadView();
}
});
};
var searchListView = _.debounce(function () {
$scope.$apply(function () {
makeSearch();
});
}, 500);
$scope.forceSearch = function (ev) {
//13: enter
switch (ev.keyCode) {
case 13:
makeSearch();
break;
}
};
$scope.enterSearch = function () {
$scope.viewLoaded = false;
searchListView();
};
function makeSearch() {
if ($scope.options.filterData.filter !== null && $scope.options.filterData.filter !== undefined) {
$scope.options.pageNumber = 1;
$scope.getContent();
}
}
$scope.isAnythingSelected = function () {
if ($scope.selection.length === 0) {
return false;
} else {
return true;
}
};
$scope.selectedItemsCount = function () {
return $scope.selection.length;
};
$scope.clearSelection = function () {
listViewHelper.clearSelection($scope.listViewResultSet.items, $scope.folders, $scope.selection);
};
$scope.getIcon = function (entry) {
return iconHelper.convertFromLegacyIcon(entry.icon);
};
function serial(selected, fn, getStatusMsg, index) {
return fn(selected, index).then(function (content) {
index++;
$scope.bulkStatus = getStatusMsg(index, selected.length);
return index < selected.length ? serial(selected, fn, getStatusMsg, index) : content;
}, function (err) {
var reload = index > 0;
showNotificationsAndReset(err, reload);
return err;
});
}
function applySelected(fn, getStatusMsg, getSuccessMsg, confirmMsg) {
var selected = $scope.selection;
if (selected.length === 0)
return;
if (confirmMsg && !confirm(confirmMsg))
return;
$scope.actionInProgress = true;
$scope.bulkStatus = getStatusMsg(0, selected.length);
return serial(selected, fn, getStatusMsg, 0).then(function (result) {
// executes once the whole selection has been processed
// in case of an error (caught by serial), result will be the error
if (!(result.data && angular.isArray(result.data.notifications)))
showNotificationsAndReset(result, true, getSuccessMsg(selected.length));
});
}
function getCustomPropertyValue(alias, properties) {
var value = '';
var index = 0;
var foundAlias = false;
for (var i = 0; i < properties.length; i++) {
if (properties[i].alias === alias) {
foundAlias = true;
break;
}
index++;
}
if (foundAlias) {
value = properties[index].value;
}
return value;
}
/** This ensures that the correct value is set for each item in a row, we don't want to call a function during interpolation or ng-bind as performance is really bad that way */
function setPropertyValues(result) {
//set the edit url
result.editPath = createEditUrlCallback(result);
_.each($scope.options.includeProperties, function (e, i) {
var alias = e.alias;
// First try to pull the value directly from the alias (e.g. updatedBy)
var value = result[alias];
// If we have IsApproved or IsLocked, then customise the display.
if (alias === "isLockedOut") {
value = getLockedDescription(value);
}
if (alias === "isApproved") {
value = getSuspendedDescription(value);
}
// if we have an array, then concat all values separated by comma
if (Array.isArray(value) && value.length > 0) {
value = _.reduce(value, function (memo, val) { return memo + ', ' + val; });
}
// If this returns an object, look for the name property of that (e.g. owner.name)
if (value === Object(value)) {
value = value['name'];
}
// If we've got nothing yet, look at a user defined property
if (typeof value === 'undefined') {
value = getCustomPropertyValue(alias, result.properties);
}
// If we have a date, format it
if (isDate(value)) {
value = value.substring(0, value.length - 3);
}
// set what we've got on the result
result[alias] = value;
});
}
function isDate(val) {
if (angular.isString(val)) {
return val.match(/^(\d{4})\-(\d{2})\-(\d{2})\ (\d{2})\:(\d{2})\:(\d{2})$/);
}
return false;
}
function initView() {
//default to root id if the id is undefined
var id = $routeParams.id;
if (id === undefined) {
id = -1;
}
memberExtResource.getMemberGroups().then(function (groups) {
$scope.memberGroups = groups;
});
getContentTypesCallback(id).then(function (listViewAllowedTypes) {
$scope.listViewAllowedTypes = listViewAllowedTypes;
$scope.createAllowedButtonSingle = listViewAllowedTypes.length === 1;
$scope.createAllowedButtonMulti = listViewAllowedTypes.length > 1;
});
$scope.contentId = id;
$scope.isTrashed = id === "-20" || id === "-21";
if ($scope.options.allowExport) {
memberExtResource.canExport().then(function (result) {
$scope.options.allowExport = result;
});
}
$scope.options.bulkActionsAllowed = $scope.options.allowBulkDelete;
$scope.getContent();
}
function getLocalizedKey(alias) {
switch (alias) {
case "updateDate":
return "content_updateDate";
case "createDate":
return "content_createDate";
case "contentTypeAlias":
return "content_membertype";
case "email":
return "general_email";
case "username":
return "general_username";
case "memberGroups":
return "general_memberGroups";
}
return alias;
}
$scope.createBlank = function (entityType, docTypeAlias) {
$location
.path("/" + entityType + "/" + entityType + "/edit/")
.search("doctype=" + docTypeAlias + "&create=true");
};
$scope.delete = function () {
var confirmDeleteText = "";
localizationService.localize("defaultdialogs_confirmdelete")
.then(function (value) {
confirmDeleteText = value;
var attempt =
applySelected(
function (selected, index) { return deleteItemCallback(getIdCallback(selected[index])); },
function (count, total) {
var key = (total === 1 ? "bulk_deletedItemOfItem" : "bulk_deletedItemOfItems");
return localizationService.localize(key, [count, total]);
},
function (total) {
var key = (total === 1 ? "bulk_deletedItem" : "bulk_deletedItems");
return localizationService.localize(key, [total]);
},
confirmDeleteText + "?");
});
};
$scope.canUnlock = function () {
if (!angular.isArray($scope.selection)) {
return false;
}
return _.some($scope.selection, function (item) {
return !isUnlocked(item);
});
};
$scope.canApprove = function () {
if (!angular.isArray($scope.selection)) {
return false;
}
return _.some($scope.selection, function (item) {
return isSuspended(item);
});
};
$scope.canSuspend = function () {
if (!angular.isArray($scope.selection)) {
return false;
}
return _.some($scope.selection, function (item) {
return isApproved(item);
});
};
isSuspended = function (item) {
return _.some($scope.listViewResultSet.items, function (member) {
if (member.key === item.key)
return member.isApproved === 'Suspended';
return false;
});
};
isApproved = function (item) {
return _.some($scope.listViewResultSet.items, function (member) {
if (member.key === item.key)
return member.isApproved === 'Approved';
return false;
});
};
isUnlocked = function (item) {
return _.some($scope.listViewResultSet.items, function (member) {
if (member.key === item.key)
return member.isLockedOut === 'Unlocked';
return false;
});
};
getLockedIcon = function (locked) {
return locked ? 'icon-lock color-red' : 'icon-unlocked color-green';
};
getSuspendedIcon = function (approved) {
return approved ? 'icon-check color-green' : 'icon-block color-red';
};
getLockedDescription = function (locked) {
return locked ? 'Locked Out' : 'Unlocked';
};
getSuspendedDescription = function (approved) {
return approved ? 'Approved' : 'Suspended';
};
$scope.export = function () {
dialogService.closeAll();
dialogService.open({
template: '/app_plugins/MemberManager/backoffice/dialogs/member/export.html',
closeOnSave: false,
filterData: $scope.options.filterData,
memberTypes: $scope.listViewAllowedTypes,
memberGroups: $scope.memberGroups,
totalItems: $scope.listViewResultSet.totalItems,
columns: $scope.options.columns,
callback: function (columns) {
$scope.options.columns = columns;
memberExtResource.getMemberExport($scope.options);
}
});
};
$scope.unlock = function () {
var confirmUnlockText = "";
localizationService.localize("memberManager_confirmUnlock")
.then(function (value) {
confirmUnlockText = value;
let tmpSelected = $scope.selected;
$scope.selected = _.filter(tmpSelected, function (item) { return isUnlocked(item); });
var attempt =
applySelected(
function (selected, index) { return memberExtResource.unlockById(getIdCallback(selected[index])); },
function (count, total) {
var key = total === 1 ? "bulk_unlockItemOfItem" : "bulk_unlockItemOfItems";
return localizationService.localize(key, [count, total]);
},
function (total) {
var key = total === 1 ? "bulk_unlockedItem" : "bulk_unlockedItems";
return localizationService.localize(key, [total]);
},
confirmUnlockText + "?");
if (attempt) {
attempt.then(function () {
$timeout($scope.getContent, 1000);
});
}
});
};
$scope.approve = function () {
var confirmApproveText = "";
localizationService.localize("memberManager_confirmApprove")
.then(function (value) {
confirmApproveText = value;
let tmpSelected = $scope.selected;
$scope.selected = _.filter(tmpSelected, function (item) { return isApproved(item); });
var attempt =
applySelected(
function (selected, index) { return memberExtResource.approveById(getIdCallback(selected[index])); },
function (count, total) {
var key = total === 1 ? "bulk_approveItemOfItem" : "bulk_approveItemOfItems";
return localizationService.localize(key, [count, total]);
},
function (total) {
var key = total === 1 ? "bulk_approvedItem" : "bulk_approvedItems";
return localizationService.localize(key, [total]);
},
confirmApproveText + "?");
if (attempt) {
attempt.then(function () {
$timeout($scope.getContent, 1000);
});
}
});
};
$scope.suspend = function () {
var confirmSuspendText = "";
let tmpSelected = $scope.selected;
$scope.selected = _.filter(tmpSelected, function (item) { return isSuspended(item); });
localizationService.localize("memberManager_confirmSuspend")
.then(function (value) {
confirmSuspendText = value;
var attempt =
applySelected(
function (selected, index) { return memberExtResource.suspendById(getIdCallback(selected[index])); },
function (count, total) {
var key = total === 1 ? "bulk_suspendItemOfItem" : "bulk_suspendItemOfItems";
return localizationService.localize(key, [count, total]);
},
function (total) {
var key = total === 1 ? "bulk_suspendedItem" : "bulk_suspendedItems";
return localizationService.localize(key, [total]);
},
confirmSuspendText + "?");
if (attempt) {
attempt.then(function () {
$timeout($scope.getContent, 1000);
});
}
});
};
$scope.editMember = function (key) {
dialogService.closeAll();
dialogService.open({
template: '/app_plugins/MemberManager/backoffice/dialogs/member/edit.html',
key: key,
closeOnSave: true,
//tabFilter: ["Generic properties"],
callback: function (data) {
$scope.getContent();
}
});
};
$scope.clearFilter = function () {
dialogService.closeAll();
$scope.options.filterData = {
filter: null
};
//$scope.searchDisplay = null;
$scope.getContent();
};
$scope.edit = function () {
$scope.filterDialog = {};
$scope.filterDialog.title = localizationService.localize("memberManager_filter");
$scope.filterDialog.section = $scope.entityType;
$scope.filterDialog.currentNode = $scope.contentId;
$scope.filterDialog.view = "move";
$scope.filterDialog.show = true;
$scope.moveDialog.submit = function (model) {
if (model.target) {
performMove(model.target);
}
$scope.moveDialog.show = false;
$scope.moveDialog = null;
};
$scope.moveDialog.close = function (oldModel) {
$scope.moveDialog.show = false;
$scope.moveDialog = null;
};
};
$scope.filter = function () {
dialogService.closeAll();
dialogService.open({
template: '/app_plugins/MemberManager/backoffice/dialogs/member/filter.html',
closeOnSave: false,
filterData: $scope.options.filterData,
memberTypes: $scope.listViewAllowedTypes,
memberGroups: $scope.memberGroups,
callback: function (data) {
$scope.options.filterData = data;
$scope.getContent();
}
});
};
initView();
}
angular.module("umbraco").controller("MemberManager.Dashboard.MemberListViewController", memberListViewController);
@@ -0,0 +1,187 @@
<div ng-controller="MemberManager.Dashboard.MemberListViewController" class="umb-editor umb-listview membermanager clearfix">
<style>
canvas {
width: 100% !important;
max-width: 800px;
height: auto !important;
}
</style>
<div class="row-fluid">
<umb-editor-sub-header>
<umb-editor-sub-header-content-left>
<umb-editor-sub-header-section ng-if="(listViewAllowedTypes && listViewAllowedTypes.length > 0 && !isAnythingSelected()) && (currentNodePermissions == null || currentNodePermissions.canCreate)">
<div class="btn-group" ng-show="createAllowedButtonSingle">
<a class="btn" ng-click="createBlank(entityType,listViewAllowedTypes[0].alias)">
<localize key="actions_create">Create</localize> {{listViewAllowedTypes[0].name}}
</a>
</div>
<div class="btn-group" ng-show="createAllowedButtonMulti">
<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
<localize key="actions_create">Create</localize>
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li ng-repeat="contentType in listViewAllowedTypes | orderBy:'name':false">
<a href="" ng-click="createBlank(entityType,contentType.alias)" prevent-default>
<i class="{{contentType.icon}}"></i> {{contentType.name}}
</a>
</li>
</ul>
</div>
</umb-editor-sub-header-section>
<umb-editor-sub-header-section ng-if="isAnythingSelected()">
<umb-button type="button"
label="Clear selection"
label-key="buttons_clearSelection"
action="clearSelection()"
disabled="actionInProgress">
</umb-button>
</umb-editor-sub-header-section>
<umb-editor-sub-header-section ng-if="isAnythingSelected()">
<strong ng-show="!actionInProgress">{{ selectedItemsCount() }} <localize key="general_of">of</localize> {{ listViewResultSet.items.length }} <localize key="general_selected">selected</localize></strong>
<strong ng-show="actionInProgress" ng-bind="bulkStatus"></strong>
<div class="umb-loader-wrapper -bottom" ng-show="actionInProgress">
<div class="umb-loader"></div>
</div>
</umb-editor-sub-header-section>
</umb-editor-sub-header-content-left>
<umb-editor-sub-header-content-right>
<umb-editor-sub-header-section ng-if="!isAnythingSelected()">
<form class="form-search -no-margin-bottom pull-right" novalidate>
<div class="inner-addon left-addon">
<i class="icon icon-search" ng-click="enterSearch($event)"></i>
<input class="form-control search-input"
type="text"
localize="placeholder"
placeholder="@general_typeToSearch"
ng-model="options.filterData.filter"
ng-change="enterSearch()"
ng-keydown="forceSearch($event)"
prevent-enter-submit
no-dirty-check>
</div>
</form>
<umb-button type="button"
button-style="link"
label="Filter"
label-key="memberManager_filter"
icon="icon-filter"
action="filter()"
disabled="actionInProgress">
</umb-button>
<umb-button ng-if="options.filterData.display"
type="link"
button-style="link"
label="Clear Filter"
label-key="memberManager_clearFilter"
icon="icon-block"
action="clearFilter()"
disabled="actionInProgress">
</umb-button>
</umb-editor-sub-header-section>
<umb-editor-sub-header-section ng-if="options.allowExport">
<umb-button type="button"
button-style="link"
label="Export"
label-key="memberManager_exportMembers"
icon="icon-download"
action="export()"
disabled="actionInProgress">
</umb-button>
</umb-editor-sub-header-section>
<umb-editor-sub-header-section ng-if="isAnythingSelected()">
<span class="umb-status-label" ng-bind="vm.bulkStatus" ng-show="vm.isAnythingSelected()"></span>
<umb-button ng-if="canUnlock()"
type="button"
button-style="link"
label="Unlock"
label-key="actions_unlock"
icon="icon-unlocked color-green"
action="unlock()"
disabled="actionInProgress">
</umb-button>
<umb-button ng-if="canApprove()"
type="button"
button-style="link"
label="Approve"
label-key="actions_approve"
icon="icon-check color-green"
action="approve()"
disabled="actionInProgress">
</umb-button>
<umb-button ng-if="canSuspend()"
type="button"
button-style="link"
label="Suspend"
label-key="actions_suspend"
icon="icon-block color-red"
action="suspend()"
disabled="actionInProgress">
</umb-button>
<umb-button ng-if="options.allowBulkDelete"
type="button"
button-style="link"
label="Delete"
label-key="actions_delete"
icon="icon-trash color-red"
action="delete()"
disabled="actionInProgress">
</umb-button>
</umb-editor-sub-header-section>
</umb-editor-sub-header-content-right>
</umb-editor-sub-header>
</div>
<div class="row-fluid">
<div class="filter-display" ng-if="options.filterData.display">
<div ng-repeat="displayFilter in options.filterData.display">
<strong>{{displayFilter.title}}</strong>
<span>{{displayFilter.value}}</span>
</div>
</div>
</div>
<umb-list-view-layout ng-if="viewLoaded"
content-id=""
folders="folders"
items="listViewResultSet.items"
selection="selection"
options="options"
entity-type="{{entityType}}"
on-get-content="getContent">
</umb-list-view-layout>
<umb-load-indicator ng-show="!viewLoaded"></umb-load-indicator>
<div class="flex justify-center">
<umb-pagination ng-if="listViewResultSet.totalPages"
page-number="options.pageNumber"
total-pages="listViewResultSet.totalPages"
on-next="next"
on-prev="prev"
on-go-to-page="goToPage">
</umb-pagination>
</div>
<umb-overlay ng-if="ysodOverlay.show"
model="ysodOverlay"
position="right"
view="ysodOverlay.view">
</umb-overlay>
</div>
@@ -0,0 +1,149 @@
/**
* @ngdoc controller
* @name MemberManager.Dialogs.Member.EditController
* @function
*
* @description
* The controller for the member editor
*
* @param {any} $scope Scope
* @param {any} $routeParams Route Parameters
* @param {any} $q Queue
* @param {any} memberResource Member Resource
* @param {any} entityResource Entity Resource
* @param {any} serverValidationManager Server Validation Manager
* @param {any} contentEditingHelper Content Editing Helper
* @param {any} fileManager File Manager
* @param {any} formHelper Form Helper
*/
function MemberEditDialogController($scope, $routeParams, $q, memberResource, entityResource, serverValidationManager, contentEditingHelper, fileManager, formHelper) {
//setup scope vars
$scope.model = {};
$scope.model.defaultButton = null;
$scope.model.subButtons = [];
$scope.model.nodeId = 0;
$scope.loaded = false;
var dialogOptions = $scope.$parent.dialogOptions;
function performGet() {
var deferred = $q.defer();
if (angular.isObject(dialogOptions.entity)) {
$scope.loaded = true;
deferred.resolve(dialogOptions.entity);
} else {
if (dialogOptions.create) {
//we are creating so get an empty member item
memberResource.getScaffold(dialogOptions.contentType)
.then(function (data) {
$scope.loaded = true;
deferred.resolve(data);
});
}
else {
if (dialogOptions.key && dialogOptions.key.toString().length < 9) {
entityResource.getById(dialogOptions.key, "Member").then(function (entity) {
memberResource.getByKey(entity.key).then(function (data) {
//in one particular special case, after we've created a new item we redirect back to the edit
// route but there might be server validation errors in the collection which we need to display
// after the redirect, so we will bind all subscriptions which will show the server validation errors
// if there are any and then clear them so the collection no longer persists them.
serverValidationManager.executeAndClearAllSubscriptions();
$scope.loaded = true;
deferred.resolve(data);
});
});
}
else {
//we are editing so get the content item from the server
memberResource.getByKey(dialogOptions.key)
.then(function (data) {
$scope.loaded = true;
//in one particular special case, after we've created a new item we redirect back to the edit
// route but there might be server validation errors in the collection which we need to display
// after the redirect, so we will bind all subscriptions which will show the server validation errors
// if there are any and then clear them so the collection no longer persists them.
serverValidationManager.executeAndClearAllSubscriptions();
deferred.resolve(data);
});
}
}
}
return deferred.promise;
}
function performSave(args) {
var deferred = $q.defer();
$scope.busy = true;
if (formHelper.submitForm({ scope: $scope, statusMessage: args.statusMessage })) {
$scope.busy = true;
args.saveMethod($scope.model.entity, $routeParams.create, fileManager.getFiles())
.then(function (data) {
formHelper.resetForm({ scope: $scope, notifications: data.notifications });
contentEditingHelper.handleSuccessfulSave({
scope: $scope,
savedContent: data,
rebindCallback: contentEditingHelper.reBindChangedProperties($scope.model.entity, data)
});
$scope.busy = false;
deferred.resolve(data);
}, function (err) {
contentEditingHelper.handleSaveError({
redirectOnFailure: false,
err: err,
rebindCallback: contentEditingHelper.reBindChangedProperties($scope.model.entity, err.data)
});
$scope.busy = false;
deferred.reject(err);
});
} else {
$scope.busy = false;
deferred.reject();
}
return deferred.promise;
}
performGet().then(function (content) {
$scope.model.entity = $scope.filterTabs(content, dialogOptions.tabFilter);
});
$scope.filterTabs = function (entity, blackList) {
if (blackList) {
_.each(entity.tabs, function (tab) {
tab.hide = _.contains(blackList, tab.alias);
});
}
return entity;
};
$scope.save = function () {
performSave({ saveMethod: memberResource.save, statusMessage: "Saving..." })
.then(function (content) {
if (dialogOptions.closeOnSave) {
$scope.submit(content);
}
});
};
}
angular.module("umbraco").controller("MemberManager.Dialogs.Member.EditController", MemberEditDialogController);
@@ -0,0 +1,45 @@
<form novalidate name="contentForm"
ng-controller="MemberManager.Dialogs.Member.EditController"
ng-show="loaded"
ng-submit="save()"
val-form-manager>
<div class="umb-panel">
<div class="umb-panel-header">
<umb-content-name placeholder="@placeholders_entername"
ng-model="model.entity.name" />
</div>
<div class="umb-panel-body with-footer">
<div id="tab{{tab.id}}" ng-repeat="tab in model.entity.tabs">
<div class="umb-pane" ng-if="!tab.hide">
<h5>{{tab.label}}</h5>
<umb-property property="property"
ng-repeat="property in tab.properties">
<umb-editor model="property"></umb-editor>
</umb-property>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a href ng-click="close()" class="btn btn-link">
<localize key="general_close">Close</localize>
</a>
<div class="btn-group dropup">
<!-- primary button -->
<a class="btn btn-success" href="#" ng-click="save()" prevent-default>
Save
</a>
</div>
</div>
</div>
</div>
</div>
</form>
@@ -0,0 +1,116 @@
angular.module("umbraco").controller("MemberManager.Dialogs.Member.ExportController",
function ($scope, memberExtResource) {
$scope.defaultButton = null;
$scope.subButtons = [];
var dialogOptions = $scope.$parent.dialogOptions;
$scope.filterData = dialogOptions.filterData;
$scope.columns = dialogOptions.columns;
//$scope.memberType = dialogOptions.filterData.memberType;
$scope.totalItems = dialogOptions.totalItems;
$scope.memberTypes = dialogOptions.memberTypes;
$scope.format = "Excel";
$scope.allColumnsSelected = false;
function init() {
var buttons = {
defaultButton: createButtonDefinition("E"),
subButtons: []
};
$scope.defaultButton = buttons.defaultButton;
$scope.subButtons = buttons.subButtons;
memberExtResource.getMemberColumns(dialogOptions.filterData.memberType).then(function (data) {
// We use this to preserve the original filter data.
$scope.columnList = setSelected(data, $scope.columns);
$scope.allColumnsSelected = $scope.allSelected($scope.columnList);
});
}
function createButtonDefinition(ch) {
switch (ch) {
case "E":
//export action
return {
letter: ch,
labelKey: "memberManager_export",
label: "Export",
handler: $scope.export,
hotKey: "ctrl+e",
hotKeyWhenHidden: true,
alias: "export"
};
default:
return null;
}
}
// Loop through a list of select options and set selected for values that appear in a filter list
setSelected = function (list, filter) {
// Convert string arrays to a select item object.
list = _.map(list, function (item) {
if (typeof item === "string") {
let value = item;
item = {
id: value.replace(" ", "_"),
name: value,
alias: value,
selected: false
};
}
return item;
});
if (filter) {
for (var i = 0; i < filter.length; i++) {
for (var j = 0; j < list.length; j++) {
if (list[j].id === filter[i].replace(" ", "_")) {
list[j].selected = true;
}
}
}
}
return list;
};
processColumnList = function (list) {
var filteredList = _.filter(list, function (i) {
return i.selected;
});
return _.map(filteredList, function (item) {
return item.alias;
});
};
// Methods to manage select/deselect all in checkbox lists.
$scope.selectAll = function (selectionList) {
_.each(selectionList, function (item) { item.selected = $scope.allColumnsSelected; });
};
$scope.allSelected = function (selectionList) {
return _.filter(selectionList, function (item) { return item.selected; }).length === selectionList.length;
};
$scope.export = function () {
$scope.submit(processColumnList($scope.columnList));
};
// this method is called for all action buttons and then we proxy based on the btn definition
$scope.performAction = function (btn) {
if (!btn || !angular.isFunction(btn.handler)) {
throw "btn.handler must be a function reference";
}
btn.handler.apply(this);
};
init();
});
@@ -0,0 +1,90 @@
<form novalidate name="contentForm"
ng-controller="MemberManager.Dialogs.Member.ExportController"
ng-submit="export()"
val-form-manager
class="umb-mini-editor">
<div class="umb-panel">
<div class="umb-panel-header">
<h1>
<localize key="memberManager_export">Export</localize>
</h1>
</div>
<div class="umb-panel-body with-footer">
<div class="umb-pane filter-options">
<div class="umb-el-wrap">
<label class="control-label">Exportable records:</label> <span>{{totalItems}} members</span>
<div class="alert alert-warning" ng-if="totalItems > 100">Exporting a large number of members may take some time.</div>
</div>
<div class="umb-el-wrap" ng-if="filterData.display">
<label class="control-label">Applied Filters: </label>
<div class="filter-display">
<div ng-repeat="displayFilter in filterData.display">
<strong>{{displayFilter.title}}</strong>
<span>{{displayFilter.value}}</span>
</div>
</div>
</div>
<div class="umb-el-wrap filter-checkbox-list" ng-show="columnList && columnList.length > 1">
<h5>Columns</h5>
<p>Select the columns to include in the exported data</p>
<div class="filter-header">
<div>
<input type="checkbox" ng-model="allColumnsSelected" ng-click="selectAll(columnList)" id="column-all" />
<label class="control-label" for="column-all">Select / deselect all columns</label>
</div>
</div>
<div class="filter-content">
<div ng-repeat="column in columnList">
<input type="checkbox" ng-model="column.selected" id="column-{{column.id}}" />
<label class="control-label" for="column-{{column.id}}">{{column.name}}</label>
</div>
</div>
</div>
<div class="umb-el-wrap">
<label class="control-label">Format: </label>
<div class="controls controls-row">
<select ng-model="format">
<option value="Excel">Excel Spreadsheet (*.xlsx)</option>
<option value="CSV">Comma Separated Values (*.csv)</option>
</select>
</div>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a ng-click="close()" class="btn btn-link">
<localize key="general_close">Close</localize>
</a>
<div class="btn-group dropup" ng-if="defaultButton">
<!-- primary button -->
<a class="btn btn-success" href="#" ng-click="performAction(defaultButton)" prevent-default>
<localize key="{{defaultButton.labelKey}}">{{defaultButton.label}}</localize>
</a>
<a class="btn btn-success dropdown-toggle" data-toggle="dropdown" ng-if="subButtons.length > 0">
<span class="caret"></span>
</a>
<!-- sub buttons -->
<ul class="dropdown-menu bottom-up" role="menu" aria-labelledby="dLabel" ng-if="subButtons.length > 0">
<li ng-repeat="btn in subButtons">
<a href="#" ng-click="performAction(btn)" prevent-default>
<localize key="{{btn.labelKey}}">{{btn.label}}</localize>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</form>
@@ -0,0 +1,167 @@
angular.module("umbraco").controller("MemberManager.Dialogs.Member.FilterController",
function ($scope) {
$scope.defaultButton = null;
$scope.subButtons = [];
var dialogOptions = $scope.$parent.dialogOptions;
$scope.filterData = dialogOptions.filterData;
$scope.memberTypes = dialogOptions.memberTypes;
$scope.memberGroups = dialogOptions.memberGroups;
function init() {
var buttons = {
defaultButton: createButtonDefinition("F"),
subButtons: [
createButtonDefinition("C")
]
};
$scope.defaultButton = buttons.defaultButton;
$scope.subButtons = buttons.subButtons;
// We use this to preserve the original filter data.
$scope.memberGroupFilter = setSelected($scope.memberGroups, $scope.filterData.memberGroups);
}
function createButtonDefinition(ch) {
switch (ch) {
case "F":
//publish action
return {
letter: ch,
labelKey: "memberManager_applyFilter",
label: "Apply Filter",
handler: $scope.applyFilter,
hotKey: "ctrl+f",
hotKeyWhenHidden: true,
alias: "applyFilter"
};
case "C":
//send to publish
return {
letter: ch,
labelKey: "memberManager_clearFilter",
label: "Clear Filter",
handler: $scope.clearFilter,
hotKey: "ctrl+c",
hotKeyWhenHidden: true,
alias: "sendToPublish"
};
default:
return null;
}
}
// Generate model for representing the search
getFilterModel = function () {
var displaySearch = new Array();
//if ($scope.filterData.filter) {
// displaySearch.push({ title: "Search", value: $scope.filterData.filter });
//}
if ($scope.filterData.memberType) {
displaySearch.push({ title: "Member Type", value: _getMemberTypeName() });
}
if ($scope.filterData.f_umbracoMemberApproved) {
displaySearch.push({ title: "Approved", value: $scope.filterData.f_umbracoMemberApproved === "true,1" ? "Approved" : "Suspended" });
}
if ($scope.filterData.f_umbracoMemberLockedOut) {
displaySearch.push({ title: "Locked Out", value: $scope.filterData.f_umbracoMemberLockedOut === "true,1" ? "Locked Out" : "Active" });
}
return {
filter: $scope.filterData.filter,
memberType: $scope.filterData.memberType,
memberGroups: processFilterList(displaySearch, "Member Groups", $scope.memberGroupFilter),
f_umbracoMemberApproved: !$scope.filterData.f_umbracoMemberApproved ? "" : $scope.filterData.f_umbracoMemberApproved,
f_umbracoMemberLockedOut: !$scope.filterData.f_umbracoMemberLockedOut ? "" : $scope.filterData.f_umbracoMemberLockedOut,
display: displaySearch
};
};
function _getMemberTypeName() {
var type = _.filter($scope.memberTypes, function (item) {
return item.alias === $scope.filterData.memberType;
});
return _.map(type, function (item) {
return ' ' + item.name;
}).join();
}
// Loop through a list of select options and set selected for values that appear in a filter list
setSelected = function (list, filter) {
// Convert string arrays to a select item object.
list = _.map(list, function (item) {
if (typeof item === "string") {
let value = item;
item = {
id: value.replace(" ", "_"),
name: value,
alias: value,
selected: false
};
}
return item;
});
if (filter) {
for (var i = 0; i < filter.length; i++) {
for (var j = 0; j < list.length; j++) {
if (list[j].id === filter[i].replace(" ", "_")) {
list[j].selected = true;
}
}
}
}
return list;
};
processFilterList = function (display, title, list) {
var filteredList = _.filter(list, function (i) {
return i.selected;
});
var displayVal = _.map(filteredList, function (item) {
return ' ' + item.name;
}).join();
if (displayVal) {
display.push({ title: title, value: displayVal });
}
return _.map(filteredList, function (item) {
return item.alias;
});
};
$scope.applyFilter = function () {
$scope.submit(getFilterModel());
};
$scope.clearFilter = function () {
$scope.filterData = {
filter: null
};
$scope.submit($scope.filterData);
};
// this method is called for all action buttons and then we proxy based on the btn definition
$scope.performAction = function (btn) {
if (!btn || !angular.isFunction(btn.handler)) {
throw "btn.handler must be a function reference";
}
btn.handler.apply(this);
};
init();
});
@@ -0,0 +1,95 @@
<form novalidate name="contentForm"
ng-controller="MemberManager.Dialogs.Member.FilterController"
ng-submit="applyFilter()"
val-form-manager
class="umb-mini-editor">
<div class="umb-panel">
<div class="umb-panel-header">
<h1>
<localize key="memberManager_filter">Filter</localize>
</h1>
</div>
<div class="umb-panel-body with-footer">
<div class="umb-pane filter-options">
<div class="umb-property">
<label class="control-label">Search</label>
<div class="controls controls-row">
<input type="text" ng-model="filterData.filter" />
</div>
</div>
<div class="umb-el-wrap" ng-show="memberTypes && memberTypes.length > 1">
<label class="control-label">Member Type</label>
<div class="controls controls-row">
<select ng-model="filterData.memberType">
<option value="">- All -</option>
<option ng-repeat="memberType in memberTypes" ng-value="{{memberType.alias}}">{{memberType.name}}</option>
</select>
</div>
</div>
<div class="filter-checkbox-list" ng-show="memberGroupFilter && memberGroupFilter.length > 1">
<h5>Member Groups</h5>
<div class="filter-content">
<div ng-repeat="group in memberGroupFilter">
<input type="checkbox" ng-model="group.selected" id="group-{{group.id}}" />
<label class="control-label" for="group-{{group.id}}">{{group.name}}</label>
</div>
</div>
</div>
<div class="umb-el-wrap">
<label class="control-label">Approved</label>
<div class="controls controls-row">
<select ng-model="filterData.f_umbracoMemberApproved">
<option value="">- All -</option>
<option value="true,1">Approved Only</option>
<option value="false,0">Suspended Only</option>
</select>
</div>
</div>
<div class="umb-el-wrap">
<label class="control-label">Locked Out</label>
<div class="controls controls-row">
<select ng-model="filterData.f_umbracoMemberLockedOut">
<option value="">- All -</option>
<option value="true,1">Locked Out Only</option>
<option value="false,0">Active Only</option>
</select>
</div>
</div>
</div>
</div>
<div class="umb-panel-footer">
<div class="umb-el-wrap umb-panel-buttons">
<div class="btn-toolbar umb-btn-toolbar pull-right">
<a ng-click="close()" class="btn btn-link">
<localize key="general_close">Close</localize>
</a>
<div class="btn-group dropup" ng-if="defaultButton">
<!-- primary button -->
<a class="btn btn-success" href="#" ng-click="performAction(defaultButton)" prevent-default>
<localize key="{{defaultButton.labelKey}}">{{defaultButton.label}}</localize>
</a>
<a class="btn btn-success dropdown-toggle" data-toggle="dropdown" ng-if="subButtons.length > 0">
<span class="caret"></span>
</a>
<!-- sub buttons -->
<ul class="dropdown-menu bottom-up" role="menu" aria-labelledby="dLabel" ng-if="subButtons.length > 0">
<li ng-repeat="btn in subButtons">
<a href="#" ng-click="performAction(btn)" prevent-default>
<localize key="{{btn.labelKey}}">{{btn.label}}</localize>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</form>
@@ -0,0 +1,61 @@
.umb-listview.membermanager a {
text-decoration: none; }
.umb-listview.membermanager .umb-table__name {
-ms-flex: 1 1 5%;
flex: 1 1 5%;
max-width: 20%; }
.umb-listview.membermanager .no-results {
padding: 20px;
background-color: #f8f8f8;
border: 1px solid #dbdbdb;
text-align: center;
color: #999;
margin-top: 20px; }
.filter-display {
padding: 1em;
background-color: #f8f8f8;
border: 1px solid #dbdbdb;
margin-bottom: 1em; }
.filter-display > div {
overflow: auto;
margin-bottom: 5px; }
.filter-display > div:last-child {
margin-bottom: 0; }
.filter-display > div strong {
float: left;
width: 180px;
display: block; }
.filter-display > div span {
float: left;
width: auto; }
.filter-options .filter-display {
margin-bottom: 0; }
.filter-options .filter-checkbox-list {
margin-bottom: 1em; }
.filter-options .filter-checkbox-list .filter-content {
max-height: 10.4em;
overflow-y: scroll;
border: solid 1px #eee;
border-radius: .25em; }
.filter-options .filter-checkbox-list .filter-content, .filter-options .filter-checkbox-list .filter-header {
padding: .5em; }
.filter-options .filter-checkbox-list .filter-content > div, .filter-options .filter-checkbox-list .filter-header > div {
overflow: auto; }
.filter-options .filter-checkbox-list .filter-content > div input[type="checkbox"], .filter-options .filter-checkbox-list .filter-header > div input[type="checkbox"] {
float: left;
/*margin-top: 10px;*/
margin-right: 10px; }
.filter-options .filter-checkbox-list .filter-content > div label.control-label, .filter-options .filter-checkbox-list .filter-header > div label.control-label {
float: left;
margin: 0;
padding: 0;
width: auto;
width: 90%;
font-weight: 400; }
.filter-options .filter-checkbox-list .filter-header {
margin-bottom: .5em; }
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="export">Export</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="export">Export</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<language alias="en_us" intName="English (US)" localName="English (US)" lcid="" culture="en-US">
<creator>
<name>Robert Foster</name>
<link></link>
</creator>
<area alias="general">
<key alias="isApproved">Approved</key>
<key alias="isLockedOut">Locked</key>
<key alias="memberGroups">Groups</key>
</area>
<area alias="actions">
<key alias="approve">Approve</key>
<key alias="suspend">Suspend</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="clearFilter">Clear Filter</key>
</area>
<area alias="bulk">
<key alias="unlockItemOfItem">Unlocking %0% Member</key>
<key alias="unlockItemOfItems">Unlocking %0% of %1% Members</key>
<key alias="unlockedItem">Unlocked %0% Member</key>
<key alias="unlockedItems">Unlocked %0% Members</key>
<key alias="suspendItemOfItem">Suspending %0% Member</key>
<key alias="suspendItemOfItems">Suspending %0% of %1% Members</key>
<key alias="suspendedItem">Suspended %0% Member</key>
<key alias="suspendedItems">Suspended %0% Members</key>
<key alias="approveItemOfItem">Approving %0% Member</key>
<key alias="approveItemOfItems">Approving %0% of %1% Members</key>
<key alias="approvedItem">Approved %0% Member</key>
<key alias="approvedItems">Approved %0% Members</key>
</area>
<area alias="memberManager">
<key alias="filter">Filter</key>
<key alias="clearFilter">Clear Filter</key>
<key alias="exportMembers">Export Members</key>
<key alias="applyFilter">Apply Filter</key>
<key alias="confirmExport">Exporting large numbers of members may take some time. Are you sure you want to continue?</key>
<key alias="confirmUnlock">Are you sure you want to unlock the selected members?</key>
<key alias="confirmSuspend">Are you sure you want to suspend the selected members?</key>
<key alias="confirmApprove">Are you sure you want to approve the selected members?</key>
</area>
</language>
@@ -0,0 +1,12 @@
{
javascript: [
"~/App_Plugins/MemberManager/resources/member.resource.js",
"~/App_Plugins/MemberManager/backoffice/dashboard/memberListView.controller.js",
"~/App_Plugins/MemberManager/backoffice/dialogs/member/edit.controller.js",
"~/App_Plugins/MemberManager/backoffice/dialogs/member/filter.controller.js",
"~/App_Plugins/MemberManager/backoffice/dialogs/member/export.controller.js"
],
css : [
"~/App_Plugins/MemberManager/css/memberListView.css"
]
}
@@ -0,0 +1,204 @@
/**
* @ngdoc service
* @name umbraco.resources.memberExtResource
*
* @description Member Management
*
* @returns {umbraco.resources.memberExtResource} memberExtResource
*
* @param {any} $http Http Service
* @param {any} $window Window
* @param {any} umbRequestHelper Umbraco Request Helper
**/
function memberExtResource($http, $window, umbRequestHelper) {
var memberExtResource = {
approveById: function (id) {
if (!id) {
throw "id cannot be null";
}
return umbRequestHelper.resourcePromise(
$http.post("Backoffice/MemberManager/MemberApi/PostApprove?" +
umbRequestHelper.dictionaryToQueryString(
[{ id: id }])),
'Failed to approve member with id ' + id);
},
suspendById: function (id) {
if (!id) {
throw "id cannot be null";
}
return umbRequestHelper.resourcePromise(
$http.post("Backoffice/MemberManager/MemberApi/PostSuspend?" +
umbRequestHelper.dictionaryToQueryString(
[{ id: id }])),
'Failed to approve member with id ' + id);
},
unlockById: function (id) {
if (!id) {
throw "id cannot be null";
}
return umbRequestHelper.resourcePromise(
$http.post("Backoffice/MemberManager/MemberApi/PostUnlock?" +
umbRequestHelper.dictionaryToQueryString(
[{ id: id }])),
'Failed to approve member with id ' + id);
},
getMembers: function (options) {
var defaults = {
pageSize: 0,
pageNumber: 0,
filterData: { filter: null },
orderDirection: "Ascending",
orderBy: "SortOrder"
};
if (options === undefined) {
options = {};
}
//overwrite the defaults if there are any specified
angular.extend(defaults, options);
//now copy back to the options we will use
options = defaults;
//change asc/desc
if (options.orderDirection === "asc") {
options.orderDirection = "Ascending";
}
else if (options.orderDirection === "desc") {
options.orderDirection = "Descending";
}
// Create the querystring dictionary
var querystring = _filterToDictionary(options.filterData);
querystring.push({ pageNumber: options.pageNumber });
querystring.push({ pageSize: options.pageSize });
querystring.push({ orderBy: options.orderBy });
querystring.push({ orderDirection: options.orderDirection });
return umbRequestHelper.resourcePromise(
$http.get("Backoffice/MemberManager/MemberApi/GetMembers?" +
umbRequestHelper.dictionaryToQueryString(querystring)),
'Failed to retrieve members');
},
getMemberExport: function (options) {
var defaults = {
filterData: { filter: null },
orderDirection: "Ascending",
orderBy: "SortOrder",
format: "Excel",
columns: null
};
if (options === undefined) {
options = {};
}
//overwrite the defaults if there are any specified
angular.extend(defaults, options);
//now copy back to the options we will use
options = defaults;
//change asc/desc
if (options.orderDirection === "asc") {
options.orderDirection = "Ascending";
}
else if (options.orderDirection === "desc") {
options.orderDirection = "Descending";
}
// Create the querystring dictionary
var querystring = _filterToDictionary(options.filterData);
querystring.push({ orderBy: options.orderBy });
querystring.push({ orderDirection: options.orderDirection });
querystring.push({ format: options.format });
querystring.push({ columns: options.columns });
var config = { responseType: 'blob' };
// Solution taken from http://jaliyaudagedara.blogspot.com/2016/05/angularjs-download-files-by-sending.html
$http.get("Backoffice/MemberManager/MemberApi/GetMembersExport?" + umbRequestHelper.dictionaryToQueryString(querystring),
config).success(function (data, status, headers) {
headers = headers();
try {
var filename = headers['x-filename'];
if (!filename) {
var result = headers['content-disposition'].split(';')[1].trim().split('=')[1];
filename = result.replace(/"/g, '');
}
var contentType = headers['content-type'];
var linkElement = document.createElement('a');
var blob = new Blob([data], { type: contentType });
var url = window.URL.createObjectURL(blob);
linkElement.setAttribute('href', url);
linkElement.setAttribute("download", filename);
var clickEvent = new MouseEvent("click", {
"view": window,
"bubbles": true,
"cancelable": false
});
linkElement.dispatchEvent(clickEvent);
} catch (ex) {
console.log(ex);
}
}).error(function (data) {
console.log(data);
});
},
getMemberGroups: function () {
return umbRequestHelper.resourcePromise(
$http.get("Backoffice/MemberManager/MemberApi/GetMemberGroups"),
'Failed to retrieve groups');
},
getMemberColumns: function (memberType) {
if (memberType === undefined || memberType === null) {
return umbRequestHelper.resourcePromise(
$http.get("Backoffice/MemberManager/MemberApi/GetMemberColumns"),
'Failed to retrieve groups');
} else {
return umbRequestHelper.resourcePromise(
$http.get("Backoffice/MemberManager/MemberApi/GetMemberColumns?memberType=" + memberType),
'Failed to retrieve groups');
}
},
canExport: function () {
return umbRequestHelper.resourcePromise(
$http.get("Backoffice/MemberManager/MemberApi/GetCanExport"),
false);
}
};
function _filterToDictionary(filter) {
if (!filter)
return;
var dict = [];
for (prop in filter) {
if (filter.hasOwnProperty(prop) &&
filter[prop] &&
(prop.startsWith('f_') || prop === 'filter' || prop === 'memberType' || prop === 'memberGroups') &&
filter[prop].length > 0) {
// Add a new dictionary entry.
var entry = {};
entry[prop] = filter[prop];
dict.push(entry);
}
}
return dict;
}
return memberExtResource;
}
angular.module('umbraco.resources').factory('memberExtResource', memberExtResource);
+1 -1
View File
@@ -10,7 +10,7 @@ NOTES:
* Compression/Combination/Minification is not enabled unless debug="false" is specified on the 'compiliation' element in the web.config
* A new version will invalidate both client and server cache and create new persisted files
-->
<clientDependency version="1325334497" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<clientDependency version="2026732746" fileDependencyExtensions=".js,.css" loggerType="Umbraco.Web.UI.CdfLogger, umbraco">
<!--
This section is used for Web Forms only, the enableCompositeFiles="true" is optional and by default is set to true.
+10 -11
View File
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<dashBoard>
<section alias="StartupSettingsDashboardSection">
<areas>
<area>settings</area>
@@ -11,7 +10,6 @@
</control>
</tab>
</section>
<section alias="StartupFormsDashboardSection">
<areas>
<area>forms</area>
@@ -22,7 +20,6 @@
</control>
</tab>
</section>
<section alias="StartupDeveloperDashboardSection">
<areas>
<area>developer</area>
@@ -38,7 +35,6 @@
</control>
</tab>
</section>
<section alias="StartupMediaDashboardSection">
<areas>
<area>media</area>
@@ -48,9 +44,7 @@
views/dashboard/media/mediafolderbrowser.html
</control>
</tab>
</section>
<section alias="StartupDashboardSection">
<access>
<deny>translator</deny>
@@ -62,14 +56,11 @@
<access>
<grant>admin</grant>
</access>
<control showOnce="true" addPanel="true" panelCaption="">
views/dashboard/default/startupdashboardintro.html
</control>
</tab>
</section>
<section alias="StartupMemberDashboardSection">
<areas>
<area>member</area>
@@ -80,7 +71,6 @@
</control>
</tab>
</section>
<section alias="UmbracoModelsBuilder">
<areas>
<area>developer</area>
@@ -91,7 +81,6 @@
</control>
</tab>
</section>
<section alias="UmbracoHealthCheck">
<areas>
<area>developer</area>
@@ -112,4 +101,14 @@
</control>
</tab>
</section>
<section alias="MemberManagerDashboardSection">
<areas>
<area>member</area>
</areas>
<tab caption="Manage">
<control showOnce="false" addPanel="false" panelCaption="">
/app_plugins/MemberManager/backoffice/dashboard/memberListView.html
</control>
</tab>
</section>
</dashBoard>