2010-12-02 23:34:41 +00:00
|
|
|
var PANEL_EAST_OPEN = false;
|
|
|
|
|
var centerPanel;
|
2017-03-30 11:47:09 -04:00
|
|
|
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 = '';
|
2013-07-26 13:28:41 -04:00
|
|
|
//@var treeMenuItemsLoaded -> added to flag the "treeMenuItems" tree, to ensure that its onload event is executed just once
|
|
|
|
|
var treeMenuItemsLoaded = false;
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2017-03-30 11:47:09 -04:00
|
|
|
debugVarTpl.compile();
|
|
|
|
|
debugTriggersDetailTpl.compile();
|
|
|
|
|
|
|
|
|
|
setFlag = function (val) {
|
|
|
|
|
flagRefresh = val;
|
|
|
|
|
};
|
|
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
Ext.onReady(function(){
|
2012-03-29 16:42:09 -04:00
|
|
|
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();
|
2012-09-26 16:28:33 -04:00
|
|
|
}
|
|
|
|
|
else
|
2013-03-14 15:15:04 -04:00
|
|
|
Ext.Msg.alert(_('ID_REFRESH_LABEL'),_('ID_REFRESH_MESSAGE'));
|
2012-03-29 16:42:09 -04:00
|
|
|
}
|
|
|
|
|
});
|
2010-12-02 23:34:41 +00:00
|
|
|
|
2012-03-29 16:42:09 -04:00
|
|
|
Ext.QuickTips.init();
|
2010-12-02 23:34:41 +00:00
|
|
|
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
|
|
|
|
|
2012-09-26 16:28:33 -04:00
|
|
|
var resetGrid = function() {
|
2010-12-02 23:34:41 +00:00
|
|
|
propStore.load();
|
|
|
|
|
};
|
2017-03-30 11:47:09 -04:00
|
|
|
var resetTriggers = function(){
|
|
|
|
|
triggerStore.load();
|
|
|
|
|
};
|
2010-12-02 23:34:41 +00:00
|
|
|
|
|
|
|
|
var debugVariablesFilterDynaform = function(){
|
|
|
|
|
propStore.load({params:{filter:'dyn'}});
|
2017-03-30 11:47:09 -04:00
|
|
|
};
|
2010-12-02 23:34:41 +00:00
|
|
|
|
|
|
|
|
var debugVariablesFilterSystem = function(){
|
|
|
|
|
propStore.load({params:{filter:'sys'}});
|
2017-03-30 11:47:09 -04:00
|
|
|
};
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2012-03-29 16:42:09 -04:00
|
|
|
//center iframe panel
|
2010-12-02 23:34:41 +00:00
|
|
|
centerPanel = {
|
2012-03-29 16:42:09 -04:00
|
|
|
region : 'center',
|
|
|
|
|
xtype : 'iframepanel',
|
|
|
|
|
frameConfig:{
|
|
|
|
|
name : 'casesSubFrame',
|
|
|
|
|
id : 'casesSubFrame'
|
|
|
|
|
},
|
|
|
|
|
deferredRender: false
|
2017-03-30 11:47:09 -04:00
|
|
|
};
|
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',
|
2012-04-26 13:21:41 -04:00
|
|
|
useArrows : true,
|
2012-07-09 18:52:03 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
animate:true,
|
|
|
|
|
autoScroll: true,
|
|
|
|
|
rootVisible: false,
|
|
|
|
|
clearOnReLoad: false,
|
|
|
|
|
root: new Ext.tree.AsyncTreeNode(),
|
2012-04-26 13:21:41 -04:00
|
|
|
useArrows: true,
|
2010-12-02 23:34:41 +00:00
|
|
|
|
|
|
|
|
// Our custom TreeLoader:
|
|
|
|
|
loader: new Ext.app.menuLoader({
|
|
|
|
|
dataUrl:'casesMenuLoader',
|
|
|
|
|
clearOnLoad: false
|
|
|
|
|
}),
|
|
|
|
|
|
|
|
|
|
listeners: {
|
2012-04-26 13:21:41 -04:00
|
|
|
'click': function(tp) {
|
2010-12-02 23:34:41 +00:00
|
|
|
if( tp.attributes.url ){
|
|
|
|
|
document.getElementById('casesSubFrame').src = tp.attributes.url;
|
|
|
|
|
}
|
2017-03-30 11:47:09 -04:00
|
|
|
},
|
|
|
|
|
'render': function(tp){}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var loader = treeMenuItems.getLoader();
|
2013-07-26 13:28:41 -04:00
|
|
|
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();
|
|
|
|
|
}
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2017-03-30 11:47:09 -04:00
|
|
|
if(_nodeId !== ''){
|
|
|
|
|
treePanel1 = Ext.getCmp('tree-panel');
|
2013-07-26 13:28:41 -04:00
|
|
|
if(treePanel1)
|
|
|
|
|
node = treePanel1.getNodeById(_nodeId);
|
|
|
|
|
if(node) {
|
|
|
|
|
node.select();
|
2017-03-30 11:47:09 -04:00
|
|
|
if (_nodeId === 'CASES_START_CASE') {
|
2013-07-26 13:28:41 -04:00
|
|
|
updateCasesTree();
|
|
|
|
|
}
|
2011-08-17 12:27:01 -04:00
|
|
|
}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
2013-07-26 13:28:41 -04:00
|
|
|
|
|
|
|
|
treeMenuItemsLoaded = true;
|
2012-03-07 18:12:01 -04:00
|
|
|
}
|
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
|
|
|
|
|
});
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
mainMenu = new Ext.Panel({
|
|
|
|
|
id:'menuTreePanel',
|
|
|
|
|
title: '',
|
2012-10-17 11:59:28 -04:00
|
|
|
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',
|
2012-07-09 18:52:03 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
items: [
|
2017-02-06 14:48:14 -04:00
|
|
|
treeMenuItems
|
2010-12-02 23:34:41 +00:00
|
|
|
]
|
|
|
|
|
});
|
2012-09-26 16:28:33 -04: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
|
|
|
|
2017-03-30 11:47:09 -04: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;
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
var reader = new Ext.data.JsonReader(
|
|
|
|
|
{
|
|
|
|
|
root: 'data',
|
|
|
|
|
totalProperty: 'total',
|
|
|
|
|
id: 'name'
|
2012-09-26 16:28:33 -04:00
|
|
|
},
|
2010-12-02 23:34:41 +00:00
|
|
|
[
|
|
|
|
|
{name: 'name'},
|
|
|
|
|
{name: 'execution_time'},
|
2016-07-19 14:26:51 -04:00
|
|
|
{name: 'code'},
|
|
|
|
|
{name: "script_execution_time"}
|
2010-12-02 23:34:41 +00:00
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
triggerStore = new Ext.data.GroupingStore({
|
|
|
|
|
reader: reader,
|
|
|
|
|
groupField:'execution_time',
|
2012-08-08 15:26:53 -04:00
|
|
|
groupDir: 'DESC',
|
2017-03-30 11:47:09 -04:00
|
|
|
proxy: new Ext.data.HttpProxy({url: 'debug_triggers?r='+Math.random()})
|
2010-12-02 23:34:41 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var debugTriggers = new xg.GridPanel({
|
2017-03-30 11:47:09 -04:00
|
|
|
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'},
|
2016-07-19 14:26:51 -04:00
|
|
|
{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: {
|
2017-03-30 11:47:09 -04:00
|
|
|
rowdblclick: function(grid, n,e) {
|
2010-12-02 23:34:41 +00:00
|
|
|
triggerWindow();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2012-09-26 16:28:33 -04:00
|
|
|
|
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);
|
2017-03-30 11:47:09 -04:00
|
|
|
detailPanel.setTitle(r.data.name);
|
2010-12-02 23:34:41 +00:00
|
|
|
});
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
function triggerWindow() {
|
|
|
|
|
var r = debugTriggers.getSelectionModel().getSelected();
|
2017-03-30 11:47:09 -04:00
|
|
|
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
|
|
|
}
|
2017-03-30 11:47:09 -04: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'),
|
2012-10-17 11:59:28 -04:00
|
|
|
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
|
2012-09-26 16:28:33 -04:00
|
|
|
],
|
2011-02-24 21:55:00 +00:00
|
|
|
listeners: {
|
|
|
|
|
beforetabchange: function(){
|
|
|
|
|
Ext.getCmp('deatachAction').setDisabled(true);
|
|
|
|
|
Ext.getCmp('debug-details-panel').html = '';
|
2017-03-30 11:47:09 -04:00
|
|
|
},
|
|
|
|
|
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: ' ',
|
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'),
|
2018-05-16 09:23:31 -04:00
|
|
|
iconCls: 'button_menu_ext ss_sprite ss_application_form',
|
2011-02-24 14:39:11 +00:00
|
|
|
handler: function(){
|
2017-03-30 11:47:09 -04:00
|
|
|
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);
|
2017-03-30 11:47:09 -04:00
|
|
|
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
|
|
|
]
|
2012-09-26 16:28:33 -04:00
|
|
|
}]
|
2010-12-02 23:34:41 +00:00
|
|
|
});
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2017-03-30 11:47:09 -04: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]
|
|
|
|
|
});
|
|
|
|
|
|
2012-09-26 16:28:33 -04:00
|
|
|
/** after panel creation routines */
|
2010-12-02 23:34:41 +00:00
|
|
|
var menuPanelC = Ext.getCmp('debugPanel');
|
2012-09-26 16:28:33 -04:00
|
|
|
|
2010-12-02 23:34:41 +00:00
|
|
|
/**hide*/
|
2012-09-26 16:28:33 -04:00
|
|
|
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{
|
2012-04-26 13:21:41 -04:00
|
|
|
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
|
|
|
}
|
2017-03-30 11:47:09 -04:00
|
|
|
} catch(e){}
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateCasesTree() {
|
2012-07-09 18:52:03 -04:00
|
|
|
document.getElementById('refreshNotifiers').src = '/images/ext/default/grid/loading.gif';
|
2011-02-22 23:02:23 +00:00
|
|
|
|
2016-07-07 16:50:40 -04:00
|
|
|
itemsTypes = Array('CASES_INBOX', 'CASES_DRAFT', 'CASES_CANCELLED', 'CASES_SENT', 'CASES_PAUSED', 'CASES_COMPLETED', 'CASES_SELFSERVICE');
|
2017-02-06 14:48:14 -04:00
|
|
|
|
2011-02-22 23:02:23 +00:00
|
|
|
Ext.Ajax.request({
|
2015-03-09 15:23:38 -04:00
|
|
|
url: urlProxy + Math.random(),
|
2016-07-07 16:50:40 -04:00
|
|
|
success: function (response) {
|
2011-02-22 23:02:23 +00:00
|
|
|
result = Ext.util.JSON.decode(response.responseText);
|
|
|
|
|
|
2016-07-07 16:50:40 -04:00
|
|
|
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;
|
|
|
|
|
|
2016-07-07 16:50:40 -04:00
|
|
|
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 {
|
2016-07-07 16:50:40 -04:00
|
|
|
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = result[i].count;
|
2011-02-22 23:02:23 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else continue;
|
|
|
|
|
}
|
2012-07-09 18:52:03 -04:00
|
|
|
document.getElementById('refreshNotifiers').src = '/images/refresh.gif';
|
2011-02-22 23:02:23 +00:00
|
|
|
},
|
2016-07-07 16:50:40 -04:00
|
|
|
failure: function () {
|
|
|
|
|
},
|
2011-02-22 23:02:23 +00:00
|
|
|
params: {'updateCasesTree': true}
|
|
|
|
|
});
|
2010-12-02 23:34:41 +00:00
|
|
|
}
|
|
|
|
|
|
2017-03-30 11:47:09 -04:00
|
|
|
function timer() {
|
2015-04-30 15:04:02 -04:00
|
|
|
if (flagRefresh) {
|
|
|
|
|
updateCasesTree();
|
|
|
|
|
updateCasesView();
|
|
|
|
|
}
|
2012-09-26 16:28:33 -04:00
|
|
|
//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 = [];
|
2012-09-26 16:28:33 -04:00
|
|
|
|
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){
|
2011-01-06 20:57:08 +00:00
|
|
|
//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';
|
2012-04-26 13:21:41 -04:00
|
|
|
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){
|
2011-01-06 20:57:08 +00:00
|
|
|
//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;
|
2012-09-26 16:28:33 -04:00
|
|
|
|
|
|
|
|
|
2011-01-06 20:57:08 +00:00
|
|
|
}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!="")){
|
2012-04-26 13:21:41 -04:00
|
|
|
// attr.expanded = false;
|
2010-12-02 23:34:41 +00:00
|
|
|
//}else{
|
2012-04-26 13:21:41 -04:00
|
|
|
attr.expanded = true;
|
2010-12-02 23:34:41 +00:00
|
|
|
//}
|
2012-09-26 16:28:33 -04:00
|
|
|
}else if(attr.title){
|
2013-08-19 16:54:17 -04:00
|
|
|
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>)';
|
2012-09-26 16:28:33 -04:00
|
|
|
|
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);
|
2017-03-30 11:47:09 -04:00
|
|
|
};
|