diff --git a/workflow/engine/classes/model/CalendarDefinition.php b/workflow/engine/classes/model/CalendarDefinition.php index 50d39be5d..862fdca24 100755 --- a/workflow/engine/classes/model/CalendarDefinition.php +++ b/workflow/engine/classes/model/CalendarDefinition.php @@ -61,6 +61,40 @@ class CalendarDefinition extends BaseCalendarDefinition { return $return; } } + //Added by qennix + //Gets criteria for listing + function getCalendarCriterias($filter, $start, $limit){ + $Criteria = new Criteria ( 'workflow' ); + $Criteria->clearSelectColumns (); + $Criteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_UID ); + if ($filter !=''){ + $Criteria->add( + $Criteria->getNewCriterion(CalendarDefinitionPeer::CALENDAR_NAME,'%'.$filter.'%',Criteria::LIKE)->addOr( + $Criteria->getNewCriterion(CalendarDefinitionPeer::CALENDAR_DESCRIPTION,'%'.$filter.'%',Criteria::LIKE))); + } + $Criteria->add(CalendarDefinitionPeer::CALENDAR_STATUS,'DELETED',Criteria::NOT_EQUAL); + + $oCriteria = new Criteria ( 'workflow' ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_UID ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_NAME ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_CREATE_DATE ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_UPDATE_DATE ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_DESCRIPTION ); + $oCriteria->addSelectColumn ( CalendarDefinitionPeer::CALENDAR_STATUS ); + if ($filter !=''){ + $oCriteria->add( + $oCriteria->getNewCriterion(CalendarDefinitionPeer::CALENDAR_NAME,'%'.$filter.'%',Criteria::LIKE)->addOr( + $oCriteria->getNewCriterion(CalendarDefinitionPeer::CALENDAR_DESCRIPTION,'%'.$filter.'%',Criteria::LIKE))); + } + $oCriteria->add(CalendarDefinitionPeer::CALENDAR_STATUS,'DELETED',Criteria::NOT_EQUAL); + $oCriteria->setLimit($limit); + $oCriteria->setOffset($start); + + $criterias = array(); + $criterias['COUNTER'] = $Criteria; + $criterias['LIST'] = $oCriteria; + return $criterias; + } function getCalendarInfo($CalendarUid) { //if exists the row in the database propel will update it, otherwise will insert. $tr = CalendarDefinitionPeer::retrieveByPK ( $CalendarUid ); @@ -342,4 +376,21 @@ class CalendarDefinition extends BaseCalendarDefinition { } } + //Added by Qennix + //Counts all users,task,process by calendar + function getAllCounterByCalendar($type){ + $oCriteria = new Criteria('workflow'); + $oCriteria->addSelectColumn(CalendarAssignmentsPeer::CALENDAR_UID); + $oCriteria->addSelectColumn('COUNT(*) AS CNT'); + $oCriteria->addGroupByColumn(CalendarAssignmentsPeer::CALENDAR_UID); + $oCriteria->add(CalendarAssignmentsPeer::OBJECT_TYPE,$type); + $oDataset = CalendarAssignmentsPeer::doSelectRS($oCriteria); + $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC); + $aCounter = Array(); + while($oDataset->next()){ + $row = $oDataset->getRow(); + $aCounter[$row['CALENDAR_UID']] = $row['CNT']; + } + return $aCounter; + } } // CalendarDefinition \ No newline at end of file diff --git a/workflow/engine/methods/setup/calendarList.php b/workflow/engine/methods/setup/calendarList.php index 0dd287757..4355574c2 100644 --- a/workflow/engine/methods/setup/calendarList.php +++ b/workflow/engine/methods/setup/calendarList.php @@ -34,15 +34,18 @@ $G_SUB_MENU = 'setup'; $G_ID_MENU_SELECTED = 'SETUP'; $G_ID_SUB_MENU_SELECTED = 'CALENDAR'; -$dbc = new DBConnection ( ); -$G_PUBLISH = new Publisher ( ); +$G_PUBLISH = new Publisher; -G::LoadClass ( "calendar" ); -$Calendar = new Calendar ( ); -$Criteria = $Calendar->getCalendarList ();//List all calendars (ACTIVE and INACTIVE) +G::LoadClass('configuration'); +$c = new Configurations(); +$configPage = $c->getConfiguration('calendarList', 'pageSize','',$_SESSION['USER_LOGGED']); +$Config['pageSize'] = isset($configPage['pageSize']) ? $configPage['pageSize'] : 20; -$G_PUBLISH->AddContent ( 'propeltable', 'paged-table', 'setup/calendarList', $Criteria, array (), '' ); +$oHeadPublisher =& headPublisher::getSingleton(); +$oHeadPublisher->addExtJsScript('setup/calendarList', false); //adding a javascript file .js +$oHeadPublisher->addContent('setup/calendarList'); //adding a html file .html. +$oHeadPublisher->assign('CONFIG', $Config); -G::RenderPage ( 'publishBlank','blank' ); +G::RenderPage('publish', 'extJs'); ?> \ No newline at end of file diff --git a/workflow/engine/methods/setup/calendar_Ajax.php b/workflow/engine/methods/setup/calendar_Ajax.php new file mode 100644 index 000000000..88b665cc7 --- /dev/null +++ b/workflow/engine/methods/setup/calendar_Ajax.php @@ -0,0 +1,102 @@ +. + * + * For more information, contact Colosa Inc, 2566 Le Jeune Rd., + * Coral Gables, FL, 33134, USA, or email info@colosa.com. + * + */ +if($RBAC->userCanAccess('PM_SETUP') != 1 && $RBAC->userCanAccess('PM_SETUP_ADVANCE') != 1){ + G::SendTemporalMessage('ID_USER_HAVENT_RIGHTS_PAGE', 'error', 'labels'); + //G::header('location: ../login/login'); + die; +} +$_POST['action'] = $_REQUEST['action']; + +switch ($_POST['action']) +{ + case 'calendarList': + G::LoadClass('configuration'); + G::LoadClass('calendar'); + + $co = new Configurations(); + $config = $co->getConfiguration('calendarList', 'pageSize','',$_SESSION['USER_LOGGED']); + + $limit_size = isset($config['pageSize']) ? $config['pageSize'] : 20; + $start = isset($_REQUEST['start']) ? $_REQUEST['start'] : 0; + $limit = isset($_REQUEST['limit']) ? $_REQUEST['limit'] : $limit_size; + $filter = isset($_REQUEST['textFilter']) ? $_REQUEST['textFilter'] : ''; + + $calendar = new calendar(); + $CRI = $calendar->getCalendarCriterias($filter, $start, $limit); + + $aUsers = $calendar->getAllCounterByCalendar('USER'); + $aTasks = $calendar->getAllCounterByCalendar('TASK'); + $aProcess = $calendar->getAllCounterByCalendar('PROCESS'); + + $total_cals = CalendarDefinitionPeer::doCount($CRI['COUNTER']); + + $oDataSet = CalendarDefinitionPeer::doSelectRS($CRI['LIST']); + $oDataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); + + $aCals = array(); + while ($oDataSet->next()){ + $aCals[] = $oDataSet->getRow(); + $index = sizeof($aCals)-1; + $aCals[$index]['TOTAL_USERS'] = isset($aUsers[$aCals[$index]['CALENDAR_UID']])? $aUsers[$aCals[$index]['CALENDAR_UID']]: 0; + $aCals[$index]['TOTAL_TASKS'] = isset($aTasks[$aCals[$index]['CALENDAR_UID']])? $aTasks[$aCals[$index]['CALENDAR_UID']]: 0; + $aCals[$index]['TOTAL_PROCESS'] = isset($aProcess[$aCals[$index]['CALENDAR_UID']])? $aProcess[$aCals[$index]['CALENDAR_UID']]: 0; + } + echo '{cals: '.G::json_encode($aCals).', total_cals: '.$total_cals.'}'; + break; + case 'updatePageSize': + G::LoadClass('configuration'); + $c = new Configurations(); + $arr['pageSize'] = $_REQUEST['size']; + $arr['dateSave'] = date('Y-m-d H:i:s'); + $config = Array(); + $config[] = $arr; + $c->aConfig = $config; + $c->saveConfig('calendarList', 'pageSize','',$_SESSION['USER_LOGGED']); + echo '{success: true}'; + break; + case 'canDeleteCalendar': + $cal_uid = $_POST['CAL_UID']; + G::LoadClass('calendar'); + $cal = new calendar(); + $total = 0; + $u = $cal->getAllCounterByCalendar('USER'); + $t_u = isset($u[$cal_uid]) ? $u[$cal_uid]: 0; + $t = $cal->getAllCounterByCalendar('TASK'); + $t_t = isset($t[$cal_uid]) ? $t[$cal_uid]: 0; + $p = $cal->getAllCounterByCalendar('PROCESS'); + $t_p = isset($p[$cal_uid]) ? $p[$cal_uid]: 0; + $total = $t_u + $t_t + $t_p; + $response = ($total==0)? 'true': 'false'; + echo '{success: '.$response.'}'; + break; + case 'deleteCalendar': + $CalendarUid = $_POST['CAL_UID']; + G::LoadClass('calendar'); + $calendarObj=new calendar(); + $calendarObj->deleteCalendar($CalendarUid); + echo '{success: true}'; + break; +} +?> \ No newline at end of file diff --git a/workflow/engine/templates/setup/calendarList.html b/workflow/engine/templates/setup/calendarList.html new file mode 100755 index 000000000..432f567b5 --- /dev/null +++ b/workflow/engine/templates/setup/calendarList.html @@ -0,0 +1,3 @@ +
+
+
diff --git a/workflow/engine/templates/setup/calendarList.js b/workflow/engine/templates/setup/calendarList.js new file mode 100755 index 000000000..b49bdd195 --- /dev/null +++ b/workflow/engine/templates/setup/calendarList.js @@ -0,0 +1,372 @@ +/* + * @author: Qennix + * Feb 22nd, 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){ + iGrid = Ext.getCmp('infoGrid'); + rowSelected = iGrid.getSelectionModel().getSelected(); + if (rowSelected){ + DeleteButtonAction(); + } + } +}, +{ + key: Ext.EventObject.F2, + fn: function(k,e){ + iGrid = Ext.getCmp('infoGrid'); + rowSelected = iGrid.getSelectionModel().getSelected(); + if (rowSelected){ + EditCalendarAction(); + } + } +} +]); + +var store; +var cmodel; +var infoGrid; +var viewport; +var smodel; + +var newButton; +var editButton; +var deleteButton; +var copyButton; +var searchButton; + +var searchText; +var contextMenu; +var pageSize; + +var cal_default = '00000000000000000000000000000001'; + +Ext.onReady(function(){ + Ext.QuickTips.init(); + + pageSize = parseInt(CONFIG.pageSize); + + newButton = new Ext.Action({ + text: _('ID_NEW'), + iconCls: 'button_menu_ext ss_sprite ss_add', + handler: NewCalendarAction + }); + + editButton = new Ext.Action({ + text: _('ID_EDIT'), + iconCls: 'button_menu_ext ss_sprite ss_pencil', + handler: EditCalendarAction, + disabled: true + }); + + deleteButton = new Ext.Action({ + text: _('ID_DELETE'), + iconCls: 'button_menu_ext ss_sprite ss_delete', + handler: DeleteButtonAction, + disabled: true + }); + + copyButton = new Ext.Action({ + text: _('ID_COPY'), + iconCls: 'button_menu_ext ss_sprite ss_calendar_add', + handler: CopyButtonAction, + disabled: true + }); + + searchButton = new Ext.Action({ + text: _('ID_SEARCH'), + handler: DoSearch + }); + + contextMenu = new Ext.menu.Menu({ + items: [editButton, deleteButton,'-',copyButton] + }); + + searchText = new Ext.form.TextField ({ + id: 'searchTxt', + ctCls:'pm_search_text_field', + allowBlank: true, + width: 150, + emptyText: _('ID_ENTER_SEARCH_TERM'), + listeners: { + specialkey: function(f,e){ + if (e.getKey() == e.ENTER) { + DoSearch(); + } + }, + focus: function(f,e) { + var row = infoGrid.getSelectionModel().getSelected(); + infoGrid.getSelectionModel().deselectRow(infoGrid.getStore().indexOf(row)); + } + } + }); + + clearTextButton = new Ext.Action({ + text: 'X', + ctCls:'pm_search_x_button', + handler: GridByDefault + }); + + + smodel = new Ext.grid.RowSelectionModel({ + singleSelect: true, + listeners:{ + rowselect: function(sm){ + editButton.enable(); + rowSelected = infoGrid.getSelectionModel().getSelected(); + (rowSelected.data.CALENDAR_UID == cal_default) ? deleteButton.disable() : deleteButton.enable(); + copyButton.enable(); + }, + rowdeselect: function(sm){ + editButton.disable(); + deleteButton.disable(); + copyButton.disable(); + } + } + }); + + store = new Ext.data.GroupingStore( { + proxy : new Ext.data.HttpProxy({ + url: 'calendar_Ajax?action=calendarList' + }), + reader : new Ext.data.JsonReader( { + root: 'cals', + totalProperty: 'total_cals', + fields : [ + {name : 'CALENDAR_UID'}, + {name : 'CALENDAR_NAME'}, + {name : 'CALENDAR_DESCRIPTION'}, + {name : 'CALENDAR_STATUS'}, + {name : 'TOTAL_USERS', type: 'int'}, + {name : 'TOTAL_PROCESS', type: 'int'}, + {name : 'TOTAL_TASKS', type: 'int'} + ] + }) + }); + + cmodel = new Ext.grid.ColumnModel({ + defaults: { + width: 50, + sortable: true + }, + columns: [ + {id:'CALENDAR_UID', dataIndex: 'CALENDAR_UID', hidden:true, hideable:false}, + {header: _('ID_NAME'), dataIndex: 'CALENDAR_NAME', width: 200, align:'left'}, + {header: _('ID_DESCRIPTION'), dataIndex: 'CALENDAR_DESCRIPTION', width: 200, align:'left'}, + {header: _('ID_STATUS'), dataIndex: 'CALENDAR_STATUS', width: 130, align:'center', renderer: render_status}, + {header: _('ID_USERS'), dataIndex: 'TOTAL_USERS', width: 69, align:'center'}, + {header: _('ID_PROCESSES'), dataIndex: 'TOTAL_PROCESS', width: 69, align:'center'}, + {header: _('ID_TASKS'), dataIndex: 'TOTAL_TASKS', width: 69, align:'center'} + ] + }); + + storePageSize = new Ext.data.SimpleStore({ + fields: ['size'], + data: [['20'],['30'],['40'],['50'],['100']], + autoLoad: true + }); + + comboPageSize = new Ext.form.ComboBox({ + typeAhead : false, + mode : 'local', + triggerAction : 'all', + store: storePageSize, + valueField: 'size', + displayField: 'size', + width: 50, + editable: false, + listeners:{ + select: function(c,d,i){ + UpdatePageConfig(d.data['size']); + bbarpaging.pageSize = parseInt(d.data['size']); + bbarpaging.moveFirst(); + } + } + }); + + comboPageSize.setValue(pageSize); + + bbarpaging = new Ext.PagingToolbar({ + pageSize: pageSize, + store: store, + displayInfo: true, + displayMsg: _('ID_GRID_PAGE_DISPLAYING_CALENDAR_MESSAGE') + '    ', + emptyMsg: _('ID_GRID_PAGE_NO_CALENDAR_MESSAGE'), + items: ['-',_('ID_PAGE_SIZE')+':',comboPageSize] + }); + + + infoGrid = new Ext.grid.GridPanel({ + region: 'center', + layout: 'fit', + id: 'infoGrid', + height:100, + autoWidth : true, + stateful : true, + stateId : 'grid', + enableColumnResize: true, + enableHdMenu: true, + frame:false, + //iconCls:'icon-grid', + columnLines: false, + viewConfig: { + forceFit:true + }, + title : _('ID_CALENDARS'), + store: store, + cm: cmodel, + sm: smodel, + tbar: [newButton, '-', editButton, deleteButton,'-',copyButton, {xtype: 'tbfill'}, searchText,clearTextButton,searchButton], + bbar: bbarpaging, + listeners: { + rowdblclick: EditCalendarAction + }, + view: new Ext.grid.GroupingView({ + forceFit:true, + groupTextTpl: '{text}' + }) + }); + + infoGrid.on('rowcontextmenu', + function (grid, rowIndex, evt) { + var sm = grid.getSelectionModel(); + sm.selectRow(rowIndex, sm.isSelected(rowIndex)); + }, + this + ); + + infoGrid.on('contextmenu', function(evt){evt.preventDefault();}, this); + infoGrid.addListener('rowcontextmenu',onMessageContextMenu, this); + infoGrid.store.load(); + + viewport = new Ext.Viewport({ + layout: 'fit', + autoScroll: false, + items: [ + infoGrid + ] + }); +}); + +//Funtion Handles Context Menu Opening +onMessageContextMenu = function (grid, rowIndex, e) { + e.stopEvent(); + var coords = e.getXY(); + contextMenu.showAt([coords[0], coords[1]]); +}; + +//Do Nothing Function +DoNothing = function(){}; + +//Open New Calendar +NewCalendarAction = function(){ + location.href = 'calendarEdit'; +}; + +//Load Grid By Default +GridByDefault = function(){ + searchText.reset(); + infoGrid.store.load(); +}; + +//Do Search Function +DoSearch = function(){ + infoGrid.store.load({params: {textFilter: searchText.getValue()}}); +}; + +//Edit Calendar Action +EditCalendarAction = function(){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + if (rowSelected){ + location.href = 'calendarEdit?id=' + rowSelected.data.CALENDAR_UID; + } +}; + +//Delete Button Action +DeleteButtonAction = function(){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'calendar_Ajax', + params: {action: 'canDeleteCalendar', CAL_UID: rowSelected.data.CALENDAR_UID}, + success: function(r,o){ + viewport.getEl().unmask(); + var resp = Ext.util.JSON.decode(r.responseText); + if (resp.success){ + Ext.Msg.confirm(_('ID_CONFIRM'),_('ID_CONFIRM_DELETE_CALENDAR'), + function(btn, text){ + if (btn=='yes'){ + viewport.getEl().mask(_('ID_PROCESSING')); + Ext.Ajax.request({ + url: 'calendar_Ajax', + params: {action: 'deleteCalendar', CAL_UID: rowSelected.data.CALENDAR_UID}, + success: function(r,o){ + viewport.getEl().unmask(); + editButton.disable(); + deleteButton.disable(); + copyButton.disable(); + DoSearch(); + PMExt.notify(_('ID_CALENDARS'),_('ID_CALENDAR_SUCCESS_DELETE')); + }, + failure: function(r,o){ + viewport.getEl().unmask(); + } + }); + } + } + ); + }else{ + PMExt.error(_('ID_CALENDARS'),_('ID_MSG_CANNOT_DELETE_CALENDAR')); + } + }, + failure: function(r,o){ + viewport.getEl().unmask(); + } + }); +}; + +//Render Status +render_status = function(v){ + switch(v){ + case 'ACTIVE': return '' + _('ID_ACTIVE') + ''; break; + case 'INACTIVE': return '' + _('ID_INACTIVE') + '';; break; + case 'VACATION': return '' + _('ID_VACATION') + '';; break; + } +}; + +//Members Button Action +CopyButtonAction = function(){ + rowSelected = infoGrid.getSelectionModel().getSelected(); + if (rowSelected){ + location.href = 'calendarEdit?cp=1&id=' + rowSelected.data.CALENDAR_UID; + } +}; + +//Update Page Size Configuration +UpdatePageConfig = function(pageSize){ + Ext.Ajax.request({ + url: 'calendar_Ajax', + params: {action:'updatePageSize', size: pageSize} + }); +}; \ No newline at end of file