[evolvis-commits] r18216: [#2942] Rewrite Site-Admin Group List page

mirabilos at evolvis.org mirabilos at evolvis.org
Fri Mar 30 17:44:48 CEST 2012


Author: mirabilos
Date: 2012-03-30 17:44:48 +0200 (Fri, 30 Mar 2012)
New Revision: 18216

Modified:
   trunk/gforge_base/evolvisforge-5.1/src/debian/changelog
   trunk/gforge_base/evolvisforge-5.1/src/www/admin/grouplist.php
Log:
[#2942] Rewrite Site-Admin Group List page

The new one is both legible and fixed. It uses EvolvisTable and
DatePicker in addition to my HTML and escaping utilities, and
does sorting in PHP space, but correctly. And it can reverse!


Modified: trunk/gforge_base/evolvisforge-5.1/src/debian/changelog
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/debian/changelog	2012-03-30 15:44:43 UTC (rev 18215)
+++ trunk/gforge_base/evolvisforge-5.1/src/debian/changelog	2012-03-30 15:44:48 UTC (rev 18216)
@@ -31,8 +31,9 @@
   * Display [#nnn] links in Tracker mails correctly and use permalinks
   * [#2946] Correctly unencode entities before sending out mails
   * Tracker: multi-line Item Description and Comments handled correctly
+  * [#2942] Rewrite Site-Admin Group List page
 
- -- Thorsten Glaser <t.glaser at tarent.de>  Fri, 30 Mar 2012 15:22:51 +0200
+ -- Thorsten Glaser <t.glaser at tarent.de>  Fri, 30 Mar 2012 17:40:56 +0200
 
 fusionforge (5.1.1+evolvis49) unstable; urgency=low
 

Modified: trunk/gforge_base/evolvisforge-5.1/src/www/admin/grouplist.php
===================================================================
--- trunk/gforge_base/evolvisforge-5.1/src/www/admin/grouplist.php	2012-03-30 15:44:43 UTC (rev 18215)
+++ trunk/gforge_base/evolvisforge-5.1/src/www/admin/grouplist.php	2012-03-30 15:44:48 UTC (rev 18216)
@@ -1,8 +1,11 @@
 <?php
-/**
- * List of all groups in the system. 
+/*-
+ * List of all groups on the forge.
  *
- * Copyright 1999-2000 (c) The SourceForge Crew
+ * Copyright © 2012
+ *	Thorsten Glaser <t.glaser at tarent.de>
+ * Copyright © 1999-2000 The SourceForge Crew
+ * All rights reserved.
  *
  * This file is part of FusionForge. FusionForge is free software;
  * you can redistribute it and/or modify it under the terms of the
@@ -22,152 +25,187 @@
 
 require_once('../env.inc.php');
 require_once $gfcommon.'include/pre.php';
+require_once $gfcommon.'include/datepick.php';
 require_once $gfwww.'admin/admin_utils.php';
 
-site_admin_header(array('title'=>_('Project List')));
+$tcolnames = array(
+	_('Project Name (click to edit)'),
+	_('Register Time'),
+	_('Unix name'),
+	_('Status'),
+	_('Public?'),
+	_('Licence'),
+	_('Members#'),
+	_('Template?'),
+    );
 
-$sortorder = getStringFromRequest('sortorder');
+$tcolids = array(
+	'group_name',
+	'register_time',
+	'unix_group_name',
+	'status',
+	'is_public',
+	'license_name',
+	'members',
+	'is_template',
+    );
+
 $group_name_search = getStringFromRequest('group_name_search');
 $status = getStringFromRequest('status');
+$sortorder = getStringFromRequest('sortorder');
+$sortorder = in_array($sortorder, $tcolids) ? $sortorder : 'unix_group_name';
+$sortrev = getIntFromRequest('sortrev');
 
-$sortorder = util_ensure_value_in_set ($sortorder,
-				       array ('group_name',
-					      'register_time',
-					      'unix_group_name',
-					      'status',
-					      'is_public',
-					      'license_name',
-					      'members',
-					      'is_template')) ;
-
-$sqlsortorder = $sortorder;
-
-if ($sortorder == 'is_public') {
-	$sortorder = 'group_name' ;
-} elseif ($sortorder == 'is_template') {
-	$sortorder = 'is_template DESC' ;
+if (USE_PFO_RBAC) {
+	$ra = RoleAnonymous::getInstance();
+	$qpa = db_construct_qpa(false, '
+		SELECT group_name, register_time, unix_group_name,
+		    groups.group_id, groups.is_template, status, license_name,
+		    COUNT(DISTINCT(pfo_user_role.user_id)) AS members
+		FROM groups
+		LEFT OUTER JOIN pfo_role
+			ON pfo_role.home_group_id = groups.group_id
+		LEFT OUTER JOIN pfo_user_role
+			ON pfo_user_role.role_id = pfo_role.role_id
+		    , licenses
+		WHERE
+			license_id = license
+	    ');
+} else {
+	$qpa = db_construct_qpa(false, '
+		SELECT group_name, register_time, unix_group_name,
+		    groups.group_id, groups.is_public, groups.is_template,
+		    status, license_name,
+		    COUNT(user_group.group_id) AS members
+		FROM groups
+		LEFT JOIN user_group
+			ON user_group.group_id = groups.group_id
+		    , licenses
+		WHERE
+			license_id = license
+	    ');
 }
+if ($group_name_search) {
+	$qpa = db_construct_qpa($qpa, '
+		AND lower(group_name) LIKE $1
+	    ', array(
+		strtolower($group_name_search . '%'),
+	    ));
+} else if ($status) {
+	$qpa = db_construct_qpa($qpa, '
+		AND status = $1
+	    ', array(
+		$status,
+	    ));
+}
+if (USE_PFO_RBAC) {
+	$qpa = db_construct_qpa($qpa, '
+		GROUP BY group_name, register_time, unix_group_name,
+		    groups.group_id,
+		    groups.is_template, status, license_name
+	    ');
+} else {
+	$qpa = db_construct_qpa($qpa, '
+		GROUP BY group_name, register_time, unix_group_name,
+		    groups.group_id, groups.is_public,
+		    groups.is_template, status, license_name
+	    ');
+}
+$res = db_query_qpa($qpa);
 
-if ($group_name_search != '') {
-	echo "<p>"._('Projects that begin with'). " <strong>".$group_name_search."</strong></p>\n";
+$rows = array();
+while (($grp = db_fetch_array($res))) {
 	if (USE_PFO_RBAC) {
-		$res = db_query_params ('SELECT group_name,register_time,unix_group_name,groups.group_id,groups.is_template,status,license_name,COUNT(DISTINCT(pfo_user_role.user_id)) AS members FROM groups LEFT OUTER JOIN pfo_role ON pfo_role.home_group_id=groups.group_id LEFT OUTER JOIN pfo_user_role ON pfo_user_role.role_id=pfo_role.role_id, licenses WHERE license_id=license AND lower(group_name) LIKE $1 GROUP BY group_name,register_time,unix_group_name,groups.group_id,groups.is_template,status,license_name ORDER BY '.$sqlsortorder,
-					array (strtolower ("$group_name_search%"))) ;
-	} else {
-	$res = db_query_params ('SELECT group_name,register_time,unix_group_name,groups.group_id,groups.is_public,groups.is_template,status,license_name,COUNT(user_group.group_id) AS members
-FROM groups
-LEFT JOIN user_group ON user_group.group_id=groups.group_id, licenses
-WHERE license_id=license
-AND lower(group_name) LIKE $1
-GROUP BY group_name,register_time,unix_group_name,groups.group_id,groups.is_public,groups.is_template,status,license_name
-ORDER BY '.$sortorder,
-				array (strtolower ("$group_name_search%"))) ;
+		$grp['is_public'] = $ra->hasPermission('project_read',
+		    $grp['group_id']) ? 1 : 0;
 	}
-} else {
-	if (USE_PFO_RBAC) {
-		$qpa = db_construct_qpa (false, 'SELECT group_name,register_time,unix_group_name,groups.group_id,groups.is_template,status,license_name,COUNT(DISTINCT(pfo_user_role.user_id)) AS members FROM groups LEFT OUTER JOIN pfo_role ON pfo_role.home_group_id=groups.group_id LEFT OUTER JOIN pfo_user_role ON pfo_user_role.role_id=pfo_role.role_id, licenses WHERE license_id=license') ;
-		if ($status) {
-			$qpa = db_construct_qpa ($qpa, ' AND status=$1', array ($status)) ;
-		}
-		$qpa = db_construct_qpa ($qpa, ' GROUP BY group_name,register_time,unix_group_name,groups.group_id,groups.is_template,status,license_name ORDER BY '.$sqlsortorder) ;
-		$res = db_query_qpa ($qpa) ;
-	} else {
-		$qpa = db_construct_qpa (false, 'SELECT group_name,register_time,unix_group_name,groups.group_id,groups.is_public,groups.is_template,status,license_name,COUNT(user_group.group_id) AS members
-FROM groups
-LEFT JOIN user_group ON user_group.group_id=groups.group_id, licenses
-WHERE license_id=license',
-					 array ()) ;
-		if ($status) {
-			$qpa = db_construct_qpa ($qpa, ' AND status=$1', array ($status)) ;
-		}
-		$qpa = db_construct_qpa ($qpa, ' GROUP BY group_name,register_time,unix_group_name,groups.group_id,groups.is_public,groups.is_template,status,license_name ORDER BY '.$sortorder) ;
-		$res = db_query_qpa ($qpa) ;
-	}
+	$rows[] = $grp;
 }
 
-$headers = array(
-	_('Project Name (click to edit)'),
-	_('Register Time'),
-	_('Unix name'),
-	_('Status'),
-	_('Public?'),
-	_('License'),
-	_('Members'),
-	_('Template?')
-);
+usort($rows, function($a, $b) {
+	global $sortorder, $sortrev;
 
-$headerLinks = array(
-	'/admin/grouplist.php?sortorder=group_name',
-	'/admin/grouplist.php?sortorder=register_time',
-	'/admin/grouplist.php?sortorder=unix_group_name',
-	'/admin/grouplist.php?sortorder=status',
-	'/admin/grouplist.php?sortorder=is_public',
-	'/admin/grouplist.php?sortorder=license_name',
-	'/admin/grouplist.php?sortorder=members',
-	'/admin/grouplist.php?sortorder=is_template'
-);
+	$av = $a[$sortorder];
+	$bv = $b[$sortorder];
 
-echo $HTML->listTableTop($headers, $headerLinks);
+	switch ($sortorder) {
+	case 'register_time':
+	case 'is_public':
+	case 'members':
+	case 'is_template':
+		$rv = $av === $bv ? 0 : $av > $bv ? 1 : -1;
+		break;
 
-if (USE_PFO_RBAC) {
-	$public_rows = array();
-	$private_rows = array();
-	$ra = RoleAnonymous::getInstance() ;
-	while ($grp = db_fetch_array($res)) {
-		if ($ra->hasPermission('project_read', $grp['group_id'])) {
-			$grp['is_public'] = 1;
-			$public_rows[] = $grp;
-		} else {
-			$grp['is_public'] = 0;
-			$private_rows[] = $grp;
-		}
+	case 'group_name':
+	case 'status':
+	case 'license_name':
+		$rv = strcasecmp($av, $bv);
+		break;
+
+	case 'unix_group_name':
+	default:
+		$rv = 0;
 	}
-	$rows = $private_rows;
-	$rows = array_merge($rows, $public_rows);
-} else {
-	$rows = array();
-	while ($grp = db_fetch_array($res)) {
-		$rows[] = $grp;
+
+	/* second order sort is by unix group id */
+	$rv = $rv ? $rv : strcmp($a['unix_group_name'], $b['unix_group_name']);
+
+	return ($sortrev ? -$rv : $rv);
+    });
+
+$t = new EvolvisTable($tcolnames, array_map(function($v) {
+	global $sortorder, $sortrev;
+
+	$rv = '/admin/grouplist.php?sortorder=' . $v;
+	if ($v == $sortorder && !$sortrev) {
+		$rv .= '&sortrev=1';
 	}
-}
 
-$i = 0;
+	return ($rv);
+    }, $tcolids));
+
 foreach ($rows as $grp) {
+	switch ($grp['status']) {
+	case 'A':
+		$status = "active";
+		break;
+	case 'D':
+		$status = "deleted";
+		break;
+	case 'P':
+		$status = "pending";
+		break;
+	default:
+		$status = "";
+	}
 
-	if ($grp['status']=='A'){
-		$status="active";
+	$r = $t->tr();
+	$r->td()->setraw(html_e('a', array(
+		'href' => 'groupedit.php?group_id=' . $grp['group_id'],
+	    ), util_html_secure($grp['group_name'])));
+	$x = $r->td();
+	if ($grp['register_time']) {
+		$x->set(datepick_format($grp['register_time'], true));
 	}
-	if ($grp['status']=='P'){
-		$status="pending";
-	}
-	if ($grp['status']=='D'){
-		$status="deleted";
-	}
-	
-	$time_display = "";
-	if ($grp['register_time'] != 0) {
-		$time_display = date(_('Y-m-d H:i'),$grp['register_time']);
-	}
-	echo '<tr '.$HTML->boxGetAltRowStyle($i).'>';
-	echo '<td><a href="groupedit.php?group_id='.$grp['group_id'].'">'.$grp['group_name'].'</a></td>';
-	echo '<td>'.$time_display.'</td>';
-	echo '<td>'.$grp['unix_group_name'].'</td>';
-	echo '<td class="'.$status.'">'.$grp['status'].'</td>';
-	echo '<td>'.$grp['is_public'].'</td>';
-	echo '<td>'.$grp['license_name'].'</td>';
-	echo '<td>'.$grp['members'].'</td>';
-	echo '<td>'.$grp['is_template'].'</td>';
-	echo '</tr>';
-	$i++;
+	$r->td()->set($grp['unix_group_name']);
+	$r->td(array(
+		'class' => $status,
+	    ), -1, $grp['status']);
+	$r->td()->set($grp['is_public'] ? _('Yes') : _('No'));
+	$r->td()->set($grp['license_name']);
+	$r->td()->set($grp['members']);
+	$r->td()->set($grp['is_template'] ? _('Yes') : _('No'));
 }
 
-echo $HTML->listTableBottom();
+site_admin_header(array(
+	'title' => _('Project List'),
+    ));
 
+if ($group_name_search) {
+	echo html_e('p', array(
+	    ), util_html_encode(sprintf(_('Projects that begin with "%s"'),
+	    $group_name_search)));
+}
+echo $t->emit();
+
 site_admin_footer(array());
-
-// Local Variables:
-// mode: php
-// c-file-style: "bsd"
-// End:
-
-?>



More information about the evolvis-commits mailing list