670 lines
19 KiB
JavaScript
670 lines
19 KiB
JavaScript
var PANEL_EAST_OPEN = false;
|
|
var centerPanel;
|
|
var setFlag;
|
|
var flagRefresh = true;
|
|
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;
|
|
};
|
|
|
|
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
|
|
Ext.Msg.alert(_('ID_REFRESH_LABEL'),_('ID_REFRESH_MESSAGE'));
|
|
}
|
|
});
|
|
|
|
Ext.QuickTips.init();
|
|
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
|
|
|
|
var resetGrid = function() {
|
|
propStore.load();
|
|
};
|
|
var resetTriggers = function(){
|
|
triggerStore.load();
|
|
};
|
|
|
|
var debugVariablesFilterDynaform = function(){
|
|
propStore.load({params:{filter:'dyn'}});
|
|
};
|
|
|
|
var debugVariablesFilterSystem = function(){
|
|
propStore.load({params:{filter:'sys'}});
|
|
};
|
|
|
|
//center iframe panel
|
|
centerPanel = {
|
|
region : 'center',
|
|
xtype : 'iframepanel',
|
|
frameConfig:{
|
|
name : 'casesSubFrame',
|
|
id : 'casesSubFrame'
|
|
},
|
|
deferredRender: false
|
|
};
|
|
|
|
/**
|
|
* Menu Panel
|
|
*/
|
|
var treeMenuItems = new Ext.tree.TreePanel({
|
|
xtype: 'treepanel',
|
|
height: 350,
|
|
id: 'tree-panel',
|
|
region: 'center',
|
|
margins: '0 0 0 0',
|
|
useArrows : true,
|
|
|
|
animate:true,
|
|
autoScroll: true,
|
|
rootVisible: false,
|
|
clearOnReLoad: false,
|
|
root: new Ext.tree.AsyncTreeNode(),
|
|
useArrows: true,
|
|
|
|
// Our custom TreeLoader:
|
|
loader: new Ext.app.menuLoader({
|
|
dataUrl:'casesMenuLoader',
|
|
clearOnLoad: false
|
|
}),
|
|
|
|
listeners: {
|
|
'click': function(tp) {
|
|
if( tp.attributes.url ){
|
|
document.getElementById('casesSubFrame').src = tp.attributes.url;
|
|
}
|
|
},
|
|
'render': function(tp){}
|
|
}
|
|
});
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
|
|
treeMenuItemsLoaded = true;
|
|
}
|
|
});
|
|
|
|
// 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
|
|
});
|
|
|
|
mainMenu = new Ext.Panel({
|
|
id:'menuTreePanel',
|
|
title: '',
|
|
region: regionTreePanel,
|
|
layout: 'border',
|
|
width: 200,
|
|
height: 500,
|
|
minSize: 175,
|
|
maxSize: 400,
|
|
split: true,
|
|
collapsible: true,
|
|
collapseMode: 'mini',
|
|
margins: '0 0 0 2',
|
|
|
|
items: [
|
|
treeMenuItems
|
|
]
|
|
});
|
|
mainMenu.setTitle("<div style=\"height: 18px;\"><a href=\"javascript:;\"><img id=\"refreshNotifiers\" src=\"/images/refresh.gif\" onclick=\"updateCasesTree(); updateCasesView();\" /></a></div>");
|
|
|
|
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);
|
|
|
|
});
|
|
|
|
/**
|
|
* Triggers Panel
|
|
*/
|
|
var xg = Ext.grid;
|
|
|
|
var reader = new Ext.data.JsonReader(
|
|
{
|
|
root: 'data',
|
|
totalProperty: 'total',
|
|
id: 'name'
|
|
},
|
|
[
|
|
{name: 'name'},
|
|
{name: 'execution_time'},
|
|
{name: 'code'},
|
|
{name: "script_execution_time"}
|
|
]
|
|
);
|
|
|
|
triggerStore = new Ext.data.GroupingStore({
|
|
reader: reader,
|
|
groupField:'execution_time',
|
|
groupDir: 'DESC',
|
|
proxy: new Ext.data.HttpProxy({url: 'debug_triggers?r='+Math.random()})
|
|
});
|
|
|
|
var debugTriggers = new xg.GridPanel({
|
|
id: 'debugTriggers',
|
|
store: triggerStore,
|
|
columns: [
|
|
{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}
|
|
],
|
|
|
|
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) {
|
|
triggerWindow();
|
|
}
|
|
}
|
|
});
|
|
|
|
debugTriggers.getSelectionModel().on('rowselect', function(sm, rowIdx, r) {
|
|
Ext.getCmp('deatachAction').setDisabled(false);
|
|
var detailPanel = Ext.getCmp('debug-details-panel');
|
|
debugTriggersDetailTpl.overwrite(detailPanel.body, r.data);
|
|
detailPanel.setTitle(r.data.name);
|
|
});
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
|
|
debugPanel = new Ext.Panel({
|
|
id:'debugPanel',
|
|
title: _('ID_DEBUG_PANEL_TITLE'),
|
|
region: regionDebug,
|
|
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({
|
|
id: 'debugPanelTabs',
|
|
border: true, // already wrapped so don't add another border
|
|
activeTab: 0, // second tab initially active
|
|
tabPosition: 'top',
|
|
region:'center',
|
|
split: true,
|
|
items: [
|
|
debugVariables,
|
|
debugTriggers
|
|
],
|
|
listeners: {
|
|
beforetabchange: function(){
|
|
Ext.getCmp('deatachAction').setDisabled(true);
|
|
Ext.getCmp('debug-details-panel').html = '';
|
|
},
|
|
tabchange: function (tabpanel, tab) {
|
|
clearItemSelected(tab.id);
|
|
}
|
|
}
|
|
}),
|
|
{
|
|
region: 'south',
|
|
layout: 'fit',
|
|
title: ' ',
|
|
id: 'debug-details-panel',
|
|
autoScroll: true,
|
|
collapsible: false,
|
|
split: true,
|
|
margins: '0 2 2 2',
|
|
cmargins: '2 2 2 2',
|
|
height: 50,
|
|
html: detailsText,
|
|
tbar:[
|
|
'->',
|
|
{
|
|
id: 'deatachAction',
|
|
disabled: true,
|
|
text: _('ID_OPEN_IN_A_NEW_WINDOW'),
|
|
iconCls: 'button_menu_ext ss_sprite ss_application_form',
|
|
handler: function(){
|
|
if( Ext.getCmp('debugPanelTabs').getActiveTab().id === 'debugVariables' ){
|
|
var i,
|
|
store1a = new Ext.data.ArrayStore({fields: result.headers});
|
|
store1a.loadData(result.rows);
|
|
for(i = 0; i < result.columns.length; i += 1){
|
|
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();
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}]
|
|
});
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
var viewport = new Ext.Viewport({
|
|
layout: 'border',
|
|
items: [ mainMenu, centerPanel, debugPanel]
|
|
});
|
|
|
|
/** after panel creation routines */
|
|
var menuPanelC = Ext.getCmp('debugPanel');
|
|
|
|
/**hide*/
|
|
menuPanelC.hide();
|
|
menuPanelC.ownerCt.doLayout();
|
|
//FORMATS.casesListRefreshTime is in seconds
|
|
setTimeout("timer()", parseInt(FORMATS.casesListRefreshTime) * 1000);
|
|
});
|
|
|
|
function updateCasesView(viewList) {
|
|
var refreshList = viewList || false;
|
|
try{
|
|
if (document.getElementById('casesSubFrame').contentWindow.storeCases) {
|
|
if (refreshList) {
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
} catch(e){}
|
|
}
|
|
|
|
function updateCasesTree() {
|
|
document.getElementById('refreshNotifiers').src = '/images/ext/default/grid/loading.gif';
|
|
|
|
itemsTypes = Array('CASES_INBOX', 'CASES_DRAFT', 'CASES_CANCELLED', 'CASES_SENT', 'CASES_PAUSED', 'CASES_COMPLETED', 'CASES_SELFSERVICE');
|
|
|
|
Ext.Ajax.request({
|
|
url: urlProxy + Math.random(),
|
|
success: function (response) {
|
|
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;
|
|
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>';
|
|
} else {
|
|
document.getElementById('NOTIFIER_' + result[i].item).innerHTML = result[i].count;
|
|
}
|
|
}
|
|
else continue;
|
|
}
|
|
document.getElementById('refreshNotifiers').src = '/images/refresh.gif';
|
|
},
|
|
failure: function () {
|
|
},
|
|
params: {'updateCasesTree': true}
|
|
});
|
|
}
|
|
|
|
function timer() {
|
|
if (flagRefresh) {
|
|
updateCasesTree();
|
|
updateCasesView();
|
|
}
|
|
//FORMATS.casesListRefreshTime is in seconds
|
|
setTimeout("timer()", parseInt(FORMATS.casesListRefreshTime) * 1000);
|
|
}
|
|
|
|
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 = [];
|
|
|
|
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);
|
|
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){
|
|
attr.text = attr.blockTitle;
|
|
attr.iconCls = 'ICON_' + attr.id;
|
|
attr.loaded = true;
|
|
//if((attr.url)&&(attr.url!="")){
|
|
// attr.expanded = false;
|
|
//}else{
|
|
attr.expanded = true;
|
|
//}
|
|
}else if(attr.title){
|
|
attr.text = Ext.util.Format.htmlDecode(attr.title);
|
|
|
|
if( attr.cases_count )
|
|
attr.text += ' (<label id="NOTIFIER_'+attr.id+'">' + attr.cases_count + '</label>)';
|
|
|
|
attr.iconCls = 'ICON_' + attr.id;
|
|
attr.loaded = true;
|
|
attr.expanded = attr.expanded ? true : false;
|
|
|
|
} else if(attr.PRO_UID){
|
|
attr.loaded = true;
|
|
attr.leaf = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
var notify = function(title, msg){
|
|
PMExt.notify(title, msg);
|
|
};
|