xBug.stores.Results = new Ext.data.JsonStore({
autoDestroy: true,
autoLoad: false,
url : xBug.config.connector_url,
listeners : {
'metachange' : function(s, meta) {
var cols = [];
var cMeta = s.reader.jsonData.columnMeta;
var colWidth = Math.floor(xBug.grid.Results.getWidth() / cMeta.length);
for (var i = 0; i < cMeta.length; i++) {
cols.push({
header : cMeta[i].header,
dataIndex : cMeta[i].dataIndex,
menuDisabled : true,
width : colWidth
});
}
xBug.grid.ResultsModel.setConfig(cols);
xBug.grid.Results.reconfigure(s, xBug.grid.Results.getColumnModel());
xBug.stores.Explain.loadData(s.reader.jsonData.explain);
xBug.stores.Stats.loadData({stats_rows: [{total : s.reader.jsonData.total,
query : s.reader.jsonData.timers.query,
collector : s.reader.jsonData.timers.collector,
total_collector : s.reader.jsonData.memory.total_collector
}]});
Ext.getCmp('xbug-sql-query').update(s.reader.jsonData.sql);
},
'exception' : function(proxy, response, read, store) {
var e = store.reader.jsonData.error;
Ext.MessageBox.show({
title: _('error')
,msg: _('xbug.error_code') + e.code+'
' + _('xbug.error_info') + e.info
,buttons: Ext.MessageBox.OK
,minWidth: 400
,maxWidth: 750
,modal: false
,width: 600
});
}
}
});
xBug.grid.ResultsModel = new Ext.grid.ColumnModel({
defaults: {
sortable: false,
menuDisabled: true,
resizable : true
},
defaultSortable : false,
});
xBug.grid.Results = new Ext.grid.GridPanel ({
store: xBug.stores.Results,
cm : xBug.grid.ResultsModel,
viewConfig: {
scrollOffset: 0,
emptyText : '0 Results',
forceFit : true
},
autoWidth: true,
height : 100,
frame: false,
title: _('xbug.results'),
id : 'xbug-results-grid',
listeners : {
'cellclick' : function(grid, rowIndex, columnIndex, e){
// Get the Record
var record = grid.getStore().getAt(rowIndex);
for (var key in record.data) {
var obj = record.data[key];
if (obj !== null) {
obj = obj.replace(/</gi, '<');
obj = obj.replace(/>/gi, '>');
}
record.data[key] = obj;
}
var resultGrid = new Ext.grid.PropertyGrid({
title: 'Properties Grid',
autoHeight: true,
source: record.data,
region : 'center'
});
var resultWindow = new Ext.Window({
title: 'Row Data',
closable:true,
width:600,
height:400,
plain:true,
layout: 'border',
items: [resultGrid],
autoScroll : true
});
resultWindow.show();
}
}
});
xBug.stores.Explain = new Ext.data.JsonStore({
autoDestroy: true,
autoLoad: false,
url : xBug.config.connector_url,
listeners : {
'metachange' : function(s, meta) {
var cols = [];
var cMeta = s.reader.jsonData.explainMeta;
var colWidth = Math.floor(xBug.grid.Results.getWidth() / cMeta.length);
for (var i = 0; i < cMeta.length; i++) {
cols.push({
header : cMeta[i].header,
dataIndex : cMeta[i].dataIndex,
menuDisabled : true,
width: colWidth
});
}
xBug.grid.ExplainModel.setConfig(cols);
xBug.grid.Explain.reconfigure(this, xBug.grid.Explain.getColumnModel());
}
}
});
xBug.grid.ExplainModel = new Ext.grid.ColumnModel({
defaults: {
sortable: false,
menuDisabled: true,
resizable : true
},
defaultSortable : false
});
xBug.grid.Explain = new Ext.grid.GridPanel ({
store: xBug.stores.Explain,
cm : xBug.grid.ExplainModel,
viewConfig: {
emptyText : 'No Query processed'
},
autoWidth: true,
autoHeight : true,
frame: false,
title: _('xbug.explain'),
id : 'xbug-explain-grid',
listeners : {
'reconfigure' : function(g, s, c) {
},
'cellclick' : function(grid, rowIndex, columnIndex, e){
// Get the Record
var record = grid.getStore().getAt(rowIndex);
// Get field name
var fieldName = grid.getColumnModel().getDataIndex(columnIndex);
var data = record.get(fieldName);
Ext.MessageBox.show({
title: "Field " + fieldName + " information",
msg: data,
width:600,
buttons: Ext.MessageBox.OK,
animEl: 'mb3'
});
}
}
});
xBug.stores.Stats = new Ext.data.JsonStore({
autoDestroy: true,
autoLoad: false,
url : xBug.config.connector_url,
root : 'stats_rows',
fields : ['total', 'query', 'collector', 'total_collector']
});
xBug.grid.Stats = new Ext.grid.GridPanel ({
store: xBug.stores.Stats,
columns :[{header : _('xbug.row_count'), dataIndex : 'total', sortable : false, width : 120, align: 'right'},
{header : _('xbug.query_time'), dataIndex : 'query', sortable : false, width : 150, align: 'right'},
{header : _('xbug.collection_time'), dataIndex : 'collector', sortable : false, width : 200, align: 'right'},
{header : _('xbug.collection_memory'), dataIndex : 'total_collector', sortable : false, width : 200, align: 'right'}],
viewConfig: {
emptyText : 'No Query processed'
},
autoWidth: true,
autoHeight : true,
frame: false,
title: _('xbug.stats'),
id : 'xbug-stats-grid',
});
xBug.panel.Index = function(config) {
config = config || {};
Ext.apply(config, {
baseCls: 'xbug-formpanel',
cls: 'container',
title : '
' + _('xbug.description') + '
', border: false, }, { header : false, region : 'center', xtype : 'panel', id : 'xbug-center', border: false, padding: '5 5 5 5', flex : 1, width : .5, layout : { type: 'vbox', align : 'stretch' }, defaultMargins : { top : 5, right : 5, bottom : 5, left: 5 }, items : [{ xtype : 'textarea', id : 'xbug-editor-text', name : 'query', flex : 1, hideLabel: true, margin: { top: 5, right: 5, bottom : 5, left: 5 }, value : "<\?php\n\n$crit = $modx->newQuery('modResource');\n" + "$crit->where(array('pagetitle:!=' => 10));\n" + "return $crit;\n" }], tbar : [{ xtype : 'modx-panel', items : [{ 'xtype' : 'query-method-combo', fieldLabel: _('xbug.collector_method'), name: 'method', hiddenName: 'unit', anchor: '100%', }] }], bbar : [{ id : 'xbug-statusbar', xtype : 'toolbar', items : [{ name : 'process', text : _('xbug.process'), handler : this.processEditor }] }] }, { region : 'south', height : 300, split : true, id : 'xbug-south', border: false, items : [{ xtype : 'modx-tabs', items: [ xBug.grid.Results.show(), xBug.grid.Explain.show(), xBug.grid.Stats.show() ] }] }, { region : 'east', split : true, id : 'xbug-east', border : false, autoScroll : true, useSplitTips: true, minWidth : 200, maxWidth: 700, header : false, defaultMargins: { top: 5, right: 5, bottom : 5, left: 5 }, items : [{ xtype : 'panel', border : true, emptyText : 'No query has been processed', id : 'xbug-sql-query', layout : 'fit' }] }] }], listeners : { } }); xBug.panel.Index.superclass.constructor.call(this, config); } Ext.extend(xBug.panel.Index, MODx.Panel, { processEditor : function(b, e) { var q = (Ext.ux.Ace) ? Ext.getCmp('xbug-editor-ace').getValue() : Ext.getCmp('xbug-editor-text').getValue(); xBug.stores.Results.load({ params : { action : 'mgr/xbug/process', 'query' : q, 'collector' : Ext.getCmp('xbug-collector-method').getValue(), 'toJSON' : true }, callback : function(r, op, success) { }, scope : this }) } }); Ext.reg('xbug-panel-index', xBug.panel.Index); xBug.combo.MethodCombo = function(config) { config = config || {}; Ext.applyIf(config,{ store: new Ext.data.ArrayStore({ id: 0 ,fields: ['collector','display'] ,data: [ ['getObject','getObject'] ,['getCollection','getCollection'] ,['getObjectGraph','getObjectGraph'] ,['getCollectionGraph','getCollectionGraph'] ,['SQLQuery','Pure SQL Query'] ] }) ,mode: 'local' ,displayField: 'display' ,valueField: 'collector', listeners : { render : function (field) { field.setValue('getCollection'); } }, width: '200', id : 'xbug-collector-method' }); xBug.combo.MethodCombo.superclass.constructor.call(this, config); } Ext.extend(xBug.combo.MethodCombo,MODx.combo.ComboBox); Ext.reg('query-method-combo', xBug.combo.MethodCombo); Ext.QuickTips.init(); Ext.apply(Ext.QuickTips.getQuickTip(), { maxWidth: 200, minWidth: 100, showDelay: 50, // Show 50ms after entering target trackMouse: true });