Source

cruge / views / ui / rbacauthitemchilditems.php

Diff from to

views/ui/rbacauthitemchilditems.php

 <?php 
-	// permite al usuario seleccionar los AuthItems que conforman a este ROL o TASK,
+	// permite al usuario seleccionar los AuthItems que conforman a ROLE o TASK
 	// las OPERATIONS no tienen childs.
 	//
 	// argumentos recibidos:
 	// $model: instancia de CAuthItem
 	//
 	Yii::app()->clientScript->registerCoreScript('jquery');
-	
 	$rbac = Yii::app()->user->rbac;
-	
-	echo "<h1>".ucfirst($model->name)." (".
-		CrugeTranslator::t($rbac->getAuthItemTypeName($model->type)).")</h1>";
-		
-	echo "<h3 class='hint'>".$model->description."</h3>";
-	
 	$roles = $rbac->getRoles();
 	$tareas = $rbac->getTasks();
 	$operaciones = $rbac->getOperations();
-
-	// estos son los items asignados a la instancia de CAuthItem seleccionado ($model)
-	//
+	// items asignados a la instancia de CAuthItem seleccionado ($model)
 	$childrens = $rbac->getItemChildren($model->name);
 
+	// ROLES
+	$treeDataRoles = array();	
+	// TASKS
+	$treeDataMenu = array();
+	$treeDataError = array();
+	$treeDataRegular = array();
+	// OPERATIONS
+	$treeDataOps = array();
+
+	// titulos
+	echo "<h1>".ucfirst($model->name)." (".
+		CrugeTranslator::t($rbac->getAuthItemTypeName($model->type)).")</h1>";
+	echo "<h3 class='hint'>".$model->description."</h3>";
 	echo "<p>".ucfirst(CrugeTranslator::t(
 	"haga click en un item para activarlo o desactivarlo"))."</p>";
 
+	$iconPin = Yii::app()->user->ui->getResource('pin.png');
+	$imgPin = "<img class='pin-on' src='{$iconPin}' title='"
+		.CrugeTranslator::t("Click para asignar/desasignar el item")."'>";
+
+	//  LISTA DE ROLES 
+	//		si hay roles definidos y la vista no es para un TASK.
+	//
 	if((count($roles) > 0) && ($model->type != CAuthItem::TYPE_TASK)){
-		echo "<hr/><h3>".ucfirst($rbac->getAuthItemTypeName(CAuthItem::TYPE_ROLE,true))."</h3>";
-		echo "<ul class='auth-item'>";
+		
 		foreach($roles as $item){
-			
-			$yaVieneMarcado = isset($childrens[$item->name]);
-			$checked = '';
-			if($yaVieneMarcado)
-				$checked = 'checked';
-			
-			$loader = "<span class='loader'></span>";
+			$asignado = isset($childrens[$item->name]) ? 'checked' : '';
 			$loop = $rbac->detectLoop($model->name,$item->name) ? "loop" : "" ;
-			
-			echo "<li class='{$checked} {$loop}' alt='".$item->name."'>".$item->name.$loader."</li>";
-		}	
-		echo "</ul>";
+			$treeDataRoles[] = array(
+				'id'=>$item->name,
+				'text'=>"<span class='{$asignado} {$loop}'>".$item->name
+					."</span>".$imgPin,
+				'htmlOptions'=>array('class'=>'authitem',
+					'alt'=>$item->name),
+			);
+		}
 	}
 
-	
+	// LISTA DE TAREAS - organizadas segun el uso de sintaxis en descripcion
+	//	(leer acerca de la sintaxis en la clase CrugeAuthManager)
 	if(count($tareas) > 0){
-		echo "<hr/><h3>".ucfirst($rbac->getAuthItemTypeName(CAuthItem::TYPE_TASK,true))."</h3>";
-		echo "<ul class='auth-item'>";
-		foreach($tareas as $item){
-			
-			$yaVieneMarcado = isset($childrens[$item->name]);
-			$checked = '';
-			if($yaVieneMarcado)
-				$checked = 'checked';
-			
-			$loader = "<span class='loader'></span>";
-			$loop = $rbac->detectLoop($model->name,$item->name) ? "loop" : "" ;
-			
-			echo "<li class='{$checked} {$loop}' alt='".$item->name."'>".$item->name.$loader."</li>";
-		}	
-		echo "</ul>";
+		$taskinfo = $rbac->explodeTaskArray($tareas);
+
+		// despliega las tareas que son MENU y SUBMENU pero usando
+		// un TreeView
+		//
+		if(count($taskinfo['topmenu']) > 0)
+		{
+			foreach($taskinfo['topmenu'] as $topTask){
+				$text = $rbac->getTaskText($topTask);
+				$hasChildren = false;
+				$children = array();
+				if(isset($taskinfo['childmenu'][$topTask->name]))
+				foreach($taskinfo['childmenu'][$topTask->name] as $child){
+					$asignado = isset($childrens[$child->name]) ? 
+						'checked' : '';
+					$loop = $rbac->detectLoop($model->name,$child->name) ? 
+						"loop" : "" ;
+					$hasChildren = true;
+					$children[] = array(
+						'id'=>$child->name,
+						'text'=>"<span class='itemchildtext authitemsub {
+							$asignado} {$loop}'>"
+								.$rbac->getTaskText($child)."</span>".$imgPin,
+						'htmlOptions'=>array('class'=>'authitemchild'
+							,'alt'=>$child->name
+							, 'title'=>$child->name),
+					);
+				}
+				$asignado = isset($childrens[$topTask->name]) ? 'checked' : '';
+				$loop = $rbac->detectLoop($model->name,$topTask->name) ? 
+						"loop" : "" ;
+				$treeDataMenu[] = array(
+					'id'=>$topTask->name,
+					'text'=>"<span class='itemtext authitemtop {$asignado} {
+						$loop}'>".$text
+						."</span>".$imgPin,
+					'expanded'=>false,
+					'hasChildren'=>$hasChildren,
+					'children'=>$children,
+					'htmlOptions'=>array('class'=>'authitem',
+							'alt'=>$topTask->name, 'title'=>$topTask->name),
+				);
+			}
+		}
+
+		// Muestra las tareas que fueron consideradas menues pero sus
+		// nodos padre no existen. (tienen su sintaxis de descripcion errada).
+		if(count($taskinfo['orphan'])>0)
+			foreach($taskinfo['orphan'] as $orpTask){
+				$asignado = isset($childrens[$orpTask->name]) ? 'checked' : '';
+				$loop = $rbac->detectLoop($model->name,$orpTask->name) ? 
+						"loop" : "" ;
+				$treeDataError[] = array(
+					'id'=>$orpTask->name,
+					'text'=>"<span class='{$asignado} {$loop}'>".
+						$rbac->getTaskText($orpTask)."</span>".$imgPin,
+					'expanded'=>false,
+					'hasChildren'=>false,
+					'htmlOptions'=>array('class'=>'authitem'
+						, 'alt'=>$orpTask->name),
+				);
+			}
+
+		// Muestra las tareas regulares, aquellas no marcadas con sintaxis.
+		// en otras palabras las tareas comunes y silvestres!
+		if(count($taskinfo['regular'])>0)
+			foreach($taskinfo['regular'] as $task){
+				$asignado = isset($childrens[$task->name]) ? 'checked' : '';
+				$loop = $rbac->detectLoop($model->name,$task->name) ? 
+						"loop" : "" ;
+				$treeDataRegular[] = array(
+					'id'=>$task->name,
+					'text'=>"<span class='{$asignado} {$loop}'>".
+						$task->name."</span>".$imgPin,
+					'expanded'=>false,
+					'hasChildren'=>false,
+					'htmlOptions'=>array('class'=>'authitem',
+						'alt'=>$task->name),
+				);
+			}
 	}
 
+	// LISTA DE OPERACIONES	- organizadas con un filtro
+	//
 	if(count($operaciones) > 0){
-		echo "<hr/><h3>".ucfirst($rbac->getAuthItemTypeName(CAuthItem::TYPE_OPERATION,true))."</h3>";
-		echo "<ul class='auth-item'>";
-		foreach($operaciones as $item){
-			
-			$yaVieneMarcado = isset($childrens[$item->name]);
-			$checked = '';
-			if($yaVieneMarcado)
-				$checked = 'checked';
-			
-			$loader = "<span class='loader'></span>";
-			$loop = $rbac->detectLoop($model->name,$item->name) ? "loop" : "" ;
-			
-			echo "<li class='{$checked} {$loop}' alt='".$item->name."'>".$item->name.$loader."</li>";
-		}	
-		echo "</ul>";
+
+		// arma una lista de categorias en conjunto con el dato 'filter'
+		// usado para agrupar las operaciones con el metodo:
+		//	$rbac->getOperationsFiltered(...)
+		//
+		$listacatg = array();
+		$listacatg['1'] = CrugeTranslator::t('Variadas');
+		$listacatg['3'] = CrugeTranslator::t('Controllers');
+		foreach($rbac->enumControllers() as $controllerName)
+			$listacatg[$controllerName] = $controllerName;
+		$listacatg['2'] = CrugeTranslator::t('Cruge');
+
+		// cada categoria es un sub nodo del arbol CTreeView::operations
+		//
+		foreach($listacatg as $catg_filter => $catg_name){
+			$childs = array();
+			foreach($rbac->getOperationsFiltered($catg_filter, $operaciones) 
+				as $item){
+				// por cada operacion filtrada por $filter la agrega
+
+				$asignado = isset($childrens[$item->name]) ? 'checked' : '';
+				$loop = $rbac->detectLoop($model->name,$item->name) ? 
+						"loop" : "" ;
+
+				$childs[] = array(
+					'id'=>$item->name,
+					'text'=>"<span class='{$asignado} {$loop}'>".
+						$item->name."</span>".$imgPin,
+					'htmlOptions'=>array('class'=>'authitem',
+						'alt'=>$item->name),
+				);
+			}
+
+			$treeDataOps[] = array(
+				'text'=>$catg_name,
+				'hasChildren'=>(count($childs)>0) ? true:false,
+				'expanded'=>false,
+				'children'=>$childs,
+			);
+		}
+
 	}
 
-	
-?>
+	// por razones de generar orden, no le da al usuario la posibilidad
+	// de que a una tarea tipo subitem la componga de otros subitems
+	// si se va a generar un enredo (para el).
+	//
+	if($model->type == CAuthItem::TYPE_ROLE){
+		$arrayTareas = array(
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Tareas Regulares")."</b>", 
+				'expanded'=>true, 
+				'hasChildren'=>(count($treeDataRegular)>0) ? true : false,
+				'children'=>$treeDataRegular,
+			),
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Tareas de tipo Menu")."</b>", 
+				'expanded'=>true, 
+				'hasChildren'=>(count($treeDataMenu)>0) ? true : false,
+				'children'=>$treeDataMenu,
+			),
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Tareas Huerfanas")."</b>", 
+				'expanded'=>true, 
+				'hasChildren'=>(count($treeDataError)>0) ? true : false,
+				'children'=>$treeDataError,
+			),
+		);
+	}else{
+		$arrayTareas = array(
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Tareas Regulares")."</b>", 
+				'expanded'=>true, 
+				'hasChildren'=>(count($treeDataRegular)>0) ? true : false,
+				'children'=>$treeDataRegular,
+			),
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Tareas Huerfanas")."</b>", 
+				'expanded'=>true, 
+				'hasChildren'=>(count($treeDataError)>0) ? true : false,
+				'children'=>$treeDataError,
+			),
+		);
+	}
 
+	$this->widget('CTreeView',array(
+		'id'=>'auth-item-tree',
+		'persist'=>'cookie',
+		'data'=>
+		array(
+
+			// ROLES  TREENODE
+			array(
+				'text'=>"<b>".CrugeTranslator::t("Roles")."</b>", 
+				'expanded'=>true, 
+				'children'=>$treeDataRoles,
+			),//end roles treenode
+
+			// TAREAS TREENODE
+			array(
+				'text'=>"<b>".CrugeTranslator::t("Tareas")."</b>", 
+				'expanded'=>true, 
+				'children'=>$arrayTareas,
+			),//end tareas treenode
+
+			// OPERATIONS  TREENODE
+			array(
+				'text'=>"<b>".CrugeTranslator::t(
+					"Operaciones Organizadas por Tipo")."</b>", 
+				'expanded'=>true, 
+				'children'=>$treeDataOps,
+			),//end operations treenode
+			
+		)
+	));
+?>
 
 <script>
-	$('li').each(function(){
-		var li = $(this);
-		li.css("cursor","pointer");
-		li.click(function(){
+	$('img.pin-on').each(function(){
+		var img = $(this);
+		img.css("cursor","pointer");
+		img.click(function(){
 
 			// el atributo alt del LI tiene el nombre del item que representa.
-			var _li = $(this);
+			var _li = $(this).parent();
 			var thisItemName = _li.attr('alt');
-			var setFlag = _li.hasClass('checked') ? false : true;
-			var action = '<?php echo Yii::app()->user->ui->getRbacAjaxSetChildItemUrl()?>';
-			var jsondata = "{ \"parent\": \"<?php echo $model->name;?>\" , \"child\": "
+			var span = _li.find('span');
+
+			//var istop = span.hasClass("authitemtop");
+			//var issub = span.hasClass("authitemsub");
+			//var tiponodo = 0;
+			//if(istop==false && issub==false) tiponodo='normal'; // rol, tarea
+			//if(istop==true && issub==true) tiponodo='top'; // es un topmenu
+			//if(istop==false && issub==true) tiponodo='sub'; // es un submenu
+
+			// el nuevo valor segun el valor checked actual
+			var setFlag = span.hasClass('checked') ? false : true;
+
+			//alert("tiponodo="+tiponodo+" newFlag="+setFlag+", span="
+			//	+span.html());
+			//return;
+			
+			var action = '<?php 
+				echo Yii::app()->user->ui->getRbacAjaxSetChildItemUrl()?>';
+			var jsondata = "{ \"parent\": \"<?php 
+				echo $model->name;?>\" , \"child\": "
 					+"\""+thisItemName+"\" , \"setflag\": "+setFlag+" }";	
-			var loadingUrl = '<?php echo Yii::app()->user->ui->getResource('loading.gif'); ?>';
-			var loader = li.find('span.loader');
+			var loadingUrl = '<?php 
+				echo Yii::app()->user->ui->getResource('loading.gif'); ?>';
+			var loader = _li.find('span.loader');
 
 			loader.html("<img src='"+loadingUrl+"'>");
 			$('#_errorResult').html("");
 				data: jsondata,
 				success: function(data, textStatus, jqXHR){
 					loader.html("");
-					// si se pudo realizar la accion, aqui data trae un objeto json con la data del // item
+					// si se pudo realizar la accion, aqui data trae un objeto 
+					// json con la data del item
 					if(data.result == true){
-						_li.addClass("checked");
+						span.addClass("checked");
 					}else{
-						_li.removeClass("checked");
+						span.removeClass("checked");
 					}
 				},
 				error: function(jqXHR, textStatus, errorThrown){
-					//$('#_errorResult').html("Ocurrio un error:<hr>"+jqXHR.responseText);
-					$('#_errorResult').html("<p class='auth-item-error-msg'>no se pudo agregar</p>");
+					//$('#_errorResult').html("Ocurrio un error:<hr>"
+						//+jqXHR.responseText);
+					$('#_errorResult').html("<p class='auth-item-error-msg'>"
+					  +"no se pudo agregar<br/>"+jqXHR.responseText+"</p>");
 					$('#_errorResult').show("slow");
 					setTimeout(function(){
 						$('#_errorResult').hide("slow");
 			});
 		});
 	});
-	
+
 	
 </script>
 
 <div id='_errorResult'></div>
 <div id='_log'></div>
 
-<?php 
-	$ayuda = "";
-	if($model->type == CAuthItem::TYPE_ROLE)
-		$ayuda = CrugeTranslator::t(
-		"Los roles pueden estar comprendidos de otros roles, tareas u operaciones. el sistema evitara que se hagan ciclos (loops).
-		");
-	if($model->type == CAuthItem::TYPE_TASK)
-		$ayuda = CrugeTranslator::t(
-		"Las tareas pueden estar comprendidos de otras tareas u operaciones. los roles incluyen a tareas por eso no estan presentes aqui para ser seleccionados. el sistema evitara que se hagan ciclos (loops).
-		");
-	echo "<p class='hint'>$ayuda</p>";
-?>
-