From 2313b8347ecb3ab7af059b557a17e33865910622 Mon Sep 17 00:00:00 2001
From: Robert Anderson <randerson@lbsd.net>
Date: Wed, 13 May 2009 14:44:15 +0000
Subject: [PATCH] Some support for listing group members Cosmetic changes

---
 webgui/ajax.php                               |  39 ++-
 .../ajax/functions/AdminGroupMembers.php      | 104 ++++++++
 webgui/index.html                             |  13 +-
 webgui/js/app/windows/AdminGroupMembers.js    | 251 ++++++++++++++++++
 4 files changed, 399 insertions(+), 8 deletions(-)
 create mode 100644 webgui/include/ajax/functions/AdminGroupMembers.php
 create mode 100644 webgui/js/app/windows/AdminGroupMembers.js

diff --git a/webgui/ajax.php b/webgui/ajax.php
index 46e94277..8b94870b 100644
--- a/webgui/ajax.php
+++ b/webgui/ajax.php
@@ -2,14 +2,18 @@
 
 	# Requires / Includes
 	include_once("include/ajax/json.php");
+
 	include_once("include/ajax/functions/AdminUsers.php");
+	include_once("include/ajax/functions/AdminUserAttributes.php");
+	include_once("include/ajax/functions/AdminUserGroups.php");
+
 	include_once("include/ajax/functions/AdminGroups.php");
+	include_once("include/ajax/functions/AdminGroupAttributes.php");
+	include_once("include/ajax/functions/AdminGroupMembers.php");
+
 	include_once("include/ajax/functions/AdminRealms.php");
 	include_once("include/ajax/functions/WiSPLocations.php");
 	include_once("include/ajax/functions/WiSPUsers.php");
-	include_once("include/ajax/functions/AdminUserAttributes.php");
-	include_once("include/ajax/functions/AdminUserGroups.php");
-	include_once("include/ajax/functions/AdminGroupAttributes.php");
 
 	define('RES_OK',0);
 	define('RES_ERR',-1);
@@ -151,7 +155,34 @@
 
 	switch ($function) {
 
-		# getAdminUserLogs.js functions
+		# AdminGroupMembers.js functions
+		case "getAdminGroupMembers":
+
+			$res = getAdminGroupMembers($soapParams);
+			$rawData = $res[0]; $numResults = $res[1];
+
+			$res = new json_response;
+			$res->setID('ID');
+			$res->addField('ID','int');
+			$res->addField('Name','string');
+			$res->addField('Disabled','boolean');
+			$res->parseArray($rawData);
+			$res->setDatasetSize($numResults);
+
+			echo json_encode($res->export());
+
+			break;
+
+		case "removeAdminGroupMember":
+
+			$res = removeAdminGroupMember($soapParams);
+			if (isset($res)) {
+				ajaxException($res);
+			}
+
+			break;
+
+		# AdminUserLogs.js functions
 		case "getAdminUserLogs":
 
 			$rawData = getAdminUserLogs($soapParams);
diff --git a/webgui/include/ajax/functions/AdminGroupMembers.php b/webgui/include/ajax/functions/AdminGroupMembers.php
new file mode 100644
index 00000000..e99d1ea6
--- /dev/null
+++ b/webgui/include/ajax/functions/AdminGroupMembers.php
@@ -0,0 +1,104 @@
+<?php
+
+include_once("include/db.php");
+
+# Add group attribute
+function addAdminGroupMember($params) {
+	global $db;
+
+	$res = DBDo("INSERT INTO group_attributes (GroupID,Name) VALUES (?,?)",array($params[0]['GroupID'],$params[0]['Name']));
+	if (!is_numeric($res)) {
+		return $res;
+	}
+
+	return NULL;
+}
+
+# Remove group attribute
+function removeAdminGroupMember($params) {
+	global $db;
+
+	$res = DBDo("DELETE FROM users_to_groups WHERE ID = ?",array($params[0]));
+	if (!is_numeric($res)) {
+		return $res;
+	}
+
+	return NULL;
+}
+
+# Edit attribute
+function updateAdminGroupMember($params) {
+	global $db;
+
+	$res = DBDo("UPDATE group_attributes SET Name = ? WHERE ID = ?",array($params[0]['Name'],$params[0]['ID']));
+	if (!is_numeric($res)) {
+		return $res;
+	}
+
+	return NULL;
+}
+
+# Return specific attribute row
+function getAdminGroupMember($params) {
+	global $db;
+
+
+	$res = DBSelect("SELECT ID, Name FROM group_attributes WHERE ID = ?",array($params[0]));
+	if (!is_object($res)) {
+		return $res;
+	}
+
+	$resultArray = array();
+
+	$row = $res->fetchObject();
+
+	$resultArray['ID'] = $row->id;
+	$resultArray['Name'] = $row->name;
+
+	return $resultArray;
+}
+
+# Return list of attributes
+function getAdminGroupMembers($params) {
+	global $db;
+
+	# Filters and sorts are the same here
+	$filtersorts = array(
+		'ID' => 'users_to_groups.ID',
+		'Name' => 'group_attributes.Name',
+		'Disabled' => 'group_attributes.Disabled'
+	);
+
+	$res = DBSelectSearch("
+			SELECT 
+				ID, Name, Operator, Value, Disabled 
+			FROM 
+				group_attributes 
+			WHERE 
+				GroupID = ".DBQuote($params[0])."
+		",$params[1],$filtersorts,$filtersorts);
+
+	$sth = $res[0]; $numResults = $res[1];
+	# If STH is blank, return the error back to whoever requested the data
+	if (!isset($sth)) {
+		return $res;
+	}
+
+	$resultArray = array();
+
+	# loop through rows
+	while ($row = $sth->fetchObject()) {
+		$item = array();
+
+		$item['ID'] = $row->id;
+		$item['Name'] = $row->name;
+		$item['Disabled'] = $row->disabled;
+
+		# push this row onto array
+		array_push($resultArray,$item);
+	}
+
+	return array($resultArray,$numResults);
+}
+
+?>
diff --git a/webgui/index.html b/webgui/index.html
index ecb611db..d41668f9 100644
--- a/webgui/index.html
+++ b/webgui/index.html
@@ -69,19 +69,24 @@
 	<script type="text/javascript" src="js/app/menus.js"></script>
 
 	<script type="text/javascript">document.getElementById('loading-msg').innerHTML = 'Windows...';</script>
-	<script type="text/javascript" src="js/app/windows/WiSPResellers.js"></script>
 	<script type="text/javascript" src="js/app/windows/WiSPUsers.js"></script>
 	<script type="text/javascript" src="js/app/windows/WiSPUserLogs.js"></script>
 	<script type="text/javascript" src="js/app/windows/WiSPUserTopups.js"></script>
+
 	<script type="text/javascript" src="js/app/windows/WiSPLocations.js"></script>
-	<script type="text/javascript" src="js/app/windows/AdminUsers.js"></script>
-	<script type="text/javascript" src="js/app/windows/AdminGroups.js"></script>
-	<script type="text/javascript" src="js/app/windows/AdminGroupAttributes.js"></script>
+	<script type="text/javascript" src="js/app/windows/WiSPResellers.js"></script>
 	<script type="text/javascript" src="js/app/windows/AdminRealms.js"></script>
+
+	<script type="text/javascript" src="js/app/windows/AdminUsers.js"></script>
 	<script type="text/javascript" src="js/app/windows/AdminUserLogs.js"></script>
 	<script type="text/javascript" src="js/app/windows/AdminUserAttributes.js"></script>
 	<script type="text/javascript" src="js/app/windows/AdminUserGroups.js"></script>
 
+	<script type="text/javascript" src="js/app/windows/AdminGroups.js"></script>
+	<script type="text/javascript" src="js/app/windows/AdminGroupAttributes.js"></script>
+	<script type="text/javascript" src="js/app/windows/AdminGroupMembers.js"></script>
+
+
 	<script type="text/javascript">document.getElementById('loading-msg').innerHTML = 'Layout...';</script>
 	<script type="text/javascript" src="js/app/main-layout.js"></script>
 
diff --git a/webgui/js/app/windows/AdminGroupMembers.js b/webgui/js/app/windows/AdminGroupMembers.js
new file mode 100644
index 00000000..d8f840f9
--- /dev/null
+++ b/webgui/js/app/windows/AdminGroupMembers.js
@@ -0,0 +1,251 @@
+
+
+function showAdminGroupMembersWindow(groupID) {
+
+	var AdminGroupMembersWindow = new Ext.ux.GenericGridWindow(
+		// Window config
+		{
+			title: "Members",
+			
+			width: 600,
+			height: 335,
+		
+			minWidth: 600,
+			minHeight: 335,
+		},
+		// Grid config
+		{
+			// Inline toolbars
+			tbar: [
+				{
+					text:'Add',
+					tooltip:'Add member',
+					iconCls:'add',
+					handler: function() {
+						showAdminGroupMemberAddEditWindow(groupID);
+					}
+				}, 
+				'-', 
+				{
+					text:'Edit',
+					tooltip:'Edit member',
+					iconCls:'edit',
+					handler: function() {
+						var selectedItem = AdminGroupMembersWindow.getComponent('gridpanel').getSelectionModel().getSelected();
+						// Check if we have selected item
+						if (selectedItem) {
+							// If so display window
+							showAdminGroupMemberAddEditWindow(groupID,selectedItem.data.ID);
+						} else {
+							AdminGroupMembersWindow.getEl().mask();
+
+							// Display error
+							Ext.Msg.show({
+								title: "Nothing selected",
+								msg: "No member selected",
+								icon: Ext.MessageBox.ERROR,
+								buttons: Ext.Msg.CANCEL,
+								modal: false,
+								fn: function() {
+									AdminGroupMembersWindow.getEl().unmask();
+								}
+							});
+						}
+					}
+				},
+				'-', 
+				{
+					text:'Remove',
+					tooltip:'Remove member',
+					iconCls:'remove',
+					handler: function() {
+						var selectedItem = AdminGroupMembersWindow.getComponent('gridpanel').getSelectionModel().getSelected();
+						// Check if we have selected item
+						if (selectedItem) {
+							// If so display window
+							showAdminGroupMemberRemoveWindow(AdminGroupMembersWindow,selectedItem.data.ID);
+						} else {
+							AdminGroupMembersWindow.getEl().mask();
+
+							// Display error
+							Ext.Msg.show({
+								title: "Nothing selected",
+								msg: "No member selected",
+								icon: Ext.MessageBox.ERROR,
+								buttons: Ext.Msg.CANCEL,
+								modal: false,
+								fn: function() {
+									AdminGroupMembersWindow.getEl().unmask();
+								}
+							});
+						}
+					}
+				}
+			],
+			// Column model
+			colModel: new Ext.grid.ColumnModel([
+				{
+					id: 'ID',
+					header: "ID",
+					sortable: true,
+					dataIndex: 'ID'
+				},
+				{
+					header: "Name",
+					sortable: true,
+					dataIndex: 'Name'
+				},
+				{
+					header: "Disabled",
+					sortable: true,
+					dataIndex: 'Disabled'
+				}
+			]),
+			autoExpandColumn: 'Name'
+		},
+		// Store config
+		{
+			baseParams: {
+				ID: groupID,
+				SOAPUsername: globalConfig.soap.username,
+				SOAPPassword: globalConfig.soap.password,
+				SOAPAuthType: globalConfig.soap.authtype,
+				SOAPModule: 'AdminGroupMembers',
+				SOAPFunction: 'getAdminGroupMembers',
+				SOAPParams: 'ID,__search'
+			}
+		},
+		// Filter config
+		{
+			filters: [
+				{type: 'numeric',  dataIndex: 'ID'},
+				{type: 'string',  dataIndex: 'Name'},
+				{type: 'boolean', dataIndex: 'Disabled'}
+			]
+		}
+	);
+
+	AdminGroupMembersWindow.show();
+}
+
+
+// Display edit/add form
+function showAdminGroupMemberAddEditWindow(groupID,userID) {
+
+	var submitAjaxConfig;
+
+
+	// We doing an update
+	if (userID) {
+		submitAjaxConfig = {
+			ID: userID,
+			SOAPFunction: 'updateAdminGroupMember',
+			SOAPParams: 
+				'0:ID,'+
+				'0:Name'
+		};
+
+	// We doing an Add
+	} else {
+		submitAjaxConfig = {
+			GroupID: groupID,
+			SOAPFunction: 'addAdminGroupMember',
+			SOAPParams: 
+				'0:GroupID,'+
+				'0:Name'
+		};
+	}
+	
+	// Create window
+	var adminGroupMembersFormWindow = new Ext.ux.GenericFormWindow(
+		// Window config
+		{
+			title: "Member Information",
+
+			width: 475,
+			height: 260,
+
+			minWidth: 475,
+			minHeight: 260
+		},
+		// Form panel config
+		{
+			labelWidth: 85,
+			baseParams: {
+				SOAPUsername: globalConfig.soap.username,
+				SOAPPassword: globalConfig.soap.password,
+				SOAPAuthType: globalConfig.soap.authtype,
+				SOAPModule: 'AdminGroupMembers'
+			},
+			items: [
+				{
+					fieldLabel: 'Name',
+					name: 'Name',
+					vtype: 'usernamePart',
+					maskRe: usernamePartRe,
+					allowBlank: false
+				},
+			],
+		},
+		// Submit button config
+		submitAjaxConfig
+	);
+
+	adminGroupMembersFormWindow.show();
+
+	if (userID) {
+		adminGroupMembersFormWindow.getComponent('formpanel').load({
+			params: {
+				ID: userID,
+				SOAPUsername: globalConfig.soap.username,
+				SOAPPassword: globalConfig.soap.password,
+				SOAPAuthType: globalConfig.soap.authtype,
+				SOAPModule: 'AdminGroupMembers',
+				SOAPFunction: 'getAdminGroupMember',
+				SOAPParams: 'ID'
+			}
+		});
+	}
+}
+
+
+
+
+// Display remove form
+function showAdminGroupMemberRemoveWindow(parent,id) {
+	// Mask parent window
+	parent.getEl().mask();
+
+	// Display remove confirm window
+	Ext.Msg.show({
+		title: "Confirm removal",
+		msg: "Are you very sure you wish to remove this member?",
+		icon: Ext.MessageBox.ERROR,
+		buttons: Ext.Msg.YESNO,
+		modal: false,
+		fn: function(buttonId,text) {
+			// Check if user clicked on 'yes' button
+			if (buttonId == 'yes') {
+
+				// Do ajax request
+				uxAjaxRequest(parent,{
+					params: {
+						ID: id,
+						SOAPUsername: globalConfig.soap.username,
+						SOAPPassword: globalConfig.soap.password,
+						SOAPAuthType: globalConfig.soap.authtype,
+						SOAPModule: 'AdminGroupMembers',
+						SOAPFunction: 'removeAdminGroupMember',
+						SOAPParams: 'ID'
+					}
+				});
+
+
+			// Unmask if user answered no
+			} else {
+				parent.getEl().unmask();
+			}
+		}
+	});
+}
+
-- 
GitLab