Files
luos/workflow/engine/templates/cases/main.js

670 lines
19 KiB
JavaScript
Raw Normal View History

2010-12-02 23:34:41 +00:00
var PANEL_EAST_OPEN = false;
var centerPanel;
var setFlag;
2015-04-30 15:04:02 -04:00
var flagRefresh = true;
2010-12-02 23:34:41 +00:00
var debugVarTpl = new Ext.Template('<span style="font-size:11">{value}</span>');
var detailsText = '<i></i>';
var debugTriggersDetailTpl = new Ext.Template('<pre style="font-size:10px"><code>{code}</code></pre>');
var propStore;
var triggerStore;
var result;
var _action = '';
//@var treeMenuItemsLoaded -> added to flag the "treeMenuItems" tree, to ensure that its onload event is executed just once
var treeMenuItemsLoaded = false;
debugVarTpl.compile();
debugTriggersDetailTpl.compile();
setFlag = function (val) {
flagRefresh = val;
};
2010-12-02 23:34:41 +00:00
Ext.onReady(function(){
new Ext.KeyMap(document, {
key: Ext.EventObject.F5,
fn: function(keycode, e) {
if (! e.ctrlKey) {
if (Ext.isIE) {
e.browserEvent.keyCode = 8;
}
e.stopEvent();
updateCasesTree();
}
else
2013-03-14 15:15:04 -04:00
Ext.Msg.alert(_('ID_REFRESH_LABEL'),_('ID_REFRESH_MESSAGE'));
}
});
2010-12-02 23:34:41 +00:00
Ext.QuickTips.init();
2010-12-02 23:34:41 +00:00
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
var resetGrid = function() {
2010-12-02 23:34:41 +00:00
propStore.load();
};
var resetTriggers = function(){
triggerStore.load();
};
2010-12-02 23:34:41 +00:00
var debugVariablesFilterDynaform = function(){
propStore.load({params:{filter:'dyn'}});
};
2010-12-02 23:34:41 +00:00
var debugVariablesFilterSystem = function(){
propStore.load({params:{filter:'sys'}});
};
//center iframe panel
2010-12-02 23:34:41 +00:00
centerPanel = {
region : 'center',
xtype : 'iframepanel',
frameConfig:{
name : 'casesSubFrame',
id : 'casesSubFrame'
},
deferredRender: false
};
2010-12-02 23:34:41 +00:00
/**
* Menu Panel
*/
var treeMenuItems = new Ext.tree.TreePanel({
xtype: 'treepanel',
height: 350,
id: 'tree-panel',
region: 'center',
margins: '0 0 0 0',
useArrows : true,
2010-12-02 23:34:41 +00:00
animate:true,
autoScroll: true,
rootVisible: false,
clearOnReLoad: false,
root: new Ext.tree.AsyncTreeNode(),
useArrows: true,
2010-12-02 23:34:41 +00:00
// Our custom TreeLoader:
loader: new Ext.app.menuLoader({
dataUrl:'casesMenuLoader',
clearOnLoad: false
}),
listeners: {
'click': function(tp) {
2010-12-02 23:34:41 +00:00
if( tp.attributes.url ){
document.getElementById('casesSubFrame').src = tp.attributes.url;
}
},
'render': function(tp){}
2010-12-02 23:34:41 +00:00
}
});
var loader = treeMenuItems.getLoader();
loader.on("load", function() {
// it was added since the feature to reload a specific node of tree is now working
if (! treeMenuItemsLoaded) { // this section of code should be executed once
document.getElementById('casesSubFrame').src = defaultOption;
// check if a case was open directly
if (defaultOption.indexOf('open') > -1) {
//if it is, then update cases trees
updateCasesTree();
}
if(_nodeId !== ''){
treePanel1 = Ext.getCmp('tree-panel');
if(treePanel1)
node = treePanel1.getNodeById(_nodeId);
if(node) {
node.select();
if (_nodeId === 'CASES_START_CASE') {
updateCasesTree();
}
}
2010-12-02 23:34:41 +00:00
}
treeMenuItemsLoaded = true;
}
2010-12-02 23:34:41 +00:00
});
// set the root node
var root = new Ext.tree.AsyncTreeNode({
text: 'Ext JS',
draggable:false, // disable root node dragging
id:'src',
loaded:false,
expanded:true
});
2010-12-02 23:34:41 +00:00
mainMenu = new Ext.Panel({
id:'menuTreePanel',
title: '',
region: regionTreePanel,
2010-12-02 23:34:41 +00:00
layout: 'border',
width: 200,
height: 500,
minSize: 175,
maxSize: 400,
split: true,
collapsible: true,
collapseMode: 'mini',
margins: '0 0 0 2',
2010-12-02 23:34:41 +00:00
items: [
treeMenuItems
2010-12-02 23:34:41 +00:00
]
});
mainMenu.setTitle("<div style=\"height: 18px;\"><a href=\"javascript:;\"><img id=\"refreshNotifiers\" src=\"/images/refresh.gif\" onclick=\"updateCasesTree(); updateCasesView();\" /></a></div>");
2010-12-02 23:34:41 +00:00
propStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: 'debug_vars'}),
reader: new Ext.data.DynamicJsonReader({root: 'data'})
});
propStore.on('load', function(){
propStore.fields = propStore.recordType.prototype.fields;
debugVariables.setSource(propStore.getAt(0).data);
});
/**
* Triggers Panel
*/
var debugVariables = new Ext.grid.PropertyGrid({
id: 'debugVariables',
title:TRANSLATIONS.ID_VARIABLES,
autoHeight: false,
height: 300,
width: 400,
region: 'center',
margins: '2 2 0 2',
border: true,
stripeRows: true,
listeners: {
beforeedit: function(event) { //Cancel editing - read only
event.cancel = true;
}
},
tbar: [
{text: TRANSLATIONS.ID_ALL, handler: resetGrid},
{text: TRANSLATIONS.ID_DYNAFORM, handler: debugVariablesFilterDynaform},
{text: TRANSLATIONS.ID_SYSTEM, handler: debugVariablesFilterSystem}
],
sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
viewConfig: {
forceFit: true
}
});
//set debug variable details
debugVariables.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
var detailPanel = Ext.getCmp('debug-details-panel'),
d = {};
d.name = r.data.name;
d.value = parent.parent.htmlentities ? parent.parent.htmlentities(r.data.value) : r.data.value;
debugVarTpl.overwrite(detailPanel.body, d);
detailPanel.setTitle(r.data.name);
if(r.data.value === '<object>' || r.data.value === '<array>' ){
Ext.getCmp('deatachAction').setDisabled(false);
Ext.Ajax.request({
url: 'debug_vars?r='+Math.random(),
success: function(response){
try{
result = eval('('+response.responseText+')');
var store1a = new Ext.data.ArrayStore({fields: result.headers});
// manually load local data
store1a.loadData(result.rows);
var myGridPanel = new Ext.grid.GridPanel({
store: store1a,
height: 200,
border : false,
columns: result.columns,
stripeRows : true,
layout: 'fit',
viewConfig:{forceFit:true, scrollOffset:0},
listeners: {
rowdblclick: function(grid, n,e){
},
render: function(){
this.loadMask = new Ext.LoadMask(this.body, { msg:_('ID_LOADING_GRID') });
}
}
});
Ext.each(detailPanel.items.items, function(childPanel) {
detailPanel.remove(childPanel, true);
});
detailPanel.add(myGridPanel);
detailPanel.doLayout();
} catch (e){
}
},
failure: function(){},
params: {request: 'getRows', fieldname:r.data.name}
});
} else
Ext.getCmp('deatachAction').setDisabled(true);
});
2010-12-02 23:34:41 +00:00
/**
* Triggers Panel
*/
var xg = Ext.grid;
2010-12-02 23:34:41 +00:00
var reader = new Ext.data.JsonReader(
{
root: 'data',
totalProperty: 'total',
id: 'name'
},
2010-12-02 23:34:41 +00:00
[
{name: 'name'},
{name: 'execution_time'},
{name: 'code'},
{name: "script_execution_time"}
2010-12-02 23:34:41 +00:00
]
);
triggerStore = new Ext.data.GroupingStore({
reader: reader,
groupField:'execution_time',
groupDir: 'DESC',
proxy: new Ext.data.HttpProxy({url: 'debug_triggers?r='+Math.random()})
2010-12-02 23:34:41 +00:00
});
var debugTriggers = new xg.GridPanel({
id: 'debugTriggers',
2010-12-02 23:34:41 +00:00
store: triggerStore,
columns: [
2014-01-29 10:57:57 -04:00
{id:'name',header: _('ID_NAME'), width: 60, sortable: true, dataIndex: 'name'},
{header: _('ID_EXECUTION'), width: 30, sortable: true, dataIndex: 'execution_time'},
{header: "Code", width: 30, sortable: false, dataIndex: 'code', hidden: true},
{header: _("ID_EXECUTION_TIME") + " (" + _("ID_MILLISECONDS") + ")", dataIndex: "script_execution_time", width: 60, sortable: true, hidden: true}
2010-12-02 23:34:41 +00:00
],
view: new Ext.grid.GroupingView({
forceFit:true,
groupTextTpl: '{text} ({[values.rs.length]} {[ values.rs[0].data.execution_time=="error" || values.rs[0].data.execution_time=="Fatal error"? "<font color=red>"+values.rs[0].data.execution_time+"</font>": values.rs.length > 1 ? "Triggers" : "Trigger"]})'
}),
width: 700,
height: 450,
title: TRANSLATIONS.ID_TRIGGERS,
sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
viewConfig: {
forceFit: true
},
listeners: {
rowdblclick: function(grid, n,e) {
2010-12-02 23:34:41 +00:00
triggerWindow();
}
}
});
2010-12-02 23:34:41 +00:00
debugTriggers.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
2011-02-24 21:55:00 +00:00
Ext.getCmp('deatachAction').setDisabled(false);
2010-12-02 23:34:41 +00:00
var detailPanel = Ext.getCmp('debug-details-panel');
debugTriggersDetailTpl.overwrite(detailPanel.body, r.data);
detailPanel.setTitle(r.data.name);
2010-12-02 23:34:41 +00:00
});
2010-12-02 23:34:41 +00:00
function triggerWindow() {
var r = debugTriggers.getSelectionModel().getSelected();
if(r) {
var w = new Ext.Window({
title: r.data.name,
width: 500,
height: 400,
modal: true,
autoScroll: true,
maximizable: true,
items: [],
listeners:{
show: function() {
this.loadMask = new Ext.LoadMask(this.body, { msg:_('ID_LOADING') });
}
}
});
w.show();
debugTriggersDetailTpl.overwrite(w.body, r.data);
2010-12-02 23:34:41 +00:00
}
}
2010-12-02 23:34:41 +00:00
debugPanel = new Ext.Panel({
id:'debugPanel',
2011-02-24 21:55:00 +00:00
title: _('ID_DEBUG_PANEL_TITLE'),
region: regionDebug,
2010-12-02 23:34:41 +00:00
layout: 'border',
width: 300,
height: 500,
minSize: 175,
maxSize: 400,
split: true,
collapsible: true,
collapseMode: 'mini',
margins: '0 0 0 5',
items: [
new Ext.TabPanel({
2011-02-24 14:39:11 +00:00
id: 'debugPanelTabs',
2010-12-02 23:34:41 +00:00
border: true, // already wrapped so don't add another border
activeTab: 0, // second tab initially active
tabPosition: 'top',
2011-02-24 14:39:11 +00:00
region:'center',
2010-12-02 23:34:41 +00:00
split: true,
items: [
debugVariables,
debugTriggers
],
2011-02-24 21:55:00 +00:00
listeners: {
beforetabchange: function(){
Ext.getCmp('deatachAction').setDisabled(true);
Ext.getCmp('debug-details-panel').html = '';
},
tabchange: function (tabpanel, tab) {
clearItemSelected(tab.id);
}
2011-02-24 21:55:00 +00:00
}
2010-12-02 23:34:41 +00:00
}),
{
2011-02-24 14:39:11 +00:00
region: 'south',
2010-12-02 23:34:41 +00:00
layout: 'fit',
2011-02-24 14:39:11 +00:00
title: '&nbsp;',
2010-12-02 23:34:41 +00:00
id: 'debug-details-panel',
autoScroll: true,
collapsible: false,
split: true,
margins: '0 2 2 2',
cmargins: '2 2 2 2',
2011-02-24 14:39:11 +00:00
height: 50,
2010-12-02 23:34:41 +00:00
html: detailsText,
tbar:[
2011-02-24 14:39:11 +00:00
'->',
{
id: 'deatachAction',
2011-02-24 21:55:00 +00:00
disabled: true,
2011-02-24 14:39:11 +00:00
text: _('ID_OPEN_IN_A_NEW_WINDOW'),
iconCls: 'ss_sprite ss_application_form',
handler: function(){
if( Ext.getCmp('debugPanelTabs').getActiveTab().id === 'debugVariables' ){
var i,
store1a = new Ext.data.ArrayStore({fields: result.headers});
2011-02-24 14:39:11 +00:00
store1a.loadData(result.rows);
for(i = 0; i < result.columns.length; i += 1){
2011-02-24 14:39:11 +00:00
result.columns[i].editor = new Ext.form.TextField({allowBlank: true, readOnly:true})
}
var myGridPanel = new Ext.grid.EditorGridPanel({
region:'center',
store: store1a,
autoHeight: true,
autoWidth: true,
border : false,
columns: result.columns,
stripeRows : true,
layout: 'fit',
viewConfig:{forceFit:true, scrollOffset:0},
clicksToEdit: 1
});
var w = new Ext.Window({
title: '',
width: 600,
height: 250,
layout:'fit',
autoScroll:true,
modal: true,
maximizable: true,
items: [myGridPanel]
});
w.show();
} else {
triggerWindow();
}
}
}
2010-12-02 23:34:41 +00:00
]
}]
2010-12-02 23:34:41 +00:00
});
function restartPanelDetail () {
var detailPanel = Ext.getCmp('debug-details-panel'),
domDetailPanel;
if (detailPanel && detailPanel.body) {
domDetailPanel = detailPanel.body.dom;
detailPanel.setTitle("");
domDetailPanel.innerHTML = "";
}
}
function clearItemSelected (id) {
var debugVar = Ext.getCmp("debugVariables"),
debugTri = Ext.getCmp("debugTriggers");
switch (id) {
case "debugTriggers":
if (debugVar && debugVar.getSelectionModel().getSelected()) {
debugVar.getSelectionModel().clearSelections();
restartPanelDetail();
}
break;
case "debugVariables":
if (debugTri && debugTri.getSelectionModel().getSelected()) {
debugTri.getSelectionModel().clearSelections();
restartPanelDetail();
}
break;
}
}
2010-12-02 23:34:41 +00:00
var viewport = new Ext.Viewport({
layout: 'border',
items: [ mainMenu, centerPanel, debugPanel]
});
/** after panel creation routines */
2010-12-02 23:34:41 +00:00
var menuPanelC = Ext.getCmp('debugPanel');
2010-12-02 23:34:41 +00:00
/**hide*/
menuPanelC.hide();
menuPanelC.ownerCt.doLayout();
//FORMATS.casesListRefreshTime is in seconds
setTimeout("timer()", parseInt(FORMATS.casesListRefreshTime) * 1000);
2010-12-02 23:34:41 +00:00
});
2013-02-05 15:20:22 -04:00
function updateCasesView(viewList) {
var refreshList = viewList || false;
2010-12-02 23:34:41 +00:00
try{
if (document.getElementById('casesSubFrame').contentWindow.storeCases) {
2013-02-05 15:20:22 -04:00
if (refreshList) {
2013-02-05 15:00:07 -04:00
document.getElementById('casesSubFrame').contentWindow.storeCases.reload();
} else {
switch (document.getElementById('casesSubFrame').contentWindow.storeCases.baseParams.action) {
case "todo":
case "unassigned":
case "paused":
case "to_revise":
case "to_reassign":
document.getElementById('casesSubFrame').contentWindow.storeCases.reload();
break;
default:
break;
}
}
2010-12-02 23:34:41 +00:00
}
} catch(e){}
2010-12-02 23:34:41 +00:00
}
function updateCasesTree() {
document.getElementById('refreshNotifiers').src = '/images/ext/default/grid/loading.gif';
2011-02-22 23:02:23 +00:00
itemsTypes = Array('CASES_INBOX', 'CASES_DRAFT', 'CASES_CANCELLED', 'CASES_SENT', 'CASES_PAUSED', 'CASES_COMPLETED', 'CASES_SELFSERVICE');
2011-02-22 23:02:23 +00:00
Ext.Ajax.request({
url: urlProxy + Math.random(),
success: function (response) {
2011-02-22 23:02:23 +00:00
result = Ext.util.JSON.decode(response.responseText);
for (i = 0; i < result.length; i++) {
if (document.getElementById('NOTIFIER_' + result[i].item)) {
oldValue = document.getElementById('NOTIFIER_' + result[i].item).innerHTML;
2011-02-22 23:02:23 +00:00
oldValue = oldValue.replace('<b>', '');
oldValue = oldValue.replace('</b>', '');
newValue = result[i].count;
if (oldValue != newValue && oldValue != 0) {
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = '<b>' + result[i].count + '</b>';
2011-02-22 23:02:23 +00:00
} else {
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = result[i].count;
2011-02-22 23:02:23 +00:00
}
}
else continue;
}
document.getElementById('refreshNotifiers').src = '/images/refresh.gif';
2011-02-22 23:02:23 +00:00
},
failure: function () {
},
2011-02-22 23:02:23 +00:00
params: {'updateCasesTree': true}
});
2010-12-02 23:34:41 +00:00
}
function timer() {
2015-04-30 15:04:02 -04:00
if (flagRefresh) {
updateCasesTree();
updateCasesView();
}
//FORMATS.casesListRefreshTime is in seconds
setTimeout("timer()", parseInt(FORMATS.casesListRefreshTime) * 1000);
2010-12-02 23:34:41 +00:00
}
Ext.data.DynamicJsonReader = function(config){
Ext.data.DynamicJsonReader.superclass.constructor.call(this, config, []);
};
Ext.extend(Ext.data.DynamicJsonReader, Ext.data.JsonReader, {
getRecordType : function(data) {
var i = 0, arr = [];
for (var name in data[0]) {
arr[i++] = name;
} // is there a built-in to do this?
this.recordType = Ext.data.Record.create(arr);
return this.recordType;
},
readRecords : function(o){ // this is just the same as base class, with call to getRecordType injected
this.jsonData = o;
var s = this.meta;
var sid = s.id;
var totalRecords = 0;
if(s.totalProperty){
var v = parseInt(eval("o." + s.totalProperty), 10);
if(!isNaN(v)){
totalRecords = v;
}
}
var root = s.root ? eval("o." + s.root) : o;
var recordType = this.getRecordType(root);
var fields = recordType.prototype.fields;
var records = [];
2010-12-02 23:34:41 +00:00
for(var i = 0; i < root.length; i++){
var n = root[i];
var values = {};
var id = (n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
for(var j = 0, jlen = fields.length; j < jlen; j++){
var f = fields.items[j];
var map = f.mapping || f.name;
var v = n[map] !== undefined ? n[map] : f.defaultValue;
v = f.convert(v);
values[f.name] = v;
}
var record = new recordType(values, id);
record.json = n;
records[records.length] = record;
}
return {
records : records,
totalRecords : totalRecords || records.length
};
}
});
Ext.app.menuLoader = Ext.extend(Ext.ux.tree.XmlTreeLoader, {
processAttributes : function(attr){
//console.log(attr);
2010-12-02 23:34:41 +00:00
if(attr.blockNestedTree){
//console.log(attr);
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = false;
attr.expanded = false;
attr.xtype = 'treepanel';
attr.rootVisible = true;
attr.singleClickExpand=true;
attr.animate = true;
attr.nodeType = 'async';
attr.clearOnReLoad= false;
attr.loader = new Ext.tree.TreeLoader({
dataUrl : attr.blockNestedTree,
baseParams : {
action : 'expandNode',
folderID: attr.folderId
}
});
attr.style= {
// width: '50%',
height: '50px',
// marginBottom: '10px',
overflow:'auto'
};
}
else if(attr.blockHeaderNoChild){
//console.info(attr);
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
attr.expanded = false;
//attr.disabled=true;
attr.expandable=true;
attr.qtip=attr.blockTitle;
}else if(attr.blockTitle){
2010-12-02 23:34:41 +00:00
attr.text = attr.blockTitle;
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
//if((attr.url)&&(attr.url!="")){
// attr.expanded = false;
2010-12-02 23:34:41 +00:00
//}else{
attr.expanded = true;
2010-12-02 23:34:41 +00:00
//}
}else if(attr.title){
attr.text = Ext.util.Format.htmlDecode(attr.title);
2010-12-02 23:34:41 +00:00
if( attr.cases_count )
attr.text += ' (<label id="NOTIFIER_'+attr.id+'">' + attr.cases_count + '</label>)';
2010-12-02 23:34:41 +00:00
attr.iconCls = 'ICON_' + attr.id;
attr.loaded = true;
FEATURE, was added a feature to enable load three level nodes on cases tree menu on HOME tab Now we can set from any menu file (core or plugin) a three level nodes on cases menu: Example: $G_TMP_MENU->AddIdRawOption('TEST1', '#', 'Enterprise Search', '', '', 'blockHeader'); $G_TMP_MENU->AddIdRawOption('TEST2', '#', 'New Seach', '', ''); $G_TMP_MENU->AddIdRawOption('TEST3', '#', 'Saved Searches (9)', '', ''); $G_TMP_MENU->AddIdRawOption('TEST4', '#', 'Favorites', '', '', 'rootNode'); $G_TMP_MENU->AddIdRawOption('TEST5', '#', 'test child 2.1', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST6', '#', 'test child 2.2', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST7', '#', 'test child 2.3', '', '', 'childNode'); $G_TMP_MENU->AddIdRawOption('TEST8', '#', 'test child 3', '', '', ''); $G_TMP_MENU->AddIdRawOption('TEST9', '#', 'test child 4', '', '', ''); On the last parameter was added two new menu types "rootNode" and "childNode" On the example the first node will be set by "blockHeader" menu type all menu options below that will be added such as its child nodes Now, if a menu option has a type "rootNode" (...'Favorites', '', '', 'rootNode'...) all menu options below this with type "childNode" (...'test child 2.2', '', '', 'childNode'...) will be consireded as its child nodes of menu with type "rootNode", inmediatly a menu option without any menu type is found (..'test child 3', '', '', ''..), this menu and all menu options like it will be added as child nodes of the last menu option with "blockHeader". The result of the example will be something like this: + Enterprise Search - New search - Saved Searches (9) + Favorites - test child 2.1 - test child 2.2 - test child 2.3 - test child 3 - test child 4 ...
2013-08-01 19:06:05 -04:00
attr.expanded = attr.expanded ? true : false;
2010-12-02 23:34:41 +00:00
} else if(attr.PRO_UID){
attr.loaded = true;
attr.leaf = true;
}
}
});
2011-02-04 15:00:20 +00:00
var notify = function(title, msg){
PMExt.notify(title, msg);
};