Departments Manager Ext JS Migration Complete
This commit is contained in:
@@ -670,6 +670,19 @@ class RBAC
|
||||
return $this->rolesObj->getAllUsersByRole();
|
||||
}
|
||||
|
||||
/**
|
||||
* this function gets the number of users by department
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @author: Enrique Ponce de Leon <enrique@colosa.com>
|
||||
*
|
||||
* @return $this->rolesObj->getAllUsersByRole
|
||||
*/
|
||||
function getAllUsersByDepartment(){
|
||||
return $this->rolesObj->getAllUsersByDepartment();
|
||||
}
|
||||
|
||||
/**
|
||||
* this function gets roles code
|
||||
*
|
||||
|
||||
@@ -359,6 +359,23 @@ class Roles extends BaseRoles {
|
||||
return $aRoles;
|
||||
}
|
||||
|
||||
//Added by Enrique at Feb 10th, 2011
|
||||
//Gets number of users by department
|
||||
function getAllUsersByDepartment(){
|
||||
$oCriteria = new Criteria('rbac');
|
||||
$oCriteria->addSelectColumn(UsersPeer::DEP_UID);
|
||||
$oCriteria->addSelectColumn('COUNT(*) AS CNT');
|
||||
$oCriteria->addGroupByColumn(UsersPeer::DEP_UID);
|
||||
$oDataset = UsersPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$aDepts = array();
|
||||
while ($oDataset->next()){
|
||||
$row = $oDataset->getRow();
|
||||
$aDepts[$row['DEP_UID']] = $row['CNT'];
|
||||
}
|
||||
return $aDepts;
|
||||
}
|
||||
|
||||
function getRoleUsers($ROL_UID, $filter='') {
|
||||
try {
|
||||
$criteria = new Criteria();
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
|
||||
*
|
||||
*/
|
||||
G::LoadClass('configuration');
|
||||
$c = new Configurations();
|
||||
|
||||
$access = $RBAC->userCanAccess('PM_USERS');
|
||||
if( $access != 1 ){
|
||||
@@ -52,311 +54,17 @@ if (($RBAC_Response=$RBAC->userCanAccess("PM_USERS"))!=1) return $RBAC_Response;
|
||||
$G_ID_SUB_MENU_SELECTED = 'DEPARTMENTS';
|
||||
|
||||
$G_PUBLISH = new Publisher;
|
||||
$oHeadPublisher =& headPublisher::getSingleton();
|
||||
//$oHeadPublisher->addScriptFile('/jscore/departments/departments.js');
|
||||
|
||||
$G_PUBLISH->AddContent('view', 'departments/departments_Tree' );
|
||||
$G_PUBLISH->AddContent('smarty', 'departments/departments_userList', '', '', array());
|
||||
$oHeadPublisher =& headPublisher::getSingleton();
|
||||
|
||||
G::RenderPage( "publish-treeview",'blank' );
|
||||
//$oHeadPublisher->usingExtJs('ux/Ext.ux.fileUploadField');
|
||||
$oHeadPublisher->addExtJsScript('departments/departmentList', false); //adding a javascript file .js
|
||||
$oHeadPublisher->addContent('departments/departmentList'); //adding a html file .html.
|
||||
|
||||
$departments_New = G::encryptlink('departments_New');
|
||||
$departments_Edit = G::encryptlink('departments_Edit');
|
||||
$departments_Delete = G::encryptlink('departments_Delete');
|
||||
$departments_List = G::encryptlink('departments_List');
|
||||
$departments_AddUser = G::encryptlink('departments_AddUser');
|
||||
$departments_AddManager = G::encryptlink('departments_AddManager');
|
||||
$subdep_Edit = G::encryptlink('subdep_Edit');
|
||||
$subdep_Delete = G::encryptlink('subdep_Delete');
|
||||
//$labels = G::getTranslations(Array('ID_DEPARTMENTS','ID_DELETE','ID_EDIT','ID_USERS','ID_ACTIVE','ID_INACTIVE','ID_SELECT_STATUS',
|
||||
// 'ID_CLOSE','ID_SAVE','ID_DEPARTMENT_NAME','ID_STATUS'));
|
||||
//
|
||||
//$oHeadPublisher->assign('TRANSLATIONS', $labels);
|
||||
$oHeadPublisher->assign('FORMATS',$c->getFormats());
|
||||
G::RenderPage('publish', 'extJs');
|
||||
?>
|
||||
<script>
|
||||
|
||||
|
||||
var oAux = document.getElementById("publisherContent[0]");
|
||||
oAux.id = "publisherContent[666]";
|
||||
var currentGroup=false;
|
||||
|
||||
function saveUserGroup(sUser) {
|
||||
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../groups/groups_Ajax',
|
||||
async : false,
|
||||
method: 'POST',
|
||||
args : 'action=assignUser&GRP_UID=' + currentGroup + '&USR_UID=' + sUser
|
||||
});
|
||||
oRPC.make();
|
||||
currentPopupWindow.remove();
|
||||
selectGroup(currentGroup);
|
||||
}
|
||||
|
||||
|
||||
function saveUsers(){
|
||||
if( checks_selected_ids.length == 0 ){
|
||||
new leimnud.module.app.alert().make({label: G_STRINGS.ID_MSG_GROUPS_ADDCONFIRM});
|
||||
return 0;
|
||||
}
|
||||
//alert('action=assignAllUsers&DEP_UID=' + currentGroup + '&aUsers=' + checks_selected_ids);return;
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : false,
|
||||
method: 'POST',
|
||||
args : 'action=assignAllUsers&DEP_UID=' + currentGroup + '&aUsers=' + checks_selected_ids
|
||||
});
|
||||
resetChecks();
|
||||
oRPC.make();
|
||||
currentPopupWindow.remove();
|
||||
selectDpto(currentGroup);
|
||||
}
|
||||
|
||||
function resetChecks(){
|
||||
checks_selected_ids.length = 0;
|
||||
}
|
||||
|
||||
function selectDpto( uid ){
|
||||
currentGroup = uid;
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : 'departments_Ajax',
|
||||
args : 'action=showUsers&sDptoUID=' + uid
|
||||
});
|
||||
oRPC.callback = function(rpc) {
|
||||
var scs = rpc.xmlhttp.responseText.extractScript();
|
||||
document.getElementById('spanUsersList').innerHTML = rpc.xmlhttp.responseText;
|
||||
scs.evalScript();
|
||||
}.extend(this);
|
||||
|
||||
oRPC.make();
|
||||
}
|
||||
|
||||
function addDepto() {
|
||||
popupWindow('' , '<?=$departments_New?>' , 500 , 200 );
|
||||
}
|
||||
|
||||
function addSubDepto(depUid){
|
||||
popupWindow('' , '<?= $departments_New ?>?DEP_UID=' + encodeURIComponent( depUid ) , 500 , 200 );
|
||||
}
|
||||
|
||||
function deleteDpto( uid ){
|
||||
new leimnud.module.app.confirm().make({
|
||||
label:"<?=G::LoadTranslation('ID_MSG_CONFIRM_DELETE_DEPARTMENT')?>",
|
||||
action:function()
|
||||
{
|
||||
ajax_function('<?=$departments_Delete?>', 'empty', 'DEP_UID='+uid, "POST" );
|
||||
refreshTree();
|
||||
document.getElementById('spanUsersList').innerHTML = '';
|
||||
}.extend(this)
|
||||
});
|
||||
}
|
||||
|
||||
function addUserDpto( uid ) {
|
||||
oPanel = new leimnud.module.panel();
|
||||
oPanel.options = {
|
||||
size :{w:400,h:512},
|
||||
position:{x:0,y:0,center:true},
|
||||
title : 'Add users to department ' + groupname,
|
||||
theme :"processmaker",
|
||||
statusBar:false,
|
||||
control :{resize:false,roll:false,drag:true},
|
||||
fx :{modal:true,opacity:true,blinkToFront:false,fadeIn:false,drag:true}
|
||||
};
|
||||
oPanel.events = {
|
||||
remove: function() {
|
||||
delete(oPanel);
|
||||
//resetChecks();
|
||||
}.extend(this)
|
||||
};
|
||||
oPanel.make();
|
||||
oPanel.loader.show();
|
||||
currentPopupWindow = oPanel;
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '<?=$departments_AddUser?>?UID='+uid,
|
||||
args: ''
|
||||
});
|
||||
oRPC.callback = function(rpc) {
|
||||
oPanel.loader.hide();
|
||||
var scs=rpc.xmlhttp.responseText.extractScript();
|
||||
oPanel.addContent(rpc.xmlhttp.responseText);
|
||||
scs.evalScript();
|
||||
var inputs = document.getElementsByTagName("input");
|
||||
for(i=0; i<inputs.length; i++){
|
||||
if( inputs[i].type == "checkbox" ){
|
||||
try{
|
||||
inputs[i].onclick = function(){
|
||||
if(this.checked){
|
||||
checks_selected_ids.push(this.value);
|
||||
} else {
|
||||
checks_selected_ids.deleteByValue(this.value);
|
||||
}
|
||||
};
|
||||
}catch(e){alert(e)}
|
||||
}
|
||||
}
|
||||
}.extend(this);
|
||||
oRPC.make();
|
||||
}
|
||||
|
||||
function addDepManager(suid, sDepParent){
|
||||
var k = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : true,
|
||||
method: 'POST',
|
||||
args : 'action=getDepManager&sDptoUID=' + suid
|
||||
|
||||
});
|
||||
|
||||
k.callback = function(rpc){
|
||||
if(rpc.xmlhttp.responseText>0){
|
||||
msgBox("this department has its manager","alert");return false;
|
||||
}else{
|
||||
popupWindow('' , '<?=$departments_AddManager?>?SUID=' + encodeURIComponent( suid )+'&SDEPPARENT=' + encodeURIComponent( sDepParent )+ '+&nobug' , 500 , 200 );
|
||||
}
|
||||
}.extend(this);
|
||||
k.make();
|
||||
}
|
||||
|
||||
|
||||
function savedepto( form ) {
|
||||
var actionform='departments_Save';
|
||||
ajax_post( actionform, form, 'POST' );
|
||||
currentPopupWindow.remove();
|
||||
refreshTree();
|
||||
}
|
||||
|
||||
function savedeptomain( form ) {//alert(form.action);return;
|
||||
var formAction ='departments_Save';
|
||||
ajax_post( formAction, form, 'POST' );
|
||||
selectDpto(getField('DEP_UID').value);
|
||||
refreshTree();
|
||||
}
|
||||
|
||||
function savedeptoManager( form ) {
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : false,
|
||||
method: 'POST',
|
||||
args : 'action=assignAllUsers&DEP_UID=' + getField('DEP_UID').value + '&aUsers=' + getField('DEP_MANAGER').value
|
||||
});
|
||||
//resetChecks();
|
||||
oRPC.make();
|
||||
|
||||
ajax_post( form.action, form, 'POST' );
|
||||
currentPopupWindow.remove();
|
||||
//refreshTree();
|
||||
selectDpto(getField('DEP_UID').value);
|
||||
}
|
||||
|
||||
function savesubdepto( form ) {
|
||||
ajax_post( form.action, form, 'POST' );
|
||||
currentPopupWindow.remove();
|
||||
refreshSubTree();
|
||||
}
|
||||
|
||||
function AddUnassignedUser( uid ){//alert(uid);
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : 'departments_Ajax',
|
||||
args : 'action=showUnAssignedUsers&UID=' + uid
|
||||
});
|
||||
oRPC.callback = function(rpc) {
|
||||
var scs = rpc.xmlhttp.responseText.extractScript();
|
||||
document.getElementById('spanUsersList').innerHTML = rpc.xmlhttp.responseText;
|
||||
scs.evalScript();
|
||||
}.extend(this);
|
||||
|
||||
oRPC.make();
|
||||
}
|
||||
|
||||
function sselectDpto( suid, sDepParent ) {
|
||||
currentGroup = suid;
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : 'departments_Ajax',
|
||||
args : 'action=subshowUsers&sDptoUID=' + suid +'&sDepParent=' + sDepParent
|
||||
});
|
||||
oRPC.callback = function(rpc) {
|
||||
var scs = rpc.xmlhttp.responseText.extractScript();
|
||||
document.getElementById('spanUsersList').innerHTML = rpc.xmlhttp.responseText;
|
||||
scs.evalScript();
|
||||
}.extend(this);
|
||||
|
||||
oRPC.make();
|
||||
}
|
||||
|
||||
|
||||
function sdeleteDpto( suid, sDepParent ){
|
||||
new leimnud.module.app.confirm().make({
|
||||
label:"<?=G::LoadTranslation('ID_MSG_CONFIRM_DELETE_DEPARTMENT')?>",
|
||||
action:function()
|
||||
{
|
||||
ajax_function('<?=$subdep_Delete?>', 'asdxxx', 'DEP_UID=' +suid+ '&DEP_PARENT=' +sDepParent, "POST" );
|
||||
refreshTree();
|
||||
document.getElementById('spanUsersList').innerHTML = '';
|
||||
}.extend(this)
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function refreshTree(){
|
||||
tree.refresh( document.getElementById("publisherContent[666]") , '<?=$departments_List?>');
|
||||
}
|
||||
|
||||
function refreshSubTree(){
|
||||
tree.refresh( document.getElementById("publisherContent[666]") , '<?=$departments_List?>');
|
||||
}
|
||||
|
||||
var removeUserFromDepartment = function(sDpto, sUser)
|
||||
{
|
||||
new leimnud.module.app.confirm().make({
|
||||
label:"<?=G::LoadTranslation('ID_MSG_CONFIRM_REMOVE_USER')?>",
|
||||
action:function()
|
||||
{
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : false,
|
||||
method: 'POST',
|
||||
args : 'action=removeUserFromDepartment&DEP_UID=' + sDpto + '&USR_UID=' + sUser
|
||||
});
|
||||
oRPC.make();
|
||||
currentDept = sDpto;
|
||||
selectDpto(currentDept);
|
||||
}.extend(this)
|
||||
});
|
||||
};
|
||||
|
||||
var removeUserManager = function(sDpto, sUser)
|
||||
{
|
||||
new leimnud.module.app.confirm().make({
|
||||
label:"<?=G::LoadTranslation('ID_MSG_CONFIRM_REMOVE_USER')?>",
|
||||
action:function()
|
||||
{
|
||||
var oRPC = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : false,
|
||||
method: 'POST',
|
||||
args : 'action=removeUserManager&DEP_UID=' + sDpto + '&USR_UID=' + sUser
|
||||
});
|
||||
oRPC.make();
|
||||
currentGroup = sDpto;
|
||||
selectDpto(currentGroup);
|
||||
}.extend(this)
|
||||
});
|
||||
};
|
||||
|
||||
function DeleteManager(suid, sDepParent){
|
||||
var k = new leimnud.module.rpc.xmlhttp({
|
||||
url : '../departments/departments_Ajax',
|
||||
async : true,
|
||||
method: 'POST',
|
||||
args : 'action=getDepManageruid&sDptoUID=' + suid
|
||||
|
||||
});
|
||||
k.callback = function(rpc){
|
||||
sUser= rpc.xmlhttp.responseText;
|
||||
|
||||
if(rpc.xmlhttp.responseText!=''){
|
||||
removeUserManager(suid, sUser);
|
||||
}else{
|
||||
msgBox("this department doesn't has its manager","alert");return false;
|
||||
}
|
||||
}.extend(this);
|
||||
k.make();
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -22,6 +22,47 @@
|
||||
* Coral Gables, FL, 33134, USA, or email info@colosa.com.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
function LookForChildren($parent, $level,$aDepUsers){
|
||||
G::LoadClass('configuration');
|
||||
$conf = new Configurations();
|
||||
$oDept = new Department();
|
||||
$allDepartments = $oDept->getDepartments ( $parent );
|
||||
$level++;
|
||||
$rows = Array();
|
||||
foreach($allDepartments as $department){
|
||||
unset($depto);
|
||||
$depto['DEP_TITLE'] = $department['DEP_TITLE'];
|
||||
$depto['DEP_STATUS'] = $department['DEP_STATUS'];
|
||||
if ($department['DEP_MANAGER_USERNAME']!=''){
|
||||
$depto['DEP_MANAGER_NAME'] = $conf->usersNameFormat($department['DEP_MANAGER_USERNAME'], $department['DEP_MANAGER_FIRSTNAME'], $department['DEP_MANAGER_LASTNAME']);
|
||||
}else{
|
||||
$depto['DEP_MANAGER_NAME'] = '';
|
||||
}
|
||||
$depto['DEP_TOTAL_USERS'] = isset($aDepUsers[$department['DEP_UID']])? $aDepUsers[$department['DEP_UID']] : 0;
|
||||
$depto['DEP_UID'] = $department['DEP_UID'];
|
||||
$depto['DEP_MANAGER'] = $department['DEP_MANAGER'];
|
||||
$depto['DEP_PARENT'] = $department['DEP_PARENT'];
|
||||
if ($department['HAS_CHILDREN'] > 0){
|
||||
$depto['children'] = LookForChildren($department['DEP_UID'], $level, $aDepUsers);
|
||||
$depto['iconCls'] = 'ss_sprite ss_chart_organisation';
|
||||
$depto['expanded'] = true;
|
||||
}else{
|
||||
$depto['leaf'] = true;
|
||||
if ($level==1){
|
||||
$depto['iconCls'] = 'ss_sprite ss_chart_organisation';
|
||||
}else{
|
||||
$depto['iconCls'] = 'ss_sprite ss_plugin';
|
||||
}
|
||||
}
|
||||
|
||||
$rows[] = $depto;
|
||||
}
|
||||
return $rows;
|
||||
}
|
||||
|
||||
|
||||
if (($RBAC_Response=$RBAC->userCanAccess("PM_USERS"))!=1) return $RBAC_Response;
|
||||
G::LoadInclude('ajax');
|
||||
$_POST['action'] = get_ajax_value('action');
|
||||
@@ -110,5 +151,210 @@ switch ($_POST['action'])
|
||||
G::RenderPage('publish', 'raw');
|
||||
|
||||
break;
|
||||
case 'departmentList':
|
||||
global $RBAC;
|
||||
$aDEPTS = $RBAC->getAllUsersByDepartment();
|
||||
$tree_depart = LookForChildren('', 0,$aDEPTS);
|
||||
echo G::json_encode($tree_depart);
|
||||
break;
|
||||
case 'checkDepartmentName':
|
||||
$parent = $_REQUEST['parent'];
|
||||
$dep_name = $_REQUEST['name'];
|
||||
|
||||
$oCriteria = new Criteria('workflow');
|
||||
|
||||
$oCriteria->clearSelectColumns();
|
||||
$oCriteria->addSelectColumn( ContentPeer::CON_CATEGORY );
|
||||
$oCriteria->addSelectColumn( ContentPeer::CON_VALUE );
|
||||
$oCriteria->addSelectColumn(DepartmentPeer::DEP_PARENT);
|
||||
$oCriteria->add(ContentPeer::CON_CATEGORY, 'DEPO_TITLE');
|
||||
$oCriteria->addJoin(ContentPeer::CON_ID, DepartmentPeer::DEP_UID, Criteria::LEFT_JOIN);
|
||||
$oCriteria->add(ContentPeer::CON_VALUE, $dep_name);
|
||||
$oCriteria->add(ContentPeer::CON_LANG, SYS_LANG );
|
||||
$oCriteria->add(DepartmentPeer::DEP_PARENT,$parent);
|
||||
|
||||
$oDataset = DepartmentPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$oDataset->next();
|
||||
$aRow = $oDataset->getRow();
|
||||
|
||||
echo (!$aRow) ? 'true' : 'false';
|
||||
break;
|
||||
case 'checkEditDepartmentName':
|
||||
$parent = $_REQUEST['parent'];
|
||||
$dep_name = $_REQUEST['name'];
|
||||
$dep_uid = $_REQUEST['uid'];
|
||||
|
||||
$oCriteria = new Criteria('workflow');
|
||||
$oCriteria->clearSelectColumns();
|
||||
$oCriteria->addSelectColumn( ContentPeer::CON_CATEGORY );
|
||||
$oCriteria->addSelectColumn( ContentPeer::CON_VALUE );
|
||||
$oCriteria->addSelectColumn(DepartmentPeer::DEP_PARENT);
|
||||
$oCriteria->add(ContentPeer::CON_CATEGORY, 'DEPO_TITLE');
|
||||
$oCriteria->addJoin(ContentPeer::CON_ID, DepartmentPeer::DEP_UID, Criteria::LEFT_JOIN);
|
||||
$oCriteria->add(ContentPeer::CON_VALUE, $dep_name);
|
||||
$oCriteria->add(DepartmentPeer::DEP_UID,$dep_uid,Criteria::NOT_EQUAL);
|
||||
$oCriteria->add(ContentPeer::CON_LANG, SYS_LANG );
|
||||
$oCriteria->add(DepartmentPeer::DEP_PARENT,$parent);
|
||||
|
||||
$oDataset = DepartmentPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$oDataset->next();
|
||||
$aRow = $oDataset->getRow();
|
||||
|
||||
echo (!$aRow) ? 'true' : 'false';
|
||||
break;
|
||||
|
||||
case 'saveDepartment':
|
||||
$parent = $_REQUEST['parent'];
|
||||
$dep_name = $_REQUEST['name'];
|
||||
$newDepartment['DEP_PARENT'] = $parent;
|
||||
$newDepartment['DEP_TITLE'] = $dep_name;
|
||||
$oDept = new Department();
|
||||
$oDept->create($newDepartment);
|
||||
echo '{success: true}';
|
||||
break;
|
||||
case 'usersByDepartment':
|
||||
G::LoadClass ( 'configuration' );
|
||||
$sDepUid = $_REQUEST['DEP_UID'];
|
||||
$oCriteria = new Criteria('workflow');
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_UID);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_USERNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_FIRSTNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_LASTNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_REPORTS_TO);
|
||||
$oCriteria->add(UsersPeer::USR_STATUS, 'CLOSED', Criteria::NOT_EQUAL);
|
||||
$oCriteria->add(UsersPeer::DEP_UID, $sDepUid);
|
||||
|
||||
$oDataset = DepartmentPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
|
||||
$rows = Array();
|
||||
|
||||
$conf = new Configurations();
|
||||
|
||||
while ($oDataset->next()){
|
||||
$aRow = $oDataset->getRow();
|
||||
$user['USR_UID'] = $aRow['USR_UID'];
|
||||
$user['USR_VALUE'] = $conf->usersNameFormat($aRow['USR_USERNAME'], $aRow['USR_FIRSTNAME'], $aRow['USR_LASTNAME']);
|
||||
$rows[] = $user;
|
||||
}
|
||||
|
||||
echo '{users: '.G::json_encode($rows).'}';
|
||||
break;
|
||||
case 'updateDepartment':
|
||||
try{
|
||||
$dep_name = $_REQUEST['name'];
|
||||
echo $dep_name;
|
||||
$dep_uid = $_REQUEST['uid'];
|
||||
$dep_manager = $_REQUEST['manager'];
|
||||
$dep_status = $_REQUEST['status'];
|
||||
$editDepartment['DEP_UID'] = $dep_uid;
|
||||
$editDepartment['DEPO_TITLE'] = $dep_name;
|
||||
$editDepartment['DEP_STATUS'] = $dep_status;
|
||||
$editDepartment['DEP_MANAGER'] = $dep_manager;
|
||||
$oDept = new Department();
|
||||
$oDept->update($editDepartment);
|
||||
$oDept->updateDepartmentManager($dep_uid);
|
||||
echo '{success: true}';
|
||||
}catch(exception $e){
|
||||
echo '{success: false}';
|
||||
}
|
||||
break;
|
||||
case 'canDeleteDepartment':
|
||||
global $RBAC;
|
||||
$aDEPTS = $RBAC->getAllUsersByDepartment();
|
||||
if (isset($aDEPTS[$_POST['dep_uid']])){
|
||||
echo '{success: false, users: '.$aDEPTS[$_POST['dep_uid']].'}';
|
||||
}else{
|
||||
echo '{success: true}';
|
||||
}
|
||||
break;
|
||||
case 'deleteDepartment':
|
||||
$DEP_UID = $_POST['DEP_UID'];
|
||||
$oDept = new Department();
|
||||
$oDept->remove($DEP_UID);
|
||||
echo '{success: true}';
|
||||
break;
|
||||
case 'assignedUsers':
|
||||
$filter = isset($_POST['textFilter']) ? $_POST['textFilter'] : '';
|
||||
$dep_uid = $_REQUEST['dUID'];
|
||||
$oCriteria = new Criteria('workflow');
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_UID);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_USERNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_FIRSTNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_LASTNAME);
|
||||
if ($filter!=''){
|
||||
$oCriteria->add(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_USERNAME, '%'.$filter.'%',Criteria::LIKE)->addOr(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_FIRSTNAME, '%'.$filter.'%',Criteria::LIKE)->addOr(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_LASTNAME, '%'.$filter.'%',Criteria::LIKE)))
|
||||
);
|
||||
}
|
||||
$oCriteria->add(UsersPeer::DEP_UID,$dep_uid);
|
||||
$oDataset = UsersPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$aUsers = array();
|
||||
while ($oDataset->next()){
|
||||
$aUsers[] = $oDataset->getRow();
|
||||
}
|
||||
echo '{users:'.G::json_encode($aUsers).'}';
|
||||
break;
|
||||
case 'availableUsers':
|
||||
$filter = isset($_POST['textFilter']) ? $_POST['textFilter'] : '';
|
||||
$dep_uid = $_REQUEST['dUID'];
|
||||
$oCriteria = new Criteria('workflow');
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_UID);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_USERNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_FIRSTNAME);
|
||||
$oCriteria->addSelectColumn(UsersPeer::USR_LASTNAME);
|
||||
$oCriteria->add(UsersPeer::DEP_UID,'');
|
||||
$oCriteria->add(UsersPeer::USR_STATUS,'CLOSED',Criteria::NOT_EQUAL);
|
||||
|
||||
if ($filter!=''){
|
||||
$oCriteria->add(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_USERNAME, '%'.$filter.'%',Criteria::LIKE)->addOr(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_FIRSTNAME, '%'.$filter.'%',Criteria::LIKE)->addOr(
|
||||
$oCriteria->getNewCriterion(UsersPeer::USR_LASTNAME, '%'.$filter.'%',Criteria::LIKE)))
|
||||
);
|
||||
}
|
||||
$oDataset = UsersPeer::doSelectRS($oCriteria);
|
||||
$oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$aUsers = array();
|
||||
while ($oDataset->next()){
|
||||
$aUsers[] = $oDataset->getRow();
|
||||
}
|
||||
echo '{users:'.G::json_encode($aUsers).'}';
|
||||
break;
|
||||
case 'assignDepartmentToUserMultiple':
|
||||
$DEP_UID = $_REQUEST['DEP_UID'];
|
||||
$uSERS = $_REQUEST['USR_UID'];
|
||||
$aUsers = explode(',',$uSERS);
|
||||
$dep = new Department();
|
||||
$dep->Load($DEP_UID);
|
||||
$dep_manager = $dep->getDepManager();
|
||||
$manager = ($dep_manager=='')? true : false;
|
||||
foreach ($aUsers as $USR_UID){
|
||||
$dep->addUserToDepartment($DEP_UID, $USR_UID, $manager, false);
|
||||
$manager = false;
|
||||
}
|
||||
$dep->updateDepartmentManager($DEP_UID);
|
||||
break;
|
||||
case 'deleteDepartmentToUserMultiple':
|
||||
$DEP_UID = $_REQUEST['DEP_UID'];
|
||||
$uSERS = $_REQUEST['USR_UID'];
|
||||
$aUsers = explode(',',$uSERS);
|
||||
$dep = new Department();
|
||||
$dep->Load($DEP_UID);
|
||||
$manager = $dep->getDepManager();
|
||||
foreach ($aUsers as $USR_UID){
|
||||
$dep->removeUserFromDepartment($DEP_UID, $USR_UID);
|
||||
if ($USR_UID==$manager){
|
||||
$editDepto['DEP_UID'] = $DEP_UID;
|
||||
$editDepto['DEP_MANAGER'] = '';
|
||||
$dep->update($editDepto);
|
||||
$dep->updateDepartmentManager($DEP_UID);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
3
workflow/engine/templates/departments/departmentList.html
Executable file
3
workflow/engine/templates/departments/departmentList.html
Executable file
@@ -0,0 +1,3 @@
|
||||
<div style="padding: 15px">
|
||||
<div id="list-panel"></div>
|
||||
</div>
|
||||
435
workflow/engine/templates/departments/departmentList.js
Executable file
435
workflow/engine/templates/departments/departmentList.js
Executable file
@@ -0,0 +1,435 @@
|
||||
/*
|
||||
* @author: Qennix
|
||||
* Jan 31th, 2011
|
||||
*/
|
||||
|
||||
//Keyboard Events
|
||||
new Ext.KeyMap(document, {
|
||||
key: Ext.EventObject.F5,
|
||||
fn: function(keycode, e) {
|
||||
if (! e.ctrlKey) {
|
||||
if (Ext.isIE) {
|
||||
// IE6 doesn't allow cancellation of the F5 key, so trick it into
|
||||
// thinking some other key was pressed (backspace in this case)
|
||||
e.browserEvent.keyCode = 8;
|
||||
}
|
||||
e.stopEvent();
|
||||
document.location = document.location;
|
||||
}else{
|
||||
Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5');
|
||||
}
|
||||
}
|
||||
}
|
||||
//,
|
||||
//{
|
||||
// key: Ext.EventObject.DELETE,
|
||||
// fn: function(k,e){
|
||||
// var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
// //if (typeof dep_node != 'undefined')
|
||||
// //if(dep_node.attributes.leaf){
|
||||
// DeleteDepartmentAction();
|
||||
// //}
|
||||
// }
|
||||
//}
|
||||
);
|
||||
|
||||
var treePanel;
|
||||
var rootNode;
|
||||
|
||||
Ext.onReady(function() {
|
||||
Ext.QuickTips.init();
|
||||
|
||||
newButton = new Ext.Action({
|
||||
text: _('ID_NEW_DEPARTMENT'),
|
||||
iconCls: ' button_menu_ext ss_sprite ss_add',
|
||||
handler: NewRootDepartment
|
||||
});
|
||||
|
||||
newSubButton = new Ext.Action({
|
||||
text: _('ID_NEW_SUB_DEPARTMENT'),
|
||||
iconCls: ' button_menu_ext ss_sprite ss_add',
|
||||
handler: NewSubDepartment,
|
||||
disabled: true
|
||||
});
|
||||
|
||||
editButton = new Ext.Action({
|
||||
text: _('ID_EDIT'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_pencil',
|
||||
handler: EditDepartmentAction,
|
||||
disabled: true
|
||||
});
|
||||
|
||||
deleteButton = new Ext.Action({
|
||||
text: _('ID_DELETE'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_delete',
|
||||
handler: DeleteDepartmentAction,
|
||||
disabled: true
|
||||
});
|
||||
|
||||
usersButton = new Ext.Action({
|
||||
text: _('ID_USERS'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_user_add',
|
||||
handler: UsersButtonAction,
|
||||
disabled: true
|
||||
});
|
||||
|
||||
contextMenu = new Ext.menu.Menu({
|
||||
items: [newSubButton,'-',editButton, deleteButton,'-',usersButton]
|
||||
});
|
||||
|
||||
smodel = new Ext.tree.DefaultSelectionModel({
|
||||
listeners:{
|
||||
selectionchange: function(sm, node){
|
||||
editButton.enable();
|
||||
newSubButton.enable();
|
||||
usersButton.enable();
|
||||
if (!node){
|
||||
deleteButton.disable();
|
||||
}else{
|
||||
if (node.attributes.leaf){
|
||||
deleteButton.enable();
|
||||
}else{
|
||||
deleteButton.disable();
|
||||
}
|
||||
}
|
||||
//var tree = Ext.getCmp('treePanel');
|
||||
//alert(treePanel.getRootNode());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
comboStatusStore = new Ext.data.SimpleStore({
|
||||
fields: ['id','value'],
|
||||
data: [['ACTIVE',_('ID_ACTIVE')],['INACTIVE',_('ID_INACTIVE')]]
|
||||
});
|
||||
|
||||
comboDepManager = new Ext.data.GroupingStore( {
|
||||
proxy : new Ext.data.HttpProxy({
|
||||
url: 'departments_Ajax?action=usersByDepartment'
|
||||
}),
|
||||
reader : new Ext.data.JsonReader( {
|
||||
root: 'users',
|
||||
fields : [
|
||||
{name : 'USR_UID'},
|
||||
{name : 'USR_VALUE'}
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
newForm = new Ext.FormPanel({
|
||||
url: 'departments_Ajax?request=saveNewDepartment',
|
||||
frame: true,
|
||||
items:[
|
||||
{xtype: 'textfield', name: 'parent', hidden: true},
|
||||
{xtype: 'textfield', fieldLabel: _('ID_DEPARTMENT_NAME'), name: 'dep_name', width: 230, allowBlank: false}
|
||||
],
|
||||
buttons: [
|
||||
{text: _('ID_SAVE'), handler: SaveNewDepartment},
|
||||
{text: _('ID_CANCEL'), handler: CloseWindow}
|
||||
|
||||
],
|
||||
labelWidth: 120
|
||||
});
|
||||
|
||||
editForm = new Ext.FormPanel({
|
||||
url: 'departments_Ajax?request=saveEditDepartment',
|
||||
frame: true,
|
||||
items:[
|
||||
{xtype: 'textfield', name: 'dep_uid', hidden: true},
|
||||
{xtype: 'textfield', name: 'dep_parent', hidden: true},
|
||||
{xtype: 'textfield', fieldLabel: _('ID_DEPARTMENT_NAME'), name: 'dep_name', width: 230, allowBlank: false},
|
||||
{
|
||||
xtype: 'combo',
|
||||
fieldLabel: _('ID_STATUS'),
|
||||
hiddenName: 'status',
|
||||
typeAhead: true,
|
||||
mode: 'local',
|
||||
store: comboStatusStore,
|
||||
displayField: 'value',
|
||||
valueField:'id',
|
||||
allowBlank: false,
|
||||
triggerAction: 'all',
|
||||
emptyText: _('ID_SELECT_STATUS'),
|
||||
selectOnFocus:true
|
||||
}
|
||||
,
|
||||
{
|
||||
xtype: 'combo',
|
||||
fieldLabel: 'Manager',
|
||||
hiddenName: 'manager',
|
||||
typeAhead: true,
|
||||
mode: 'local',
|
||||
store: comboDepManager,
|
||||
displayField: 'USR_VALUE',
|
||||
valueField:'USR_UID',
|
||||
allowBlank: true,
|
||||
triggerAction: 'all',
|
||||
emptyText: '',
|
||||
selectOnFocus:true
|
||||
}
|
||||
],
|
||||
buttons: [
|
||||
{text: _('ID_SAVE'), handler: SaveEditDepartment},
|
||||
{text: _('ID_CANCEL'), handler: CloseWindow}
|
||||
],
|
||||
labelWidth: 120
|
||||
});
|
||||
|
||||
rootNode = new Ext.tree.AsyncTreeNode({
|
||||
text:'Departments'
|
||||
});
|
||||
|
||||
|
||||
treePanel = new Ext.ux.tree.TreeGrid({
|
||||
title: _('ID_DEPARTMENTS'),
|
||||
autoScroll: true,
|
||||
width: 720,
|
||||
height: 300,
|
||||
id: 'treePanel',
|
||||
columns:[{
|
||||
header: _('ID_DEPARTMENT_NAME'),
|
||||
dataIndex: 'DEP_TITLE',
|
||||
width: 320
|
||||
},{
|
||||
header: _('ID_STATUS'),
|
||||
width: 100,
|
||||
dataIndex: 'DEP_STATUS',
|
||||
align: 'center',
|
||||
tpl: new Ext.XTemplate('{DEP_STATUS:this.formatStatus}', {
|
||||
formatStatus: function(v) {
|
||||
switch(v){
|
||||
case 'ACTIVE': return '<font color="green">' + _('ID_ACTIVE') + '</font>'; break;
|
||||
case 'INACTIVE': return '<font color="red">' + _('ID_INACTIVE') + '</font>'; break;
|
||||
}
|
||||
}
|
||||
})
|
||||
},{
|
||||
header: _('ID_MANAGER'),
|
||||
width: 220,
|
||||
dataIndex: 'DEP_MANAGER_NAME'
|
||||
},{
|
||||
header: _('ID_USERS'),
|
||||
width: 80,
|
||||
dataIndex: 'DEP_TOTAL_USERS',
|
||||
align: 'center',
|
||||
sortType: 'asFloat'
|
||||
}
|
||||
],
|
||||
selModel: smodel,
|
||||
tbar: [newButton,'-',newSubButton,'-',editButton, deleteButton,'-',usersButton],
|
||||
dataUrl:'departments_Ajax?action=departmentList',
|
||||
root: rootNode
|
||||
});
|
||||
|
||||
treePanel.on('contextmenu', treeContextHandler);
|
||||
|
||||
viewport = new Ext.Viewport({
|
||||
layout: 'fit',
|
||||
autoScroll: false,
|
||||
items: [treePanel]
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
//Funtion Handles Context Menu Opening
|
||||
treeContextHandler = function(node, evt){
|
||||
node.select();
|
||||
var coords = evt.getXY();
|
||||
contextMenu.showAt([coords[0], coords[1]]);
|
||||
};
|
||||
|
||||
//Do Nothing Function
|
||||
DoNothing = function(){};
|
||||
|
||||
//Call New Department at Root
|
||||
NewRootDepartment = function(){
|
||||
newForm.getForm().findField('parent').setValue('');
|
||||
w = new Ext.Window({
|
||||
title: _('ID_NEW_DEPARTMENT'),
|
||||
autoHeight: true,
|
||||
modal: true,
|
||||
closable: false,
|
||||
width: 420,
|
||||
items: [newForm]
|
||||
});
|
||||
w.show();
|
||||
};
|
||||
|
||||
//Call New Sub Department at Parent
|
||||
NewSubDepartment = function(){
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
newForm.getForm().findField('parent').setValue(dep_node.attributes.DEP_UID);
|
||||
w = new Ext.Window({
|
||||
title: _('ID_NEW_SUB_DEPARTMENT'),
|
||||
autoHeight: true,
|
||||
modal: true,
|
||||
closable: false,
|
||||
width: 420,
|
||||
items: [newForm]
|
||||
});
|
||||
w.show();
|
||||
};
|
||||
|
||||
//Close PopUp Window
|
||||
CloseWindow = function(){
|
||||
w.hide();
|
||||
};
|
||||
|
||||
SaveNewDepartment = function(){
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
if (dep_node) dep_node.unselect();
|
||||
var dep_name = newForm.getForm().findField('dep_name').getValue();
|
||||
var dep_parent = newForm.getForm().findField('parent').getValue();
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'checkDepartmentName', name: dep_name, parent: dep_parent},
|
||||
success: function(resp, opt){
|
||||
var res_ok = eval(resp.responseText);
|
||||
if (res_ok){
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'saveDepartment', name: dep_name, parent: dep_parent},
|
||||
success: function(r,o){
|
||||
var xtree = Ext.getCmp('treePanel');
|
||||
treePanel.getLoader().load(rootNode);
|
||||
newSubButton.disable();
|
||||
editButton.disable();
|
||||
deleteButton.disable();
|
||||
usersButton.disable();
|
||||
newForm.getForm().findField('dep_name').reset();
|
||||
w.hide();
|
||||
PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_NEW'));
|
||||
},
|
||||
failure: function(r,o){
|
||||
DoNothing();
|
||||
}
|
||||
});
|
||||
}else{
|
||||
PMExt.error(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_EXISTS'));
|
||||
}
|
||||
},
|
||||
failure: function(resp, opt){
|
||||
DoNothing();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
SaveEditDepartment = function(){
|
||||
var dep_name = editForm.getForm().findField('dep_name').getValue();
|
||||
var dep_parent = editForm.getForm().findField('dep_parent').getValue();
|
||||
var dep_uid = editForm.getForm().findField('dep_uid').getValue();
|
||||
var dep_status = editForm.getForm().findField('status').getValue();
|
||||
var dep_manager = editForm.getForm().findField('manager').getValue();
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
if (dep_node) dep_node.unselect();
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'checkEditDepartmentName', name: dep_name, parent: dep_parent, uid: dep_uid},
|
||||
success: function(resp, opt){
|
||||
var res_ok = eval(resp.responseText);
|
||||
if (res_ok){
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'updateDepartment', uid: dep_uid, name: dep_name, status: dep_status, manager: dep_manager},
|
||||
success: function(r,o){
|
||||
var xtree = Ext.getCmp('treePanel');
|
||||
xtree.getLoader().load(xtree.root);
|
||||
newSubButton.disable();
|
||||
editButton.disable();
|
||||
deleteButton.disable();
|
||||
usersButton.disable();
|
||||
newForm.getForm().findField('dep_name').reset();
|
||||
w.hide();
|
||||
PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_UPDATE'));
|
||||
},
|
||||
failure: function(r,o){
|
||||
DoNothing();
|
||||
}
|
||||
});
|
||||
}else{
|
||||
PMExt.error(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_EXISTS'));
|
||||
}
|
||||
},
|
||||
failure: function(resp, opt){
|
||||
DoNothing();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
//Edit Department Action
|
||||
EditDepartmentAction = function(){
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
editForm.getForm().findField('dep_uid').setValue(dep_node.attributes.DEP_UID);
|
||||
editForm.getForm().findField('dep_parent').setValue(dep_node.attributes.DEP_PARENT);
|
||||
editForm.getForm().findField('dep_name').setValue(dep_node.attributes.DEP_TITLE);
|
||||
editForm.getForm().findField('status').setValue(dep_node.attributes.DEP_STATUS);
|
||||
editForm.getForm().findField('manager').getStore().addListener('load',function(s,r,o){
|
||||
editForm.getForm().findField('manager').setValue(dep_node.attributes.DEP_MANAGER);
|
||||
});
|
||||
editForm.getForm().findField('manager').store.load({params: {DEP_UID: dep_node.attributes.DEP_UID }});
|
||||
w = new Ext.Window({
|
||||
title: _('ID_EDIT_DEPARTMENT'),
|
||||
autoHeight: true,
|
||||
modal: true,
|
||||
closable: false,
|
||||
width: 420,
|
||||
items: [editForm]
|
||||
});
|
||||
w.show();
|
||||
};
|
||||
|
||||
//Delete Department Action
|
||||
DeleteDepartmentAction = function(){
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
var DEP_UID = dep_node.attributes.DEP_UID;
|
||||
if (dep_node) dep_node.unselect();
|
||||
viewport.getEl().mask(_('ID_PROCESSING'));
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'canDeleteDepartment', dep_uid: DEP_UID },
|
||||
success: function(r,o){
|
||||
viewport.getEl().unmask();
|
||||
var response = Ext.util.JSON.decode(r.responseText);
|
||||
if (response.success){
|
||||
|
||||
Ext.Msg.confirm(_('ID_DEPARTMENTS'), _('ID_CONFIRM_DELETE_DEPARTMENT'),
|
||||
function(btn, text){
|
||||
if (btn=='yes'){
|
||||
viewport.getEl().mask(_('ID_PROCESSING'));
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'deleteDepartment', DEP_UID: DEP_UID},
|
||||
success: function(r,o){
|
||||
viewport.getEl().unmask();
|
||||
treePanel.getRootNode().reload();
|
||||
newSubButton.disable();
|
||||
editButton.disable();
|
||||
deleteButton.disable();
|
||||
usersButton.disable();
|
||||
PMExt.notify(_('ID_DEPARTMENTS'), _('ID_DEPARTMENT_SUCCESS_DELETE'));
|
||||
},
|
||||
failure: function(r,o){
|
||||
viewport.getEl().unmask();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}else{
|
||||
PMExt.error(_('ID_DEPARTMENTS'),_('ID_MSG_CANNOT_DELETE_DEPARTMENT'));
|
||||
}
|
||||
},
|
||||
failure: function(r,o){
|
||||
viewport.getEl().unmask();
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
//User Assined Action
|
||||
UsersButtonAction = function(){
|
||||
var dep_node = Ext.getCmp('treePanel').getSelectionModel().getSelectedNode();
|
||||
var DEP_UID = dep_node.attributes.DEP_UID;
|
||||
location.href= 'departmentUsers?dUID=' + DEP_UID;
|
||||
};
|
||||
4
workflow/engine/templates/departments/departmentUsers.html
Executable file
4
workflow/engine/templates/departments/departmentUsers.html
Executable file
@@ -0,0 +1,4 @@
|
||||
<div style="padding: 15px">
|
||||
<div id="list-panel"></div>
|
||||
</div>
|
||||
|
||||
478
workflow/engine/templates/departments/departmentUsers.js
Executable file
478
workflow/engine/templates/departments/departmentUsers.js
Executable file
@@ -0,0 +1,478 @@
|
||||
/*
|
||||
* @author: Qennix
|
||||
* Feb 10th, 2011
|
||||
*/
|
||||
|
||||
//Keyboard Events
|
||||
new Ext.KeyMap(document, {
|
||||
key: Ext.EventObject.F5,
|
||||
fn: function(keycode, e) {
|
||||
if (! e.ctrlKey) {
|
||||
if (Ext.isIE) {
|
||||
// IE6 doesn't allow cancellation of the F5 key, so trick it into
|
||||
// thinking some other key was pressed (backspace in this case)
|
||||
e.browserEvent.keyCode = 8;
|
||||
}
|
||||
e.stopEvent();
|
||||
document.location = document.location;
|
||||
}else{
|
||||
Ext.Msg.alert('Refresh', 'You clicked: CTRL-F5');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var storeP;
|
||||
var storeA;
|
||||
var cmodelP;
|
||||
var smodelA;
|
||||
var smodelP;
|
||||
var availableGrid;
|
||||
var assignedGrid;
|
||||
var GroupsPanel;
|
||||
var AuthenticationPanel;
|
||||
var northPanel;
|
||||
var tabsPanel;
|
||||
var viewport;
|
||||
var assignButton;
|
||||
var assignAllButton;
|
||||
var removeButton;
|
||||
var removeAllButton;
|
||||
var backButton;
|
||||
var discardChangesButton;
|
||||
var saveChangesButton;
|
||||
var sw_func_groups;
|
||||
//var sw_func_reassign;
|
||||
var sw_func_auth;
|
||||
var sw_form_changed;
|
||||
var sw_user_summary;
|
||||
|
||||
Ext.onReady(function(){
|
||||
sw_func_groups = false;
|
||||
//sw_func_reassign = false;
|
||||
sw_func_auth = false;
|
||||
sw_user_summary = false;
|
||||
|
||||
editMembersButton = new Ext.Action({
|
||||
text: _('ID_EDIT_USERS'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_user_add',
|
||||
handler: EditMembersAction
|
||||
});
|
||||
|
||||
cancelEditMembersButton = new Ext.Action({
|
||||
text: _('ID_FINISH_EDITION'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_cancel',
|
||||
handler: CancelEditMembersAction,
|
||||
hidden: true
|
||||
});
|
||||
|
||||
backButton = new Ext.Action({
|
||||
text : _('ID_BACK'),
|
||||
iconCls: 'button_menu_ext ss_sprite ss_arrow_redo',
|
||||
handler: BackToUsers
|
||||
});
|
||||
|
||||
// saveChangesButton = new Ext.Action({
|
||||
// text: _('ID_SAVE_CHANGES'),
|
||||
// //iconCls: 'button_menu_ext ss_sprite ss_arrow_redo',
|
||||
// handler: SaveChangesAuthForm,
|
||||
// disabled: true
|
||||
// });
|
||||
|
||||
// discardChangesButton = new Ext.Action({
|
||||
// text: _('ID_DISCARD_CHANGES'),
|
||||
// //iconCls: 'button_menu_ext ss_sprite ss_arrow_redo',
|
||||
// handler: LoadAuthForm,
|
||||
// disabled: true
|
||||
// });
|
||||
|
||||
storeP = new Ext.data.GroupingStore( {
|
||||
proxy : new Ext.data.HttpProxy({
|
||||
url: 'departments_Ajax?action=assignedUsers&dUID=' + DEPARTMENT.DEP_UID
|
||||
}),
|
||||
reader : new Ext.data.JsonReader( {
|
||||
root: 'users',
|
||||
fields : [
|
||||
{name : 'USR_UID'},
|
||||
{name : 'USR_USERNAME'},
|
||||
{name : 'USR_FIRSTNAME'},
|
||||
{name : 'USR_LASTNAME'}
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
storeA = new Ext.data.GroupingStore( {
|
||||
proxy : new Ext.data.HttpProxy({
|
||||
url: 'departments_Ajax?action=availableUsers&dUID=' + DEPARTMENT.DEP_UID
|
||||
}),
|
||||
reader : new Ext.data.JsonReader( {
|
||||
root: 'users',
|
||||
fields : [
|
||||
{name : 'USR_UID'},
|
||||
{name : 'USR_USERNAME'},
|
||||
{name : 'USR_FIRSTNAME'},
|
||||
{name : 'USR_LASTNAME'}
|
||||
]
|
||||
})
|
||||
});
|
||||
|
||||
cmodelP = new Ext.grid.ColumnModel({
|
||||
defaults: {
|
||||
width: 50,
|
||||
sortable: true
|
||||
},
|
||||
columns: [
|
||||
{id:'USR_UID', dataIndex: 'USR_UID', hidden:true, hideable:false},
|
||||
{header: _('ID_FULL_NAME'), dataIndex: 'USR_USERNAME', width: 60, align:'left', renderer: show_user}
|
||||
]
|
||||
});
|
||||
|
||||
smodelA = new Ext.grid.RowSelectionModel({
|
||||
selectSingle: false,
|
||||
listeners:{
|
||||
selectionchange: function(sm){
|
||||
switch(sm.getCount()){
|
||||
case 0: Ext.getCmp('assignButton').disable(); break;
|
||||
default: Ext.getCmp('assignButton').enable(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
smodelP = new Ext.grid.RowSelectionModel({
|
||||
selectSingle: false,
|
||||
listeners:{
|
||||
selectionchange: function(sm){
|
||||
switch(sm.getCount()){
|
||||
case 0: Ext.getCmp('removeButton').disable(); break;
|
||||
default: Ext.getCmp('removeButton').enable(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
searchTextA = new Ext.form.TextField ({
|
||||
id: 'searchTextA',
|
||||
ctCls:'pm_search_text_field',
|
||||
allowBlank: true,
|
||||
width: 110,
|
||||
emptyText: _('ID_ENTER_SEARCH_TERM'),
|
||||
listeners: {
|
||||
specialkey: function(f,e){
|
||||
if (e.getKey() == e.ENTER) {
|
||||
DoSearchA();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
clearTextButtonA = new Ext.Action({
|
||||
text: 'X',
|
||||
ctCls:'pm_search_x_button',
|
||||
handler: GridByDefaultA
|
||||
});
|
||||
|
||||
searchTextP = new Ext.form.TextField ({
|
||||
id: 'searchTextP',
|
||||
ctCls:'pm_search_text_field',
|
||||
allowBlank: true,
|
||||
width: 110,
|
||||
emptyText: _('ID_ENTER_SEARCH_TERM'),
|
||||
listeners: {
|
||||
specialkey: function(f,e){
|
||||
if (e.getKey() == e.ENTER) {
|
||||
DoSearchP();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
clearTextButtonP = new Ext.Action({
|
||||
text: 'X',
|
||||
ctCls:'pm_search_x_button',
|
||||
handler: GridByDefaultP
|
||||
});
|
||||
|
||||
availableGrid = new Ext.grid.GridPanel({
|
||||
layout : 'fit',
|
||||
region : 'center',
|
||||
ddGroup : 'assignedGridDDGroup',
|
||||
store : storeA,
|
||||
cm : cmodelP,
|
||||
sm : smodelA,
|
||||
enableDragDrop : true,
|
||||
stripeRows : true,
|
||||
autoExpandColumn: 'CON_VALUE',
|
||||
iconCls : 'icon-grid',
|
||||
id : 'availableGrid',
|
||||
height : 100,
|
||||
autoWidth : true,
|
||||
stateful : true,
|
||||
stateId : 'grid',
|
||||
enableColumnResize : true,
|
||||
enableHdMenu : true,
|
||||
frame : false,
|
||||
columnLines : false,
|
||||
viewConfig : {forceFit:true},
|
||||
tbar: [_('ID_AVAILABLE_USERS'),{xtype: 'tbfill'},'-',searchTextA,clearTextButtonA],
|
||||
//bbar: [{xtype: 'tbfill'}, cancelEditMembersButton],
|
||||
listeners: {rowdblclick: AssignGroupsAction},
|
||||
hidden: true
|
||||
});
|
||||
|
||||
assignedGrid = new Ext.grid.GridPanel({
|
||||
layout : 'fit',
|
||||
ddGroup : 'availableGridDDGroup',
|
||||
store : storeP,
|
||||
cm : cmodelP,
|
||||
sm : smodelP,
|
||||
enableDragDrop : true,
|
||||
stripeRows : true,
|
||||
autoExpandColumn: 'CON_VALUE',
|
||||
iconCls : 'icon-grid',
|
||||
id : 'assignedGrid',
|
||||
height : 100,
|
||||
autoWidth : true,
|
||||
stateful : true,
|
||||
stateId : 'grid',
|
||||
enableColumnResize : true,
|
||||
enableHdMenu : true,
|
||||
frame : false,
|
||||
columnLines : false,
|
||||
viewConfig : {forceFit:true},
|
||||
tbar: [_('ID_ASSIGNED_USERS'),{xtype: 'tbfill'},'-',searchTextP,clearTextButtonP],
|
||||
//bbar: [{xtype: 'tbfill'},editMembersButton],
|
||||
listeners: {rowdblclick: function(){
|
||||
(availableGrid.hidden)? DoNothing() : RemoveGroupsAction();
|
||||
}}
|
||||
});
|
||||
|
||||
buttonsPanel = new Ext.Panel({
|
||||
width : 40,
|
||||
layout : {
|
||||
type:'vbox',
|
||||
padding:'0',
|
||||
pack:'center',
|
||||
align:'center'
|
||||
},
|
||||
defaults:{margins:'0 0 35 0'},
|
||||
items:[
|
||||
{xtype:'button',text: '>', handler: AssignGroupsAction, id: 'assignButton', disabled: true},
|
||||
{xtype:'button',text: '<', handler: RemoveGroupsAction, id: 'removeButton', disabled: true},
|
||||
{xtype:'button',text: '>>', handler: AssignAllGroupsAction, id: 'assignButtonAll', disabled: false},
|
||||
{xtype:'button',text: '<<', handler: RemoveAllGroupsAction, id: 'removeButtonAll', disabled: false}
|
||||
],
|
||||
hidden: true
|
||||
});
|
||||
|
||||
//GROUPS DRAG AND DROP PANEL
|
||||
UsersPanel = new Ext.Panel({
|
||||
region: 'center',
|
||||
//title : _('ID_USERS'),
|
||||
autoWidth : true,
|
||||
layout : 'hbox',
|
||||
defaults : { flex : 1 }, //auto stretch
|
||||
layoutConfig : { align : 'stretch' },
|
||||
items : [availableGrid,buttonsPanel,assignedGrid],
|
||||
viewConfig : {forceFit:true},
|
||||
bbar: [{xtype: 'tbfill'},editMembersButton, cancelEditMembersButton]
|
||||
});
|
||||
|
||||
//NORTH PANEL WITH TITLE AND ROLE DETAILS
|
||||
northPanel = new Ext.Panel({
|
||||
region: 'north',
|
||||
xtype: 'panel',
|
||||
tbar: ['<b>'+_('ID_DEPARTMENT') + ' : ' + DEPARTMENT.DEP_TITLE + '</b>',{xtype: 'tbfill'},backButton]
|
||||
});
|
||||
|
||||
|
||||
|
||||
//LOAD ALL PANELS
|
||||
viewport = new Ext.Viewport({
|
||||
layout: 'border',
|
||||
items: [northPanel, UsersPanel]
|
||||
});
|
||||
|
||||
RefreshUsers();
|
||||
DDLoadUsers();
|
||||
|
||||
});
|
||||
|
||||
//Do Nothing Function
|
||||
DoNothing = function(){};
|
||||
|
||||
//Return to Roles Main Page
|
||||
BackToUsers = function(){
|
||||
location.href = 'departments';
|
||||
};
|
||||
|
||||
//Loads Drag N Drop Functionality for Permissions
|
||||
DDLoadUsers = function(){
|
||||
//GROUPS DRAG N DROP AVAILABLE
|
||||
var availableGridDropTargetEl = availableGrid.getView().scroller.dom;
|
||||
var availableGridDropTarget = new Ext.dd.DropTarget(availableGridDropTargetEl, {
|
||||
ddGroup : 'availableGridDDGroup',
|
||||
notifyDrop : function(ddSource, e, data){
|
||||
var records = ddSource.dragData.selections;
|
||||
var arrAux = new Array();
|
||||
for (var r=0; r < records.length; r++){
|
||||
arrAux[r] = records[r].data['USR_UID'];
|
||||
}
|
||||
DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
//GROUPS DRAG N DROP ASSIGNED
|
||||
var assignedGridDropTargetEl = assignedGrid.getView().scroller.dom;
|
||||
var assignedGridDropTarget = new Ext.dd.DropTarget(assignedGridDropTargetEl, {
|
||||
ddGroup : 'assignedGridDDGroup',
|
||||
notifyDrop : function(ddSource, e, data){
|
||||
var records = ddSource.dragData.selections;
|
||||
var arrAux = new Array();
|
||||
for (var r=0; r < records.length; r++){
|
||||
arrAux[r] = records[r].data['USR_UID'];
|
||||
}
|
||||
SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
sw_func_groups = true;
|
||||
};
|
||||
|
||||
//REFRESH GROUPS GRIDS
|
||||
RefreshUsers = function(){
|
||||
DoSearchA();
|
||||
DoSearchP();
|
||||
};
|
||||
|
||||
//FAILURE AJAX FUNCTION
|
||||
FailureProcess = function(){
|
||||
Ext.Msg.alert(_('ID_DEPARTMENTS'), _('ID_MSG_AJAX_FAILURE'));
|
||||
};
|
||||
|
||||
//ASSIGN USERS TO A DEPARTMENT
|
||||
SaveDepartmentUser = function(arr_usr, function_success, function_failure){
|
||||
var sw_response;
|
||||
viewport.getEl().mask(_('ID_PROCESSING'));
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'assignDepartmentToUserMultiple', DEP_UID: DEPARTMENT.DEP_UID, USR_UID: arr_usr.join(',')},
|
||||
success: function(){
|
||||
function_success();
|
||||
viewport.getEl().unmask();
|
||||
},
|
||||
failure: function(){
|
||||
function_failure();
|
||||
viewport.getEl().unmask();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
//REMOVE USERS FROM A DEPARTMENT
|
||||
DeleteDepartmentUser = function(arr_usr, function_success, function_failure){
|
||||
var sw_response;
|
||||
viewport.getEl().mask(_('ID_PROCESSING'));
|
||||
Ext.Ajax.request({
|
||||
url: 'departments_Ajax',
|
||||
params: {action: 'deleteDepartmentToUserMultiple', DEP_UID: DEPARTMENT.DEP_UID, USR_UID: arr_usr.join(',')},
|
||||
success: function(){
|
||||
function_success();
|
||||
viewport.getEl().unmask();
|
||||
},
|
||||
failure: function(){
|
||||
function_failure();
|
||||
viewport.getEl().unmask();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
//AssignButton Functionality
|
||||
AssignGroupsAction = function(){
|
||||
rowsSelected = availableGrid.getSelectionModel().getSelections();
|
||||
var arrAux = new Array();
|
||||
for(var a=0; a < rowsSelected.length; a++){
|
||||
arrAux[a] = rowsSelected[a].get('USR_UID');
|
||||
}
|
||||
SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
};
|
||||
|
||||
//RemoveButton Functionality
|
||||
RemoveGroupsAction = function(){
|
||||
rowsSelected = assignedGrid.getSelectionModel().getSelections();
|
||||
var arrAux = new Array();
|
||||
for(var a=0; a < rowsSelected.length; a++){
|
||||
arrAux[a] = rowsSelected[a].get('USR_UID');
|
||||
}
|
||||
DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
};
|
||||
|
||||
//AssignALLButton Functionality
|
||||
AssignAllGroupsAction = function(){
|
||||
var allRows = availableGrid.getStore();
|
||||
var arrAux = new Array();
|
||||
if (allRows.getCount()>0){
|
||||
for (var r=0; r < allRows.getCount(); r++){
|
||||
row = allRows.getAt(r);
|
||||
arrAux[r] = row.data['USR_UID'];
|
||||
}
|
||||
SaveDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
}
|
||||
};
|
||||
|
||||
//RevomeALLButton Functionality
|
||||
RemoveAllGroupsAction = function(){
|
||||
var allRows = assignedGrid.getStore();
|
||||
var arrAux = new Array();
|
||||
if (allRows.getCount()>0){
|
||||
for (var r=0; r < allRows.getCount(); r++){
|
||||
row = allRows.getAt(r);
|
||||
arrAux[r] = row.data['USR_UID'];
|
||||
}
|
||||
DeleteDepartmentUser(arrAux,RefreshUsers,FailureProcess);
|
||||
}
|
||||
};
|
||||
|
||||
//Function DoSearch Available
|
||||
DoSearchA = function(){
|
||||
availableGrid.store.load({params: {textFilter: searchTextA.getValue()}});
|
||||
};
|
||||
|
||||
//Function DoSearch Assigned
|
||||
DoSearchP = function(){
|
||||
assignedGrid.store.load({params: {textFilter: searchTextP.getValue()}});
|
||||
};
|
||||
|
||||
//Load Grid By Default Available Members
|
||||
GridByDefaultA = function(){
|
||||
searchTextA.reset();
|
||||
availableGrid.store.load();
|
||||
};
|
||||
|
||||
//Load Grid By Default Assigned Members
|
||||
GridByDefaultP = function(){
|
||||
searchTextP.reset();
|
||||
assignedGrid.store.load();
|
||||
};
|
||||
|
||||
//edit members action
|
||||
EditMembersAction = function(){
|
||||
availableGrid.show();
|
||||
buttonsPanel.show();
|
||||
editMembersButton.hide();
|
||||
cancelEditMembersButton.show();
|
||||
UsersPanel.doLayout();
|
||||
};
|
||||
|
||||
//CancelEditMenbers Function
|
||||
CancelEditMembersAction = function(){
|
||||
availableGrid.hide();
|
||||
buttonsPanel.hide();
|
||||
editMembersButton.show();
|
||||
cancelEditMembersButton.hide();
|
||||
UsersPanel.doLayout();
|
||||
};
|
||||
|
||||
//Render Full User Name
|
||||
show_user = function(v,i,s){
|
||||
return _FNF(v,s.data.USR_FIRSTNAME, s.data.USR_LASTNAME);
|
||||
};
|
||||
@@ -49,6 +49,9 @@
|
||||
|
||||
$htmlDpto = lookforchildren( '' , 0);
|
||||
|
||||
print_r($htmlDpto);
|
||||
die;
|
||||
|
||||
$content = $template->getOutputContent();
|
||||
print $content;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user