+
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.controller.js b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.controller.js
new file mode 100644
index 0000000..41895ff
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.controller.js
@@ -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);
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.html b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.html
new file mode 100644
index 0000000..e90ae82
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/edit.html
@@ -0,0 +1,45 @@
+
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.controller.js b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.controller.js
new file mode 100644
index 0000000..f5bbdad
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.controller.js
@@ -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();
+ });
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.html b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.html
new file mode 100644
index 0000000..1f0b2ee
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/export.html
@@ -0,0 +1,90 @@
+
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.controller.js b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.controller.js
new file mode 100644
index 0000000..b769272
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.controller.js
@@ -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();
+ });
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.html b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.html
new file mode 100644
index 0000000..9eaf774
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/backoffice/dialogs/member/filter.html
@@ -0,0 +1,95 @@
+
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/css/memberListView.css b/WebCms/App_Plugins/MemberManager/css/memberListView.css
new file mode 100644
index 0000000..f975bd9
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/css/memberListView.css
@@ -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; }
diff --git a/WebCms/App_Plugins/MemberManager/lang/cs.xml b/WebCms/App_Plugins/MemberManager/lang/cs.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/cs.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/da.xml b/WebCms/App_Plugins/MemberManager/lang/da.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/da.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/de.xml b/WebCms/App_Plugins/MemberManager/lang/de.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/de.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/en-gb.xml b/WebCms/App_Plugins/MemberManager/lang/en-gb.xml
new file mode 100644
index 0000000..4aa7515
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/en-gb.xml
@@ -0,0 +1,43 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Export
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/en-us.xml b/WebCms/App_Plugins/MemberManager/lang/en-us.xml
new file mode 100644
index 0000000..6d9c39c
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/en-us.xml
@@ -0,0 +1,43 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Export
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/es.xml b/WebCms/App_Plugins/MemberManager/lang/es.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/es.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/fr.xml b/WebCms/App_Plugins/MemberManager/lang/fr.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/fr.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/he.xml b/WebCms/App_Plugins/MemberManager/lang/he.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/he.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/it.xml b/WebCms/App_Plugins/MemberManager/lang/it.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/it.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/ja.xml b/WebCms/App_Plugins/MemberManager/lang/ja.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/ja.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/ko.xml b/WebCms/App_Plugins/MemberManager/lang/ko.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/ko.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/nb.xml b/WebCms/App_Plugins/MemberManager/lang/nb.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/nb.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/nl.xml b/WebCms/App_Plugins/MemberManager/lang/nl.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/nl.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/pl.xml b/WebCms/App_Plugins/MemberManager/lang/pl.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/pl.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/pt.xml b/WebCms/App_Plugins/MemberManager/lang/pt.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/pt.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/ru.xml b/WebCms/App_Plugins/MemberManager/lang/ru.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/ru.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/sv.xml b/WebCms/App_Plugins/MemberManager/lang/sv.xml
new file mode 100644
index 0000000..e28a187
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/sv.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/tr.xml b/WebCms/App_Plugins/MemberManager/lang/tr.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/tr.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/zh-tw.xml b/WebCms/App_Plugins/MemberManager/lang/zh-tw.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/zh-tw.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/lang/zh.xml b/WebCms/App_Plugins/MemberManager/lang/zh.xml
new file mode 100644
index 0000000..9729a05
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/lang/zh.xml
@@ -0,0 +1,42 @@
+
+
+
+ Robert Foster
+
+
+
+ Approved
+ Locked
+ Groups
+
+
+ Approve
+ Suspend
+ Apply Filter
+ Clear Filter
+
+
+ Unlocking %0% Member
+ Unlocking %0% of %1% Members
+ Unlocked %0% Member
+ Unlocked %0% Members
+ Suspending %0% Member
+ Suspending %0% of %1% Members
+ Suspended %0% Member
+ Suspended %0% Members
+ Approving %0% Member
+ Approving %0% of %1% Members
+ Approved %0% Member
+ Approved %0% Members
+
+
+ Filter
+ Clear Filter
+ Export Members
+ Apply Filter
+ Exporting large numbers of members may take some time. Are you sure you want to continue?
+ Are you sure you want to unlock the selected members?
+ Are you sure you want to suspend the selected members?
+ Are you sure you want to approve the selected members?
+
+
diff --git a/WebCms/App_Plugins/MemberManager/package.manifest b/WebCms/App_Plugins/MemberManager/package.manifest
new file mode 100644
index 0000000..6882e0b
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/package.manifest
@@ -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"
+ ]
+}
\ No newline at end of file
diff --git a/WebCms/App_Plugins/MemberManager/resources/member.resource.js b/WebCms/App_Plugins/MemberManager/resources/member.resource.js
new file mode 100644
index 0000000..40257e5
--- /dev/null
+++ b/WebCms/App_Plugins/MemberManager/resources/member.resource.js
@@ -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);
diff --git a/WebCms/Config/ClientDependency.config b/WebCms/Config/ClientDependency.config
index 16400b3..08f9584 100644
--- a/WebCms/Config/ClientDependency.config
+++ b/WebCms/Config/ClientDependency.config
@@ -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
-->
-
+