From bcbc02a13082f9960a23f0c220f9c68c0613589f Mon Sep 17 00:00:00 2001
From: Enrique Ponce de Leon
Date: Fri, 11 Mar 2011 21:03:41 +0000
Subject: [PATCH] BPMN Editor - Input Documents Manager Fixed
---
workflow/engine/classes/class.processMap.php | 22 +
.../controllers/processOptionsProxy.php | 106 ++
.../engine/templates/bpmn/ProcessOptions.js | 952 ++++++++----------
3 files changed, 555 insertions(+), 525 deletions(-)
create mode 100644 workflow/engine/controllers/processOptionsProxy.php
diff --git a/workflow/engine/classes/class.processMap.php b/workflow/engine/classes/class.processMap.php
index 118f47f0a..1bafc4e79 100644
--- a/workflow/engine/classes/class.processMap.php
+++ b/workflow/engine/classes/class.processMap.php
@@ -5362,10 +5362,13 @@ class processMap {
*/
function getExtInputDocumentsCriteria($start, $limit,$sProcessUID = '')
{
+ $aTasks = $this->getAllInputDocsByTask($sProcessUID);
$sDelimiter = DBAdapter::getStringDelimiter ();
$oCriteria = new Criteria ( 'workflow' );
$oCriteria->addSelectColumn ( InputDocumentPeer::INP_DOC_UID );
$oCriteria->addSelectColumn ( InputDocumentPeer::PRO_UID );
+ $oCriteria->addSelectColumn ( InputDocumentPeer::INP_DOC_VERSIONING );
+ $oCriteria->addSelectColumn ( InputDocumentPeer::INP_DOC_DESTINATION_PATH );
$oCriteria->addAsColumn ( 'INP_DOC_TITLE', 'C1.CON_VALUE' );
$oCriteria->addAsColumn ( 'INP_DOC_DESCRIPTION', 'C2.CON_VALUE' );
$oCriteria->addAlias ( 'C1', 'CONTENT' );
@@ -5401,6 +5404,7 @@ class processMap {
$aRow ['INP_DOC_TITLE'] = $inputDocumentObj ['INP_DOC_TITLE'];
$aRow ['INP_DOC_DESCRIPTION'] = $inputDocumentObj ['INP_DOC_DESCRIPTION'];
}
+ $aRow['INP_DOC_TASKS'] = isset($aTasks[$aRow ['INP_DOC_UID']]) ? $aTasks[$aRow ['INP_DOC_UID']] :0;
$inputDocArray [] = $aRow;
$oDataset->next ();
}
@@ -6736,5 +6740,23 @@ function saveExtEvents($oData)
return $triggersArray;
}
+
+ function getAllInputDocsByTask($sPRO_UID){
+ $oCriteria = new Criteria('workflow');
+ $oCriteria->addSelectColumn(StepPeer::STEP_UID_OBJ);
+ $oCriteria->addSelectColumn('COUNT(*) AS CNT');
+ $oCriteria->addGroupByColumn(StepPeer::STEP_UID_OBJ);
+ $oCriteria->add(StepPeer::STEP_TYPE_OBJ,'INPUT_DOCUMENT');
+ $oCriteria->add(StepPeer::PRO_UID, $sPRO_UID);
+ $oDataset = StepPeer::doSelectRS($oCriteria);
+ $oDataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
+
+ $aIDocs = array();
+ while ($oDataset->next()){
+ $row = $oDataset->getRow();
+ $aIDocs[$row['STEP_UID_OBJ']] = $row['CNT'];
+ }
+ return $aIDocs;
+ }
}
diff --git a/workflow/engine/controllers/processOptionsProxy.php b/workflow/engine/controllers/processOptionsProxy.php
new file mode 100644
index 000000000..a6bcd64c6
--- /dev/null
+++ b/workflow/engine/controllers/processOptionsProxy.php
@@ -0,0 +1,106 @@
+PRO_UID;
+ $start = isset($params->start) ? $params->start: 0;
+ $limit = isset($params->limit) ? $params->limit: '';
+
+ $rows = $oProcessMap->getExtInputDocumentsCriteria($start, $limit,$pro_uid);
+ $total = $oProcessMap->getAllInputDocumentCount();
+ $aDocs = $oProcessMap->getAllInputDocsByTask($pro_uid);
+ array_shift($rows);
+
+ $this->PRO_UID = $pro_uid;
+ $this->success = true;
+ $this->idocs = $rows;
+ $this->total_idocs = $total;
+ }
+
+ function canDeleteInputDoc($params){
+ G::LoadClass('processMap');
+ $oProcessMap = new processMap(new DBConnection);
+ $aRows = $oProcessMap->getAllInputDocsByTask($params->PRO_UID);
+ $response = isset($aRows[$params->IDOC_UID]) ? false : true;
+ $this->success = $response;
+ }
+
+ function deleteInputDoc($params){
+ require_once 'classes/model/StepSupervisor.php';
+ require_once 'classes/model/ObjectPermission.php';
+ require_once 'classes/model/InputDocument.php';
+ G::LoadClass('processMap');
+
+ $oStepSupervisor = new StepSupervisor();
+ $fields2=$oStepSupervisor->loadInfo($params->IDOC_UID);
+ $oStepSupervisor->remove($fields2['STEP_UID']);
+
+ $oPermission = new ObjectPermission();
+ $fields3=$oPermission->loadInfo($params->IDOC_UID);
+ if(is_array($fields3))
+ $oPermission->remove($fields3['OP_UID']);
+
+ $oInputDocument = new InputDocument();
+ $fields = $oInputDocument->load($params->IDOC_UID);
+
+ $oInputDocument->remove($params->IDOC_UID);
+
+ $oStep = new Step();
+ $oStep->removeStep('INPUT_DOCUMENT', $params->IDOC_UID);
+
+ $oOP = new ObjectPermission();
+ $oOP->removeByObject('INPUT', $params->IDOC_UID);
+
+ //refresh dbarray with the last change in inputDocument
+ $oMap = new processMap();
+ $oCriteria = $oMap->getInputDocumentsCriteria($params->PRO_UID);
+
+ $this->success = true;
+ $this->msg = G::LoadTranslation('ID_INPUT_DOC_SUCCESS_DELETE');
+ }
+
+ function saveInputDoc($params){
+ require_once 'classes/model/InputDocument.php';
+ G::LoadClass( 'processMap' );
+
+ $aData = array();
+ $aData['PRO_UID'] = $params->PRO_UID;
+ $aData['INP_DOC_UID'] = $params->INP_DOC_UID;
+ $aData['INP_DOC_TITLE'] = $params->INP_DOC_TITLE;
+ $aData['INP_DOC_FORM_NEEDED'] = $params->INP_DOC_FORM_NEEDED;
+ if ($aData['INP_DOC_FORM_NEEDED'] != 'VIRTUAL'){
+ $aData['INP_DOC_ORIGINAL'] = $params->INP_DOC_ORIGINAL;
+ }else{
+ $aData['INP_DOC_ORIGINAL'] = 'ORIGINAL';
+ }
+ $aData['INP_DOC_VERSIONING'] = $params->INP_DOC_VERSIONING;
+ $aData['INP_DOC_DESCRIPTION'] = $params->INP_DOC_DESCRIPTION;
+ $aData['INP_DOC_DESTINATION_PATH'] = $params->INP_DOC_DESTINATION_PATH;
+ $aData['INP_DOC_TAGS'] = $params->INP_DOC_TAGS;
+
+ $oInputDocument = new InputDocument();
+ if ($aData['INP_DOC_UID'] == '') {
+ unset($aData['INP_DOC_UID']);
+ $oInputDocument->create($aData);
+ $this->msg = G::LoadTranslation('ID_INPUT_DOC_SUCCESS_NEW');
+ }else {
+ $oInputDocument->update($aData);
+ $this->msg = G::LoadTranslation('ID_INPUT_DOC_SUCCESS_UPDATE');
+ }
+
+ //refresh dbarray with the last change in inputDocument
+ $oMap = new processMap();
+ $oCriteria = $oMap->getInputDocumentsCriteria($aData['PRO_UID']);
+ $this->success = true;
+ }
+ function loadInputDoc($params){
+ require_once 'classes/model/InputDocument.php';
+ $oInputDocument = new InputDocument();
+ $fields = $oInputDocument->load($params->IDOC_UID);
+ $this->success = true;
+ $this->data = $fields;
+ }
+} //End processOptionsProxy
\ No newline at end of file
diff --git a/workflow/engine/templates/bpmn/ProcessOptions.js b/workflow/engine/templates/bpmn/ProcessOptions.js
index 4f4d8aa20..beb95927c 100755
--- a/workflow/engine/templates/bpmn/ProcessOptions.js
+++ b/workflow/engine/templates/bpmn/ProcessOptions.js
@@ -1224,593 +1224,495 @@ ProcessOptions.prototype.dbConnection = function()
ProcessOptions.prototype.addInputDoc= function(_5625)
{
+ var gridWidow;
+ var inputDocGrid;
+ var inputDocStore;
+ var expander;
+ var inputDocColumns;
+ var render_version;
+ var newButton;
+ var editButton;
+ var deleteButton;
+ var saveButton;
+ var cancelButton;
+ var smodel;
+ var bbarpaging;
+ var idocsContextMenu;
+ var newIDocWindow;
+ var inputDocForm;
- var inpDocFields = Ext.data.Record.create([
- {
- name: 'INP_DOC_UID',
- type: 'string'
- },
- {
- name: 'PRO_UID',
- type: 'string'
- },
- {
- name: 'INP_DOC_TITLE',
- type: 'string'
- },
- {
- name: 'INP_DOC_DESCRIPTION',
- type: 'string'
- },{
- name: 'INP_DOC_VERSIONING',
- type: 'string'
- },{
- name: 'INP_DOC_DESTINATION_PATH',
- type: 'string'
+ //Renderer for Versioning Field
+ render_version = function(value){
+ var out = '';
+ switch(value){
+ case '0': out = 'No'; break;
+ case '1': out = 'Yes'; break;
}
- ]);
-
- var editor = new Ext.ux.grid.RowEditor({
- saveText: _('ID_UPDATE')
- });
-
- var btnAdd = new Ext.Button({
- id : 'btnAdd',
+ return out;
+ }
+
+
+
+ newButton = new Ext.Action({
text : _('ID_NEW'),
iconCls: 'button_menu_ext ss_sprite ss_add',
- handler: function () {
- newIOWindow.show();
+ handler: function(){
inputDocForm.getForm().reset();
- inputDocForm.getForm().items.items[2].hide();
- inputDocForm.getForm().items.items[2].getEl().up('.x-form-item').setDisplayed(false); // show label
- inputDocForm.getForm().items.items[0].focus('',200);
+ Ext.getCmp('idoc_FORM_NEEDED').setValue('VIRTUAL');
+ Ext.getCmp('idoc_VERSIONING').setValue('0');
+ inputDocForm.getForm().findField('INP_DOC_TAGS').setValue('INPUT');
+ inputDocForm.getForm().findField('PRO_UID').setValue(pro_uid);
+ newIDocWindow.setTitle(_('ID_NEW_INPUTDOCS'));
+ newIDocWindow.show();
}
});
-
- //edit input document Function
- var editInputDoc = function() {
- editor.stopEditing();
- var rowSelected = Ext.getCmp('inputdocGrid').getSelectionModel().getSelections();
- if( rowSelected.length == 0 ) {
- PMExt.error('', _('ID_NO_SELECTION_WARNING'));
- return false;
- }
- var inputDocUID = rowSelected[0].get('INP_DOC_UID');
- inputDocForm.form.load({
- url : 'bpmn/proxyExtjs.php?INP_DOC_UID=' +inputDocUID+'&action=editInputDocument',
- method : 'GET',
- waitMsg : 'Loading',
- success : function(form, action) {
- newIOWindow.show();
- Ext.getCmp("INP_DOC_UID").setValue(inputDocUID);
- },
- failure:function(form, action) {
- PMExt.notify( _('ID_STATUS') , _('ID_LOAD_FAILED') );
- }
- });
- }
-
- var removeInputDoc = function(){
- ids = Array();
-
- editor.stopEditing();
- var rowsSelected = Ext.getCmp('inputdocGrid').getSelectionModel().getSelections();
-
- if( rowsSelected.length == 0 ) {
- PMExt.error('', _('ID_NO_SELECTION_WARNING'));
- return false;
- }
-
- for(i=0; i"+TRANSLATIONS.ID_DESCRIPTION+": {INP_DOC_DESCRIPTION}
"
- )
+ buttons: [saveButton, cancelButton]
});
-
-var inputDocColumns = new Ext.grid.ColumnModel({
- columns: [
- expander,
- {
- id: 'INP_DOC_TITLE',
- header: _('ID_TITLE'),
- dataIndex: 'INP_DOC_TITLE',
- width: 280,
- editable: false,
- editor: new Ext.form.TextField({
- //allowBlank: false
- })
- },{
- id: 'INP_DOC_VERSIONING',
- header: _('ID_VERSIONING'),
- dataIndex: 'INP_DOC_VERSIONING',
- width: 280,
- editable: false,
- editor: new Ext.form.TextField({
- //allowBlank: false
- })
- },{
- id: 'INP_DOC_DESTINATION_PATH',
- header: _('ID_DESTINATION_PATH'),
- dataIndex: 'INP_DOC_DESTINATION_PATH',
- width: 280,
- editable: false,
- editor: new Ext.form.TextField({
- //allowBlank: false
- })
+
+
+ smodel = new Ext.grid.RowSelectionModel({
+ singleSelect: true,
+ listeners:{
+ rowselect: function(sm){
+ editButton.enable();
+ deleteButton.enable();
+ },
+ rowdeselect: function(sm){
+ editButton.disable();
+ deleteButton.disable();
+ }
}
- ]
});
-
-
- var inputDocGrid = new Ext.grid.GridPanel({
+
+ idocsContextMenu = new Ext.menu.Menu({
+ items: [editButton, deleteButton]
+ });
+
+
+ inputDocStore = new Ext.data.GroupingStore( {
+ proxy : new Ext.data.HttpProxy({
+ url: 'processOptionsProxy/loadInputDocuments?PRO_UID='+pro_uid
+ //params: {PRO_UID: pro_uid}
+ }),
+ reader : new Ext.data.JsonReader( {
+ root: 'idocs',
+ totalProperty: 'total_idocs',
+ fields : [
+ {name: 'INP_DOC_UID', type: 'string'},
+ {name: 'PRO_UID',type: 'string'},
+ {name: 'INP_DOC_TITLE', type: 'string'},
+ {name: 'INP_DOC_DESCRIPTION', type: 'string'},
+ {name: 'INP_DOC_VERSIONING',type: 'string'},
+ {name: 'INP_DOC_DESTINATION_PATH',type: 'string'},
+ {name: 'INP_DOC_TASKS', type: 'int'}
+ ]
+ })
+ });
+
+ bbarpaging = new Ext.PagingToolbar({
+ pageSize: 10,
store: inputDocStore,
- id : 'inputdocGrid',
+ displayInfo: true,
+ displayMsg: _('ID_GRID_PAGE_DISPLAYING_ROLES_MESSAGE') + ' ',
+ emptyMsg: _('ID_GRID_PAGE_NO_ROLES_MESSAGE'),
+ items: []
+ });
+
+ expander = new Ext.ux.grid.RowExpander({
+ tpl : new Ext.Template(""+TRANSLATIONS.ID_DESCRIPTION+": {INP_DOC_DESCRIPTION}
")
+ });
+
+ inputDocColumns = new Ext.grid.ColumnModel({
+ defaults: {
+ editable: false,
+ sortable: true
+ },
+ columns: [
+ expander,
+ {id: 'INP_DOC_UID', dataIndex: 'INP_DOC_UID', hidden:true, hideable:false},
+ {header: _('ID_TITLE'), dataIndex: 'INP_DOC_TITLE', width: 350},
+ {header: _('ID_VERSIONING'), dataIndex: 'INP_DOC_VERSIONING', width: 100, renderer: render_version},
+ {header: _('ID_DESTINATION_PATH'), dataIndex: 'INP_DOC_DESTINATION_PATH', width: 150},
+ {header: _('ID_TASK'), dataIndex: 'INP_DOC_TASKS', width: 100, align: 'center'}
+ ]
+ });
+
+ inputDocGrid = new Ext.grid.GridPanel({
+ store: inputDocStore,
+ cm: inputDocColumns,
+ sm: smodel,
+ id: 'inputdocGrid',
loadMask: true,
- //loadingText: 'Loading...',
- //renderTo: 'cases-grid',
frame: false,
- autoHeight:false,
+ autoWidth: true,
clicksToEdit: 1,
- minHeight:350,
- height :350,
+ height:100,
layout: 'fit',
plugins: expander,
- cm: inputDocColumns,
stripeRows: true,
- tbar: tb,
- bbar: new Ext.PagingToolbar({
- pageSize: 10,
- store: inputDocStore,
- displayInfo: true,
- displayMsg: 'Displaying Input Document {0} - {1} of {2}',
- emptyMsg: "No Input Document to display",
- items:[]
- }),
- viewConfig: {forceFit: true}
- });
-
- //connecting context menu to grid
+ tbar: [newButton, '-', editButton, deleteButton],
+ bbar: bbarpaging,
+ viewConfig: {forceFit: true},
+ view: new Ext.grid.GroupingView({
+ forceFit:true,
+ groupTextTpl: '{text}'
+ })
+ });
+
+ //connecting context menu to grid
inputDocGrid.addListener('rowcontextmenu', onInputDocContextMenu,this);
-
+
//by default the right click is not selecting the grid row over the mouse
//we need to set this four lines
inputDocGrid.on('rowcontextmenu', function (grid, rowIndex, evt) {
var sm = grid.getSelectionModel();
sm.selectRow(rowIndex, sm.isSelected(rowIndex));
}, this);
-
+
//prevent default
inputDocGrid.on('contextmenu', function (evt) {
- evt.preventDefault();
+ evt.preventDefault();
}, this);
-
+
function onInputDocContextMenu(grid, rowIndex, e) {
e.stopEvent();
var coords = e.getXY();
- dynaformsContextMenu.showAt([coords[0], coords[1]]);
+ idocsContextMenu.showAt([coords[0], coords[1]]);
}
-
- var dynaformsContextMenu = new Ext.menu.Menu({
- id: 'messageContextMenu',
- items: [{
- text: _('ID_EDIT'),
- iconCls: 'button_menu_ext ss_sprite ss_pencil',
- handler: editInputDoc
- },{
- text: _('ID_DELETE'),
- icon: '/images/delete.png',
- handler: removeInputDoc
- },{
- text: _('ID_UID'),
- handler: function(){
- var rowSelected = Ext.getCmp('inputdocGrid').getSelectionModel().getSelected();
- workflow.createUIDButton(rowSelected.data.INP_DOC_UID);
- }
- }
- ]
- });
-
- var gridWindow = new Ext.Window({
+
+ inputDocGrid.store.load();
+
+ gridWindow = new Ext.Window({
title: _('ID_REQUEST_DOCUMENTS'),
- width: 550,
+ width: 600,
height: 350,
minWidth: 200,
minHeight: 350,
layout: 'fit',
plain: true,
items: inputDocGrid,
- autoScroll: true
- });
-
- var newIOWindow = new Ext.Window({
- title: _('ID_NEW_INPUTDOCS'),
- width: 550,
- height: 410,
- minWidth: 200,
- minHeight: 405,
- autoScroll: true,
- layout: 'fit',
- plain: true,
- items: inputDocForm
+ autoScroll: true,
+ modal: true
});
+
+ newIDocWindow = new Ext.Window({
+ title: _('ID_NEW_INPUTDOCS'),
+ width: 550,
+ id: 'frmNewInputDoc',
+ autoHeight: true,
+ autoScroll: true,
+ closable: false,
+ layout: 'fit',
+ plain: true,
+ modal: true,
+ items: inputDocForm
+ });
+
gridWindow.show();
}
-
-
ProcessOptions.prototype.addOutputDoc= function(_5625)
{